Faire un programme "Ceeeeeeee"


95

Une fois, j’écris un programme JavaScript qui prend en entrée une chaîne et un caractère et supprime tous les caractères sauf le premier et le caractère donné en entrée, un par un.

Par exemple, le calcul avec les entrées codegolf.stackexchange.comet epour le caractère donne:

codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceeecom
ceeeom
ceeem
ceee

Il garde le premier caractère et tous es. Tous les autres personnages sont supprimés un par un.

Votre tâche consiste à écrire un programme (ou une fonction) prenant deux entrées et une sortie (ou renvoyant) une chaîne qui accomplit cet effet.

Caractéristiques

  • Vous pouvez supposer que la chaîne ne contiendra aucune nouvelle ligne.
  • La deuxième entrée sera toujours un caractère.
  • Si la réponse est sous la forme d'une fonction, vous pouvez renvoyer un tableau de chaînes contenant chaque ligne de la sortie.
  • La sortie peut contenir un retour à la ligne final.

Cas de test

Test Cases, s:

Test Cases
Tst Cases
Ts Cases
TsCases
Tsases
Tsses
Tsss

Make a "Ceeeeeeee" program, e:

Make a "Ceeeeeeee" program
Mke a "Ceeeeeeee" program
Me a "Ceeeeeeee" program
Mea "Ceeeeeeee" program
Me "Ceeeeeeee" program
Me"Ceeeeeeee" program
MeCeeeeeeee" program
Meeeeeeeee" program
Meeeeeeeee program
Meeeeeeeeeprogram
Meeeeeeeeerogram
Meeeeeeeeeogram
Meeeeeeeeegram
Meeeeeeeeeram
Meeeeeeeeeam
Meeeeeeeeem
Meeeeeeeee

Hello World!, !:

Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!

Hello World!, z:

Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!
H

alphabet, a:

alphabet
aphabet
ahabet
aabet
aaet
aat
aa

upperCASE, e:

upperCASE
uperCASE
uerCASE
ueCASE
ueASE
ueSE
ueE
ue

C'est le , donc le code le plus court (en octets) gagne.


27
Un peu aléatoire, mais +1
TuxCrafting

25
+1 pourMeeeeeeeeegram
FlipTack

Dans le cas où il retourne un tableau, chacun des éléments doit-il inclure un retour à la ligne?
Brad Gilbert b2gills

@ BradGilbertb2gills No.
Esolanging Fruit

4
Meeeeeeeeeeeeem
Mathime

Réponses:


5

V , 12 octets

òYpó.“„a]òd

Essayez-le en ligne!

Hexdump:

00000000: f259 70f3 2e93 8412 615d f264            .Yp.....a].d

J'ai testé cela avec la dernière version de V disponible avant le défi , et tout fonctionne correctement, ce qui rend la réponse compétitive.

Explication:

ò         ò    " Recursively:
 Yp            "   Duplicate this line
   ó           "   Remove:
    .a]      "     A compressed regex
            d  " Delete our extra line

Le regex compressé se traduit par

.\zs[^e]

Ce qui signifie

.           " Any character
 \zs        " Leave the previous character out of the selection
    [^e]    " Any character except for 'e' (Or whatever is given for input)

Version non concurrente (11 octets)

Cette version utilise un raccourci pour Ypcelui qui n'était pas disponible lorsque ce défi a été posté.


@ challenger5 Génial! Je vérifierai une ancienne version et vérifierai qu'elle fonctionne correctement. Je pourrais avoir à le modifier légèrement. Je vais vous cingler une fois que j'ai mis à jour.
DJMcMayhem

@ Challenger5 J'ai modifié la réponse et vérifié que cette version fonctionnait lorsque le défi a été posté.
DJMcMayhem

Comment pourrais-je exécuter un ensemble de commandes Vim stockées dans un fichier sur un système Linux? Aurais-je cat filename | vimou ferais-je autre chose?
ckjbgames

31

Vim, 27, 26 , 25 octets

DJqqYp:s/.\zs[^<C-r>-]<CR>@qq@qD

Essayez-le en ligne!

L'entrée se présente sous ce format:

e
codegolf.stackexchange.com

Ma première approche naïve a trois octets de plus:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd

Je suis également satisfait de cette réponse car elle commence par mon nom.

