Crea un programma "Ceeeeeeee"


95

Una volta ho scritto un programma JavaScript che avrebbe preso come input una stringa e un carattere e avrebbe rimosso tutti i caratteri tranne il primo e il carattere indicato come input, uno per uno.

Ad esempio, calcolandolo con input codegolf.stackexchange.come eper i rendimenti dei caratteri:

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

Mantiene il primo personaggio e tutti ei personaggi . Tutti gli altri personaggi vengono rimossi uno per uno.

Il tuo compito è scrivere un programma (o una funzione) che accetta due input e output (o restituisce) una stringa che realizza questo effetto.

specificazioni

  • Puoi presumere che la stringa non conterrà alcuna nuova riga.
  • Il secondo input sarà sempre un carattere.
  • Se la risposta ha la forma di una funzione, è possibile restituire una matrice di stringhe contenente ciascuna riga nell'output.
  • L'output può contenere una nuova riga finale.

Casi 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

Questo è , quindi vince il codice più breve (in byte).


27
Un po 'casuale, ma +1
TuxCrafting

25
+1 perMeeeeeeeeegram
FlipTack

Nel caso in cui restituisca un array, ciascuno degli elementi deve includere una nuova riga finale?
Brad Gilbert b2gills

@ BradGilbertb2gills No.
Esolanging Fruit,

4
Meeeeeeeeeeeeem
Mathime,

Risposte:


5

V , 12 byte

òYpó.“„a]òd

Provalo online!

hexdump:

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

Ho provato questo con l'ultima versione di V disponibile prima della sfida e tutto funziona correttamente, rendendo questa risposta competitiva.

Spiegazione:

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

Il regex compresso si traduce in

.\zs[^e]

Che significa

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

Versione non competitiva (11 byte)

Questa versione utilizza un collegamento Ypche non era disponibile al momento della pubblicazione della sfida.


@ challenger5 Fantastico! Controllerò una versione precedente e verificherò che funzioni correttamente. Potrei doverlo modificare leggermente. Ti chiamerò dopo averlo aggiornato.
DJMcMayhem

@ Challenger5 Ho modificato la risposta e verificato che questa versione funzionasse quando è stata pubblicata la sfida.
DJMcMayhem

Come eseguirò un gruppo di comandi Vim memorizzati in un file su un sistema Linux? Vorrei cat filename | vimo farei qualcos'altro?
ckjbgames,

31

Vim, 27, 26 , 25 byte

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

Provalo online!

L'input è disponibile in questo formato:

e
codegolf.stackexchange.com

Il mio primo approccio ingenuo è più lungo di tre byte:

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

Sono anche contento di questa risposta perché inizia con il mio nome.

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

Vedi la somiglianza? Eh?

Approcci meno efficaci:

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

Spiegazione:

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
Penso che tu abbia un errore di battitura in cui viene dato l'input ce n'è ktroppo :)
geisterfurz007

@ geisterfurz007 Non sono sicuro di capire cosa intendi?
DJMcMayhem

Al momento dice (...)comkIn linea 5.
geisterfurz007,

Non c'è motivo di usare :tqui. Normale Ypsalverebbe un byte. Dovrai passare a <C-R>-ovviamente. Le regole tipiche di PPCG sono frustranti, perché per qualsiasi caso di test ragionevole, :t.|scon 99@:o addirittura 999@:sarebbe corretto, ma non c'è un buon modo per ottenere una ripetizione infinita in quel modo. Sei costretto a usare strat meno interessanti.
udioica,

22

MATL , 20 16 byte

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

Provalo online! Oppure verifica i casi di test: 1 , 2 , 3 , 4 , 5 .

indennità

Codice modificato per vedere la stringa essere gradualmente ridotta (compilatore offline):

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

inserisci qui la descrizione dell'immagine

Oppure provalo su MATL Online!

Spiegazione

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! le gif sono fantastiche!
Brain Guider,

20

Haskell, 50 byte

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

Definisce una funzione che (%)restituisce un elenco di stringhe.

Spiegazione

(%)viene chiamato come w%c, wessendo la stringa di input e cil carattere da conservare. In breve, questa definizione funziona separando wil primo carattere ( a) e il resto ( x), dividendosi xalla prima occorrenza di un carattere diverso da c, e chiamandosi ricorsivamente con quel carattere lasciato cadere.

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
Puoi spiegare il codice?
bli

1
@bli Fatto! Spero che questo aiuti?
Dianne,

14

Retina , 28 27 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

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

Provalo online!

Spiegazione

;{G*1`

C'è molta configurazione qui. Lo stage in sé è davvero giusto G1`, che mantiene solo la prima riga, scartando il carattere di input. *lo trasforma in una sequenza a secco, il che significa che il risultato (ovvero la prima riga della stringa) viene stampato senza effettivamente cambiare la stringa. {dice a Retina di eseguire entrambe le fasi in un ciclo fino a quando la stringa smette di cambiare e ;impedisce l'output alla fine del programma.

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

Questo scarta il primo carattere che a) non è all'inizio dell'input, b) non è uguale al carattere di input separato.


10

Pip , 22 26 24 22 byte

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

Accetta la stringa come primo argomento della riga di comando, il carattere come secondo. Provalo online!

Spiegazione

Passa sopra i caratteri di input; se il personaggio è uguale al personaggio speciale, passa al successivo; in caso contrario, eliminalo e stampa la stringa.

Una versione non controllata ( a, bget cmdline args; oinizia con un valore di 1, xè ""):

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
 }

Trucchi per il golf:

  • L'intestazione del ciclo per Lviene valutata solo una volta, quindi possiamo intrufolarci nella stampa iniziale. #Pa-1non funzionerà perché ha Puna precedenza bassa (analizzerebbe come #P(a-1)), ma possiamo riorganizzarlo in v+#Pa, usando la vvariabile preinizializzata in -1.
  • L' RA:operatore restituisce il nuovo valore di a, quindi possiamo stampare quell'espressione invece di avere Paun'istruzione separata .
  • Ora entrambi i rami dell'istruzione if sono espressioni singole, quindi possiamo usare ?invece l' operatore ternario .

10

Perl 5, 29 byte

Ho ottenuto 35 byte usando Strawberry Perl: 31 byte, più 1 per -nEinvece di -e, più 3 per spazio + -i(usato per l'inserimento di una sola lettera; la stringa più lunga proviene da STDIN).

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

Tuttavia, non ho dubbi che questo sia fattibile senza chomp;usare <<<, che è di 29 byte, anche se non posso testarlo da solo con Strawberry.

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

Così:

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

Puoi semplicemente specificare "nessuna nuova riga nell'input" (che è come funziona il secondo programma). Se è necessario rimuovere le nuove righe nell'input, esaminare l' -lopzione, che attiva una modalità di gestione automatica delle newline in cui printstampa una nuova riga (non pertinente qui) e -p/ -ninput rimuove la nuova riga (molto rilevante). Inoltre, è deprecato, ma penso che puoi sostituirlo ^Icon un controllo letterale-I per un ulteriore byte di risparmio. Infine, penso che s/.\K[^$^I]/redo/esarebbe un personaggio più corto, anche se non sono sicuro al 100% che sia un posto legale dove mettere un redo.

@ ais523, grazie per il consiglio newline, ma credo di aver già risolto il problema abbastanza bene. In senso letterale ^I, questo è vero per la maggior parte delle variabili della lettera di controllo, ma non per questa, IIRC. Ri \Ke redosostituendo con /e, grazie! Lo proverò quando avrò la possibilità di ...
msh210

... e non funziona. @ ais523
msh210

8

Perl 6 ,  47 40  38 byte

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

Allargato:

{       # 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

}

Il motivo è ...^stato usato al posto di ...è che &[eq]non sarebbe tornato Truefino alla ripetizione dell'ultimo valore.


7

05AB1E ,26 25 byte

¬ˆ[¦Ð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

Provalo online!

Si noti che ¬²k0Qpotrebbe essere riscritto ¬²Q, ma per qualche motivo non funziona quando il carattere corrente è un segno di virgolette: Q restituisce la stringa effettiva anziché un valore booleano e provoca un ciclo infinito.

Questo codice può essere ulteriormente golfato poiché ¯J?è duplicato. Lo spostamento di questa parte nel loop rimuove la duplicazione e consentirebbe anche di eliminare la parentesi quadra di chiusura.


DˆćUΔD²KRнõ.;DXìˆ}¯¨»per 21, ma che utilizza nuovi comandi.
Magic Octopus Urn

7

Python 2, 71 66 byte:

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

Un programma completo. Accetta 2 input tramite STDIN nel formato '<String>','<Char>'.

Inoltre, ecco una soluzione ricorsiva attualmente a 140 byte :

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)