DJqq:t$|s/.\zs[^<C-r>"]<CR>@qq@qD
DJMcMayhem

Voir la similitude? Hein?

Approches moins réussies:

i:s/.\zs[^<Right>]<Esc>"addqqYp@a@qq@qdd
i:s/.\zs[^<Right>]<CR>@q<Esc>"adkqqYp@aq@qdd
DJ:s/.\zs[^<C-r>"]<CR>uqqYp@:@qq@qdd
DJqq:t.|$s/.\zs[^<C-r>"]<CR>@qq@qdd

Explication:

D                                   " Delete everything on this first line
 J                                  " Remove this empty line
  qq                                " Start recording into register 'q'
    Y                               " Yank this line
     p                              " And paste it
      :s/                           " Run a substitute command on the last line in the buffer. Remove:
         .                          "   Any character
          \zs                       "   Move the selection forward (so we don't delete the first one)
             [^<C-r>-]              "   Followed by anything *except* for the character we deleted
                      <CR>          " Run the command
                          @q        " Call register 'q'
                            q       " Stop recording
                             @q     " Run the recursive macro
                               D    " Delete our extra line

1
Je pense que vous avez une faute de frappe là où l'entrée est donné il y a ktrop :)
geisterfurz007

@ geisterfurz007 Je ne suis pas sûr de comprendre ce que vous voulez dire?
DJMcMayhem

Il est indiqué à la (...)comkligne 5 actuellement.
geisterfurz007

Il n'y a aucune raison d'utiliser :tici. Normal Ypsauverait un octet. Vous devrez passer à <C-R>-bien sûr. Les règles PPCG typiques sont frustrantes, car pour tout test élémentaire raisonnable, :t.|savec 99@:ou même 999@:seraient correctes, mais il n’ya pas de bonne façon d’obtenir une répétition infinie de cette façon. Vous êtes obligé d'utiliser des strats moins intéressants.
dimanche

22

MATL , 20 16 octets

y-f1X-"t[]@X@q-(

Essayez-le en ligne! Ou vérifiez les cas de test: 1 , 2 , 3 , 4 , 5 .

Prime

Code modifié pour voir la chaîne progressivement réduite (compilateur hors ligne):

y-f1X-"tt.3Y.XxD[]@X@q-(].3Y.XxDvx

entrez la description de l'image ici

Ou essayez-le sur MATL Online!

Explication

y        % Implicitly input string and char. Duplicate string onto top
-        % Subtract. Gives nonzero for chars in the input string that are
         % different from the input char
f        % Array of indices of nonzero values
1X-      % Remove 1 from that array. This gives an array of the indices of 
         % chars to be removed from the string
"        % For each
  t      %   Duplicate previous string
  []     %   Push empty array
  @      %   Push index of char to be removed. But this index needs to be 
         %   corrected to account for the fact that previous chars have
         %   already been removed...
  X@q-   %   ... So we correct by subtracting the 0-based iteration index
  (      %   Assign empty array to that position, to remove that char
         % Implicitly end for each
         % Implicitly display

3
GIFS! les gifs sont cool!
Cerveau Guider

20

Haskell, 50 octets

w@(a:x)%c|(d,_:y)<-span(==c)x=w:(a:d++y)%c|0<1=[w]

Définit une fonction (%) renvoyant une liste de chaînes.

Explication

(%)s'appelle comme w%c, avec wétant la chaîne d'entrée et cle caractère à conserver. En bref, cette définition fonctionne en séparant wle premier caractère ( a) et le reste ( x), en scindant xà la première occurrence d’un caractère autre que cet en s’appelant récursivement avec ce caractère supprimé.

w@(a:x)%c              -- define (%) with w separated into a and x.
 |(d,_:y)<-span(==c)x  -- split x; bind the string of `c` to d, and the rest
                       -- to _:y, dropping first character and calling the rest y.
  =w:(a:d++y)%c        -- if there was a character to drop, cons w onto the
                       -- sequence gained by recursively calling (%) with that
                       -- character removed (i.e. call with a:d++y).
 |0<1=[w]              -- if nothing needed to be dropped, the result sequence is
                       -- simply the one-element list [w]

3
Pouvez-vous expliquer le code?
Bli

1
@bli fait! Espérons que cela aide?
dianne

14

Retina , 28 à 27 octets

Le nombre d'octets suppose un codage ISO 8859-1.

;{G*1`
R1r`(?!^|.*¶?\1$)(.)

Essayez-le en ligne!

Explication

;{G*1`

Il y a beaucoup de configuration ici. La scène elle-même est vraiment juste G1`, ce qui ne garde que la première ligne, en supprimant le caractère saisi. *le transforme en essai, ce qui signifie que le résultat (c’est-à-dire la première ligne de la chaîne) est imprimé sans modifier réellement la chaîne. {indique à Retina d'exécuter les deux étapes en boucle jusqu'à ce que la chaîne cesse de changer et ;empêche la sortie à la fin du programme.

R1r`(?!^|.*¶?\1$)(.)

Ceci supprime le premier caractère qui a) n'est pas au début de l'entrée, b) n'est pas égal au caractère d'entrée séparé.


10

Pip , 22 26 24 22 octets

Lv+#Paa@oQb?++oPaRA:ox

Prend chaîne en tant que premier argument de ligne de commande, caractère en second. Essayez-le en ligne!

Explication

Boucle sur les caractères d'entrée; si le caractère est égal au caractère spécial, passez au suivant; sinon, supprimez-le et imprimez la chaîne.

Une version non golfée ( a, bobtenez les arguments de cmdline; ocommence par une valeur de 1, xest ""):

P a         Print a
L #a-1      Loop len(a)-1 times:
 I a@o Q b   If a[o] string-eQuals b:
  ++o         Increment o
 E {         Else:
  a RA: o x   In-place in a, Replace char At index o with x (i.e. delete it)
  P a         Print a
 }

Trucs de golf:

  • L'en-tête de boucle pour Ln'est évalué qu'une seule fois. Nous pouvons donc y insérer l'impression initiale. #Pa-1ne fonctionnera pas car Pest peu prioritaire (il serait analysé en tant que #P(a-1)), mais nous pouvons le réorganiser en v+#Pautilisant la vvariable preinitialized to-1 .
  • L' RA:opérateur renvoie la nouvelle valeur de a, afin que nous puissions imprimer cette expression au lieu d'avoir un séparéPa instruction .
  • Maintenant, les deux branches de l'instruction if sont des expressions uniques. Nous pouvons donc utiliser l'opérateur ternaire ?.

10

Perl 5, 29 octets

J'ai obtenu 35 octets avec Strawberry Perl: 31 octets, plus 1 pour -nEau lieu de -e, plus 3 pour espace + -i(utilisé pour l'entrée à lettre unique; la chaîne la plus longue provient de STDIN).

chomp;say;s/(.)[^$^I]/$1/&&redo

Cependant, je n'ai aucun doute que c'est faisable sans chomp;utiliser <<<, qui est de 29 octets, même si je ne peux pas le tester moi-même avec Strawberry.

say;s/(.)[^$^I]/$1/&&redo

Ainsi:

perl -im -nE'say;s/(.)[^$^I]/$1/&&redo' <<< "example"

Vous pouvez simplement spécifier "pas de saut de ligne dans l'entrée" (c'est ainsi que fonctionne le second programme). Si vous avez absolument besoin de supprimer les nouvelles lignes dans l'entrée, examinez l' -loption, qui active un mode de gestion automatique des nouvelles lignes dans lequel printune nouvelle ligne supplémentaire (non pertinente ici) et -p/ -ninput supprime la nouvelle ligne (très utile). En outre, il est obsolète, mais je pense que vous pouvez remplacer le ^Ipar un contrôle-I littéral pour un octet d'économies supplémentaire. Enfin, je pense que ce s/.\K[^$^I]/redo/eserait un personnage plus court, bien que je ne sois pas sûr à 100% que ce soit un endroit légal pour mettre un redo.

@ ais523, merci pour les conseils de nouvelle ligne, mais je suppose que j'ai déjà assez bien géré le problème. En ^Iréalité, c'est vrai pour la plupart des variables de lettre de contrôle, mais pas celle-ci, IIRC. Re \Ket mettre redodans le remplacement avec /e, merci! Je vais le tester quand j'ai une chance de…
msh210

... et ça ne marche pas. @ ais523
msh210

8

Perl 6 ,  47 40  38 octets

->\a,\b{a,{S/^(."{b}"*:)./$0/}...^{$^a eq $^b}}
->\a,\b{a,{S/^(."{b}"*:)./$0/}...^&[eq]}
{$^b;$^a,{S/^(."$b"*:)./$0/}...^&[eq]}

Étendu:

{       # lambda with two placeholder parameters 「$a」 and 「$b」

  $^b;    # declare second parameter

  $^a,    # declare first parameter, and use it to seed the sequence

  {       # bare block lambda with implicit parameter 「$_」
    S/      # string replace and return
      ^       # beginning of string
      (       # capture into 「$0」
        .       # the first character
        "$b"*   # as many 「$b」 as possible
        :       # don't allow backtracking
      )
      .       # any character ( the one to be removed )

    /$0/      # put the captured values back into place
  }

  ...^      # repeat that until: ( and throw away the last value )

  &[eq]     # the infix string equivalence operator/subroutine

}

La raison a ...^été utilisée à la place de ...est que &[eq]cela ne reviendrait pas Trueavant la répétition de la dernière valeur.


7

05AB1E ,26 25 octets

¬ˆ[¦Ðg_#¬²k0Qi²ˆë¯J?,]¯J?

¬ˆ                         Put the first character into an array
  [                        While true
   ¦                       Remove the first character
    Ð                      Triplicate
     g_#                   if the string is empty, break
        ¬²k0Qi             if the first character is equal to the one specified in the input
              ²ˆ           Add it to the array
                ë          Else
                 ¯J?       Display the array
                    ,      Display the remaining string
                     ]     End while
                      ¯J?  Display the last string

Essayez-le en ligne!

S'il vous plaît noter que ¬²k0Qpourrait être réécrit¬²Q , mais pour une raison quelconque, cela ne fonctionne pas lorsque le caractère actuel est un guillemet: Q renvoie la chaîne réelle au lieu d'un booléen et provoque une boucle infinie.

Ce code peut être joué plus loin car ¯J?est dupliqué. Déplacer cette partie dans la boucle éliminerait la duplication et permettrait également de supprimer le crochet de fermeture.


DˆćUΔD²KRнõ.;DXìˆ}¯¨»pour 21, mais qui utilise de nouvelles commandes.
Urne Octopus Magique

7

Python 2, 71 66 octets:

f,m=input();k=f[0]
while f:a=f[0]==m;k+=f[0]*a;f=f[1+a:];print k+f

Un programme complet. Prend 2 entrées via STDIN dans le format '<String>','<Char>'.

Aussi, voici une solution récursive actuellement à 140 octets :

Q=lambda c,p,k='',j=1,l=[]:c and Q(c[1:],p,k+c[0]*(j<2)+c[0]*(c[0]==p),j+1,l+[k+c])or'\n'.join(sorted({*l},key=l.index))+('\n'+k)*(k not in l)

Celui-ci devrait être appelé dans le format print(Q('<String>','<Char>')).


Je ne suis pas un passionné de python, mais cela ne devrait-il pas imprimer une seule ligne?
Conor O'Brien

@ ConorO'Brien Ouais, j'ai mal lu le message avant. C'est corrigé maintenant.
R. Kap

7

Python 3 , 72 octets

def e(i,k):
 for r in i:
  if r!=k:i=i[0]+i[1:].replace(r,'',1);print(i)

Essayez-le en ligne!

e('😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆','🥓')

Faire un régime:

😋🥕🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🍎🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥑🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥑🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥒🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥔🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🍆🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🍅🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥜🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🥔🍅🍄🍆
😋🥓🥓🥓🥓🍅🍄🍆
😋🥓🥓🥓🥓🍄🍆
😋🥓🥓🥓🥓🍆
😋🥓🥓🥓🥓

6

JavaScript (ES6), 74 octets

(s,c)=>[...t=s.slice(1)].map(d=>c!=d?s+=`
`+s[0]+(t=t.replace(d,``)):s)&&s

Je pense que cela produit une sortie incorrecte pour f('test cases', 's')(se terminant par stss, plutôt que tsss). Je pense que c'est parce que replacesupprime la première occurrence de sorte qu'il supprime la premièret plutôt que la seconde tde la quatrième itération de la mapboucle.
Lmis

@Lmis Merci de l'avoir signalé, je pense que j'ai pu corriger l'une de mes versions pour "seulement" une pénalité de 7 octets.
Neil

5

Ruby, 148 139 97 90 83 77 62 octets

a,c=$*;p s=""+a;i=1;while d=s[i];(d!=c)?(s[i]="";p s):i+=1;end

Vous ne savez pas si le code amateur est accepté pour cet échange, mais je voudrais apprendre à coder le golf bien que je sois terrible, avez-vous de l'aide pour que ce programme paraisse aussi petit que les autres?

MODIFIER:

Place remplacée par p

Suppression d'une tonne d'espaces et comptage correct d'octets grâce à Wheat Wizard

Merci à challenger5 est passé de s=gets.chop;c=gets.chop;às,c=gets.chop,gets.chop;

remplacé thenpar ;et gets.chopavecgets[0] merci Mhutter!

Prendre l’entrée comme variable de ligne de commande maintenant, par exemple. prog.rb helloworld l

Grâce aux nombreuses améliorations apportées par jeroenvisser101 en remplaçant a=s.duppar s=""+aet la déclaration précédente if if s[i]!=c;s[i]="";p s;else i+=1;endavec (d!=c)?(s[i]="";p s):i+=1;une amélioration considérable!


Bienvenue sur le site! Je ne suis pas un expert du golf Ruby, mais on dirait que vous avez plus d’espace. Particulièrement autour du =s. Pour des conseils plus complets, vous pouvez visiter notre page de conseils .
Wheat Wizard,

Le moyen le plus simple de supprimer des octets consiste à éliminer les espaces blancs en excès, par exemple s=gets.chomp. Je ne sais pas si vous pouvez faire cela en Ruby, mais dans certaines langues telles que Python, vous pouvez combiner plusieurs tâches en une seule, comme a,b,c=0,1,2.
Esolanging Fruit

Merci pour le conseil sur les espaces lus dans la documentation Ruby et les points-virgules réalisés peuvent les remplacer pour les déclarations finales: ') comme ça, malheureusement, ils sont définitivement la plus grande partie du code et je voudrais enlever cette longue déclaration ..
Ben Hili

Vous avez encore des espaces en particulier avant les mots-clés ( do, thenet end) et autour du quatrième =.
Wheat Wizard,

On dirait que vous êtes en train de changer vous-même sur le nombre d'octets. Je ne compte que 90 octets moi-même.
Assistant de blé

4

c90, 129 125 octets

avec des espaces:

main(q, x)
{
    for (char **v = x, *a = v[1], *b = a, *c;*b++;)
        for (c = a; c == a | *c == *v[2] && *b != *v[2] && putchar(*c),
            ++c != b || *b != *v[2] && !puts(b););
}

sans espace:

main(q,x){for(char**v=x,*a=v[1],*b=a,*c;*b++;)for(c=a;c==a|*c==*v[2]&&*b!=*v[2]&&putchar(*c),++c!=b||*b!=*v[2]&&!puts(b););}

ungolfed:

#include <stdio.h>
int main(int argc, char **argv)
{
    char *a = argv[1];
    for (char *b = a + 1; *b; b++) {
        if (*b == *argv[2]) {
            continue;
        }
        putchar(*a);
        for (char *c = a + 1; c != b; c++) {
            if (*c == *argv[2]) {
                putchar(*c);
            }
        }
        puts(b);
    }
}

Cela prend un pointeur au début de la chaîne et effectue une boucle en itérant ce pointeur jusqu'à la fin de la chaîne. Dans la boucle, il affiche le premier caractère, puis toutes les occurrences du deuxième argument trouvé entre le début de la chaîne et le pointeur. Après cela, il appelle met sur le pointeur, imprimant le reste de la chaîne.

Cela doit être compilé sur un système où sizeof (int) == sizeof (char *). +3 octets sinon.

C’est la première fois que j’ai essayé le golf de code ici, alors je suis sûr que des optimisations sont nécessaires.


3

Dyalog APL , 27 octets

{×i←⊃1+⍸⍺≠1↓⎕←⍵:⍺∇⍵/⍨i≠⍳≢⍵}

est le caractère exclu, est la chaîne initiale

argument d'impression; trouve l'index idu premier non après le premier caractère; si trouvé, appelle récursivement avec ienlevé


3

Mathematica, 64 octets

Most@FixedPointList[StringReplace[#,b_~~Except@a:>b,1]&,a=#2;#]&

Fonction anonyme. Prend deux chaînes en entrée et renvoie une liste de chaînes en sortie. Fonctionne en supprimant à plusieurs reprises la première non-instance du caractère.


Je vais certainement commencer à utiliser FixedPointList.
ngenisis

3

PHP, 88 84 86 85 82 81 78 octets

1 octet enregistré grâce à @IsmaelMiguel, 3 octets grâce à @ user59178, 3 octets inspiré de @ user59178

while($b=substr("$argv[1]\n",$i++))$a>""&$b[0]!=$argv[2]?print$a.$b:$a.=$b[0];

prend les arguments de la ligne de commande; courir avecphp -r <code> '<string>' <character>


  • ajoute une nouvelle ligne à l'entrée pour une impression finale implicite.
    Cela ajoute 5 à 4 octets de code, mais enregistre sur la sortie et un supplémentaire echo$a;.

1
$argv[1]."\n"peut être écrit comme"$argv[1]\n"
Ismael Miguel

1
Au fur et à mesure $bque la nouvelle ligne est ajoutée, elle sera toujours vraie si elle a une longueur> = 1. En tant que telle, elle ""<est inutile.
user59178

Vous pouvez sauvegarder un autre octet en utilisant un ternaire substr()plutôt que d’attribuer $b.
user59178

@ user59178 Je ne vous ai pas vraiment compris: j'ai besoin du substrrésultat à la fois pour l'état et le print; donc je devrais l'assigner quelque part. Mais tu m'as inspiré.
Titus

Je voulais dire, for(;$b=substr($b?:".$argv[1]\n",1);)mais ce que vous avez encore mieux maintenant.
user59178

3

05AB1E, 26 24 23 octets

Merci @Kade pour 2 octets!
Merci @ Emigna pour 1 octet!

¬UDvy²k0Êiy¡¬s¦yý«Xs«=¦

Utilise le codage CP-1252 . Essayez-le en ligne!

y²k0Êpourrait être y²Êmais le" bousille.

Cela pourrait probablement être plus joué au golf parce que «se répète deux fois. S'il vous plaît laissez un commentaire si vous avez des suggestions ou des moyens de jouer plus bas.


3

Java 10, 155 140 139 124 octets

c->s->{var r=s+"\n";for(int i=0;++i<s.length();)if(s.charAt(i)!=c)r+=(s=s.substring(0,i)+s.substring(i--+1))+"\n";return r;}

Essayez-le en ligne.

Explication:

c->s->{          // Method with character and String parameters and String return-type
  var r=s+"\n";  //  Result-String, starting at the input-String with trailing new-line
  for(int i=0;++i<s.length();)
                 //  Loop over the characters of the String, skipping the first
    if(s.charAt(i)!=c)
                 //   If the current character and the input-character are equal
      r+=(s=s.substring(0,i)+s.substring(i--+1))
                 //     Remove this character from the String `s`
         +"\n";  //     And append the new `s` with trailing new-line to the result-String
  return r;}     //  Return the result-String

Ancien réponse récursive de 139 octets:

void c(String s,int c){System.out.println(s);for(int i=1;i<s.length();)if(s.charAt(i++)!=c){c(s.substring(0,i-1)+s.substring(i),c);break;}}

-1 octet grâce à @Eugene . (La prochaine fois, faites un commentaire au lieu de modifier le post de quelqu'un d'autre, s'il vous plaît.)

Essayez-le en ligne.

Explication:

void c(String s,int c){     // Method with String and integer parameters and no return-type
  System.out.println(s);    //  Print the input-String with trailing new-line
  for(int i=1;i<s.length();)//  Loop over the characters of the String, skipping the first
    if(s.charAt(i++)!=c){   //   If the current character and the input-character are equal
      c(s.substring(0,i-1)+s.substring(i),c); 
                            //    Remove this character, and do a recursive call
      break;}}              //    And stop the loop

Ne serait-il pas beaucoup plus court de ne pas s'embêter avec un caractère [], et d'utiliser simplement s.charAt ()?
dpa97

@ dpa97 Ah, tu as tout à fait raison. J'ai d'abord utilisé une boucle foreach, mais je l'ai changée en boucle for normale. J'ai oublié de retirer le tableau de caractères. Merci.
Kevin Cruijssen

2

C #, 122 117 112 octets

IEnumerable F(string s,char c){for(int i=0;i<s.Length;++i)if(i<1||s[i]!=c)yield return i>0?s=s.Remove(i--,1):s;}

Ungolfed:

public IEnumerable F(string s, char c) {
    for (int i = 0; i < s.Length; ++i) {
        if (i < 1 || s[i] != c)
            yield return i > 0 ? s = s.Remove(i--, 1) : s;
    }
}

Renvoie une collection de chaînes.


1
Belle astuce avec l'utilisation de collection non générique. Mais cela ne fonctionnera pas si le dernier caractère n'est pas un caractère spécial c. Dans ce cas, la boucle tentera de fonctionner pour toujours.
Paldir

1
@paldir Woops, vous avez raison! En tournant mon cerveau à ce moment-là, j'ai trouvé un moyen meilleur (et plus court!).
Psycho

Vous pouvez supprimer les parenthèses de la boucle for pour économiser 2 octets.
PmanAce

@PmanAce Désolé, que voulez-vous dire? Quelle parenthèse?
psychopathe

public IEnumerable F (chaîne s, car c) {pour (int i = 0; i <longueur s; ++ i) si (i <1 || s [i]! = c) retourne i> 0? s = enlèvement (i--, 1): s; }
PmanAce

2

TSQL, 127 octets (à l'exclusion des définitions de variables)

DECLARE @1 VARCHAR(100)='codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'

DECLARE @ char=LEFT(@1,1)WHILE patindex('%[^'+@2+']%',@1)>0BEGIN SET @1=STUFF(@1,patindex('%[^'+@2+']%',@1),1,'')PRINT @+@1 END

Formaté:

DECLARE @1 VARCHAR(100) = 'codegolf.stackexchange.com'
DECLARE @2 CHAR(1) = 'o'
DECLARE @ CHAR = LEFT(@1, 1)

WHILE patindex('%[^' + @2 + ']%', @1) > 0
BEGIN
    SET @1 = STUFF(@1, patindex('%[^' + @2 + ']%', @1), 1, '')

    PRINT @ + @1
END

Bonne utilisation de patindex, mais l' alphabetexemple ne semble pas tout à fait correct, il s'affiche en aaphabetbas aaa. Il convient également de mentionner que cette opération doit être exécutée sur un serveur ou une base de données avec un classement sensible à la casse, sinon l' upperCASEexemple échoue également et s'affiche ueEsur sa dernière ligne.
BradC

2

C #, 135 138 :( 137 octets

Golfé:

IEnumerable<string>F(string s,char c){int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i==l)break;s=s.Remove(i,1);}}

Ungolfed:

    IEnumerable<string> F(string s, char c)
    {
        int i = 1, l;

        for (;;)
        {
            yield return s;

            l = s.Length;

            while (i < l && s[i] == c)
                i++;

            if (i == l)
                break;

            s = s.Remove(i, 1);
        }
    }

La fonction retourne la collection de chaînes.

EDIT1: @psycho a remarqué que l’algorithme n’était pas implémenté correctement.

EDIT2: Variable créée pour s.Length. Un octet enregistré grâce à @TheLethalCoder.


1
Ne fonctionnera pas si le caractère d'entrée est présent plus d'une fois dans une rangée. Ex: codeegolf edonnerait ceau lieu de cee.
Psycho

@ psycho j'ai échangé ifavec whileet cela fonctionne.
Paldir

Meilleur ! Mais ça peut être plus court. Je posterai le mien!
Psycho

1
Créez une variable pour s.Lengthsauvegarder un octet:int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i>=l)break;s=s.Remove(i,1);}}
TheLethalCoder

2

Python 2 - 65 73 octets

lambda s,c:[s[0]+c*s[1:i].count(c)+s[i+1:]for i in range(len(s))]

Et une solution récursive de 76 octets , car même si elle est plus longue que la première, je l’aime mieux:

f=lambda s,c,i=1:s[i:]and[[s]+f(s[:i]+s[i+1:],c,i),f(s,c,i+1)][s[i]==c]or[s]

2

Raquette 194 octets

(let p((s s)(n 1)(t substring)(a string-append))(displayln s)(cond[(>= n(string-length s))""]
[(equal? c(string-ref s n))(p(a(t s 0 n)(t s n))(+ 1 n)t a)][else(p(a(t s 0 n)(t s(+ 1 n)))n t a)]))

Ungolfed:

(define (f s c)
  (let loop ((s s)
             (n 1))
    (displayln s)
    (cond
      [(>= n (string-length s))""]
      [(equal? c (string-ref s n))
       (loop (string-append (substring s 0 n) (substring s n))
             (add1 n))]
      [else
       (loop (string-append (substring s 0 n) (substring s (add1 n)))
             n)])))

Essai:

(f "Test cases" #\s)
(f "codegolf.stackexchange.com" #\e)

Sortie:

Test cases
Tst cases
Tst cases
Ts cases
Tscases
Tsases
Tsses
Tsses
Tsss
Tsss
""
codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceee.com
ceeecom
ceeeom
ceeem
ceee
""

2

JavaScript (ES6), 64 69

Renvoyer une seule chaîne avec des nouvelles lignes

s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s

F=
s=>c=>[...s].map((x,i,z)=>i&&x!=c&&(z[i]='',s+=`
`+z.join``))&&s
  

function update() {
  var s=S.value,c=C.value[0]
  O.textContent=F(s)(c)
}

update()
<input id=S value='Hello world!' oninput='update()'>
<input id=C value='!' oninput='update()'>
<pre id=O></pre>


Légèrement étrange en ce sens qu'il ne prend pas deux arguments mais un argument et renvoie ensuite une autre fonction où vous devez donner le deuxième argument. Je ne suis pas sûr que c'était le comportement attendu.
MT0

@ MT0 C'est étrange, mais c'est accepté pour une fonction à 2 arguments, car cela économise 1 octet. Je te donnerai une référence quand j'en trouverai une. C'est ici meta.codegolf.stackexchange.com/a/8427/21348
edc65

Excellente technique, je n'avais pas réalisé que la modification du troisième argument .mapétait cumulative. J'ai vu le .map().filter()et j'ai pensé "Cela ferait une grande compréhension de tableaux!", Mais le manque d'index dans les compréhensions de tableaux l'a tué et il s'est retrouvé à la même longueur: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](au fait, je compte 68 octets pour tout cela.)
ETHproductions

1
En fait, en réorganisant les paramètres, vous pouvez obtenir une compréhension du tableau jusqu'à 66:([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
ETHproductions

@ETHproductions ne peuvent pas croire que je me suis trompé en nombre d'octets à nouveau . Quoi qu'il en soit, merci de me faire penser à nouveau, alors j'ai 64 avec ES6 standard
edc65

2

Swift 3 - 151 147 octets

Swift n'est pas la langue idéale pour le golf, en particulier en ce qui concerne l'indexation des cordes. C'est le mieux que j'ai pu faire:

func c(a:String,b:String){print(a);var q=Array(a.characters),i=1;while i<q.count{if "\(q[i])" != b{q.remove(at:i);c(a:String(q),b:b);break};i=i+1}}

Malheureusement, Swift a besoin d'espace !=(mais pas pour ==), et Swift 3 a abandonné l' ++opérateur. L'astuce pour ces deux méthodes consiste à convertir en un tableau de caractères permettant l'indexation d'entiers et l'utilisation de l'interpolation de chaîne d'un caractère pour reconvertir en String("\(c)" ).

Ungolfed:

func c(a:String, b:String) {
    print(a)
    var q = Array(a.characters)
    var i = 1
    while i < q.count {
        if "\(q[i])" != b {
            q.remove(at:i)
            c(a: String(q), b: b)
            break
        }
        i=i+1
    }
}

Solution précédente, non récursive

func c(a:String,b:String){var q=Array(a.characters),e={q.removeFirst()},z="\(e())";print(a);while !q.isEmpty{"\(e())"==b ? z=z+b : print(z+String(q))}}
func c(a:String, b:String) {
    var q = Array(a.characters)
    var z = "\(q.removeFirst())"
    print(a)
    while !q.isEmpty {
        if "\(q.removeFirst())" == b {
            z = z + b
        }else{
            print(z + String(q))
        }
    }
}

Bienvenue chez PPCG! Peut-on supprimer certains des espaces vers la fin du code?
ETHproductions

@ETHproductions malheureusement pas, l'opérateur ternaire et les whileespaces nécessaires à compiler. J'ai aussi joué avec le dactylographie Stringet essayer de régler print, mais ils n'ont pas économisé de place.
Rabidaudio

2

Pyke, 26 19 17 octets

jljjhF3<Q/Q*jih>s

Essayez-le ici!

                  - Q = input
j                 - j = input_2
 ljjhF3           - for (i, j, j[0]) for i in range(len(j))
       <          -     j[:i]
        Q/        -    ^.count(Q)
          Q*      -   ^*Q
                s -  sum(j[0], ^, V)
            jih>  -   j[i+1:]

Pourriez-vous ajouter une explication?
Esolanging Fruit

@ Challenger5 fait et joué au golf 2 octets!
Blue

1

Mathematica, 78 octets

Bon sang Martin Ender, j'étais presque premier: p

(i=2;a={c=#};While[i<=Length@c,If[c[[i]]==#2,i++,c=c~Drop~{i};a=a~Append~c]];a)&

Fonction non nommée; mise en œuvre simple avec une Whileboucle et quelques variables temporaires.


Oh, allez, nous savons tous les deux que Mathematica n'est pas impératif
LegionMammal978

1
<agite un drapeau blanc>
Greg Martin

1

JavaScript ES6, 89 octets

Je pensais que ce serait un défi facile, mais je suis à peu près sûr que je manque quelque chose ici ..

Utilise la récursivité et renvoie un tableau de chaînes

(c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

F=
  (c,i=1,r)=>f=a=>a[i]?a[i++]==c?f(a):f(g=a.slice(0,i-1)+a.slice(i--),(r=r||[a]).push(g)):r

G=_=>A.value.length>1 && (O.innerHTML = F(E.value)(A.value).join`
`)

G()
<input id=A oninput='G()' value='alphabet'>
<input id=E oninput='G()' value='a'>
<pre id=O>


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.