Questo dovrebbe essere chiamato nel formato print(Q('<String>','<Char>')).


Non sono un appassionato di Python, ma questa stampa non dovrebbe essere solo una riga?
Conor O'Brien,

@ ConorO'Brien Sì, ho letto male il post prima. Ora è riparato.
R. Kap,

7

Python 3 , 72 byte

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

Provalo online!

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

A dieta:

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

6

JavaScript (ES6), 74 byte

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

Penso che questo produca un output errato per f('test cases', 's')(terminando con stss, piuttosto che tsss). Penso che questo sia perché replacerimuove la prima occorrenza in modo che rimuova la prima tinvece della seconda tnella quarta iterazione del mapciclo.
Lmis,

@Lmis Grazie per averlo sottolineato, penso di essere stato in grado di correggere una delle mie versioni per "solo" una penalità di 7 byte.
Neil,

5

Rubino, 148 139 97 90 83 77 62 byte

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

Non sei sicuro che il codice amatoriale sia accettato in questo scambio, ma sono interessato a imparare a programmare il golf, anche se sono terribile, qualche aiuto su come farei sembrare questo programma piccolo come gli altri qui?

MODIFICARE:

Sostituito mette con p

Rimossa una tonnellata di spazi bianchi e contati correttamente i byte grazie a Wheat Wizard

Grazie a Challenger5 è passato da s=gets.chop;c=gets.chop;as,c=gets.chop,gets.chop;

sostituito thencon ;e gets.chopcon gets[0]grazie Mhutter!

Prendendo ora input come variabili della riga di comando, ad es. prog.rb helloworld l

Grazie ai numerosi miglioramenti apportati da jeroenvisser101 in sostituzione a=s.dupdi s=""+ae la precedente dichiarazione if if s[i]!=c;s[i]="";p s;else i+=1;endcon (d!=c)?(s[i]="";p s):i+=1;enorme miglioramento!


Benvenuti nel sito! Non sono un esperto nel golf di Ruby ma sembra che tu abbia uno spazio extra. Soprattutto intorno alla =s. Per suggerimenti più completi puoi visitare la nostra pagina dei suggerimenti .
Wheat Wizard

Ad esempio, il modo più semplice per rimuovere i byte è eliminare gli spazi bianchi in eccesso s=gets.chomp. Non sono sicuro che puoi farlo in Ruby ma in alcune lingue come Python puoi combinare più assegnazioni in un'unica istruzione, come a,b,c=0,1,2.
Esolanging Fruit,

Ehi, grazie per il suggerimento sugli spazi bianchi, leggi la documentazione su Ruby e i punti e virgola realizzati possono sostituirli per le dichiarazioni finali: ') per quanto riguarda la creazione di s = gets.chop ec c = gets.chop non posso fare s, c = gets.chop o altro così purtroppo sono sicuramente la parte più grande del codice e vorrei rimuovere quella lunga dichiarazione ..
Ben Hili,

Hai ancora degli spazi extra, in particolare prima delle parole chiave ( do, thene end) e intorno al quarto =.
Wheat Wizard

Sembra che tu stia cambiando te stesso sul conteggio dei byte. Conto solo 90 byte da solo.
Wheat Wizard

4

c90, 129 125 byte

con spazi bianchi:

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););
}

senza spazi bianchi:

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);
    }
}

Questo prende un puntatore all'inizio della stringa e lo fa ciclicamente, ripetendo questo puntatore fino a raggiungere la fine della stringa. All'interno del ciclo, stampa il primo carattere, quindi tutte le istanze del secondo argomento che trova tra l'inizio della stringa e il puntatore. Dopodiché, chiama posiziona il puntatore, stampando il resto della stringa.

Questo deve essere compilato su un sistema in cui sizeof (int) == sizeof (char *). +3 byte altrimenti.

Questa è la prima volta che ho provato il golf a codice qui, quindi sono sicuro che ci sono alcune ottimizzazioni da apportare.


3

Dyalog APL , 27 byte

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

è il carattere escluso, è la stringa iniziale

argomento di stampa; trova l'indice idel primo non- dopo il primo carattere; se trovato, chiama ricorsivamente con irimosso


3

Mathematica, 64 byte

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

Funzione anonima. Accetta due stringhe come input e restituisce un elenco di stringhe come output. Funziona rimuovendo ripetutamente la prima non istanza del personaggio.


Inizierò sicuramente a utilizzare FixedPointList.
ngenisis,

3

PHP, 88 84 86 85 82 81 78 byte

1 byte salvato grazie a @IsmaelMiguel, 3 byte grazie a @ user59178, 3 byte ispirati a @ user59178

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

accetta input dagli argomenti della riga di comando; Corri conphp -r <code> '<string>' <character>


  • aggiunge una nuova riga all'input per una stampa finale implicita.
    Ciò aggiunge 5 4 byte di codice, ma salva l'output e un ulteriore echo$a;.

1
$argv[1]."\n"può essere scritto come"$argv[1]\n"
Ismael Miguel,

1
Come $bviene aggiunta una nuova riga ad essa sarà sempre per la verità fintanto che ha lunghezza> = 1. In quanto tale, ""<non è necessario.
user59178

È possibile salvare un altro byte utilizzando un ternario substr()anziché assegnarlo $b.
user59178

@ user59178 Non ti ho davvero catturato lì: ho bisogno del substrrisultato sia per la condizione che per il print; quindi dovrei assegnarlo da qualche parte. Ma mi hai ispirato.
Tito

Intendevo, for(;$b=substr($b?:".$argv[1]\n",1);)ma quello che hai ora ancora meglio.
user59178

3

05AB1E, 26 24 23 byte

Grazie @Kade per 2 byte!
Grazie @Emigna per 1 byte!

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

Utilizza la codifica CP-1252 . Provalo online!

y²k0Êpotrebbe essere y²Êma il "disastro.

Questo probabilmente potrebbe essere giocato di più perché «è ripetuto due volte. Si prega di lasciare un commento se avete suggerimenti o modi per golf più giù.


3

Java 10, 155 140 139 124 byte

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;}

Provalo online.

Spiegazione:

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

Vecchia risposta ricorsiva a 139 byte:

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 byte grazie a @Eugene . (La prossima volta fai un commento invece di modificare il post di qualcun altro, per favore.)

Provalo online.

Spiegazione:

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

Non sarebbe molto più breve non preoccuparsi di un char [] e usare semplicemente s.charAt ()?
dpa97,

@ dpa97 Ah, hai perfettamente ragione. All'inizio ho usato un ciclo foreach, ma l'ho cambiato in un normale ciclo for. Hai dimenticato di rimuovere il char-array. Grazie.
Kevin Cruijssen,

2

C #, 122 117 112 byte

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;
    }
}

Restituisce una raccolta di stringhe.


1
Bel trucco con l'utilizzo di una raccolta non generica. Ma non funzionerà se l'ultimo carattere non è un carattere speciale c. In tal caso il ciclo proverà a funzionare per sempre.
paldir,

1
@paldir Woops, hai ragione! Accendendo il cervello questa volta, ho trovato un modo migliore (e più breve!).
psicopatico,

È possibile rimuovere la parentesi del ciclo for per salvare 2 byte.
PmanAce,

@PmanAce Siamo spiacenti, cosa intendi? Quale parentesi?
psicopatico,

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

2

TSQL, 127 byte (escluse le definizioni delle variabili)

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

formattato:

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

Buon uso di patindex, ma l' alphabetesempio non sembra del tutto corretto, viene visualizzato in aaphabetbasso aaa. Vale anche la pena ricordare che questo dovrebbe essere eseguito su un server o un database con regole di confronto sensibili al maiuscolo / minuscolo, altrimenti anche l' upperCASEesempio fallisce, visualizzando ueEl'ultima riga.
BradC,

2

C #, 135 138 :( 137 byte

golfed:

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 funzione restituisce una raccolta di stringhe.

EDIT1: @psycho ha notato che l'algoritmo non è stato implementato correttamente.

EDIT2: variabile creata per s.Length. Un byte salvato grazie a @TheLethalCoder.


1
Non funzionerà se il carattere di input è presente più di una volta di seguito. Es: codeegolf edarebbe ceinvece di cee.
psicopatico,

@psycho ho scambiato ifcon whilee funziona.
paldir,

Meglio ! Ma può essere più breve. Pubblicherò il mio!
psicopatico,

1
Creare una variabile per s.Lengthsalvare un byte: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 byte

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

E una soluzione ricorsiva di 76 byte , perché nonostante sia più lunga di quella iniziale, mi piace un po 'meglio:

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

Racchetta 194 byte

(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)])))

test:

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

Produzione:

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

Restituzione di una singola stringa con newline

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>


Leggermente strano in quanto non accetta due argomenti ma un argomento e quindi restituisce un'altra funzione in cui è necessario fornire il secondo argomento. Non sono sicuro che questo fosse il comportamento previsto.
MT0

@ MT0 I è strano ma è accettato per una funzione con 2 argomenti, in quanto salva 1 byte. Ti darò un riferimento quando ne trovo uno. Eccolo qui meta.codegolf.stackexchange.com/a/8427/21348
edc65

Ottima tecnica, non mi rendevo conto che modificare il terzo argomento .mapfosse cumulativo. Ho visto .map().filter()e ho pensato "Questo renderebbe una grande comprensione dell'array!", Ma la mancanza di indice nelle comprensioni dell'array lo ha ucciso e si è concluso alla stessa lunghezza: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](tra l'altro, conto 68 byte per tutti questi.)
ETHproductions

1
In realtà, riorganizzando i parametri è possibile ottenere una comprensione dell'array fino a 66:([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
ETHproductions

@ETHproductions non riesce a credere di aver sbagliato di nuovo nel conteggio dei byte . Comunque, grazie a farmi ripensarci, quindi ho 64 con lo standard ES6
edc65

2

Swift 3 - 151 147 byte

Swift non è la lingua ideale per giocare a golf, in particolare per quanto riguarda l'indicizzazione delle stringhe. Questo è il meglio che potrei fare:

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}}

Sfortunatamente, Swift ha bisogno di spazi intorno !=(ma non per ==) e Swift 3 ha lasciato cadere l' ++operatore. Il trucco di entrambi è convertire in una matrice di caratteri che consente l'indicizzazione di numeri interi e usare l'interpolazione di stringhe di un carattere per riconvertire in un 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
    }
}

Soluzione precedente non ricorsiva

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))
        }
    }
}

Benvenuti in PPCG! È possibile rimuovere parte degli spazi bianchi verso la fine del codice?
ETHproductions

@ETHproductions purtroppo no, l'operatore ternario e gli whilespazi necessari per la compilazione. Ho anche giocato con la tipicità Stringe cercando di printchiudere, ma non hanno risparmiato spazio.
rabidaudio,

2

Pyke, 26 19 17 byte

jljjhF3<Q/Q*jih>s

Provalo qui!

                  - 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:]

Potresti aggiungere una spiegazione?
Esolanging Fruit,

@ Challenger5 fatto e giocato a golf 2 byte!
Blue

1

Mathematica, 78 byte

Accidenti a te Martin Ender, ero quasi il primo: p

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

Funzione senza nome; implementazione semplice con un Whileciclo e alcune variabili temporanee.


Oh, andiamo , sappiamo entrambi che Mathematica non è un imperativo
LegionMammal978

1
<sventola una bandiera bianca>
Greg Martin,

1

JavaScript ES6, 89 byte

Ho pensato che sarebbe stata una sfida facile, ma sono abbastanza sicuro che mi manchi qualcosa qui ...

Utilizza la ricorsione e restituisce una matrice di stringhe

(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>


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.