Haga un programa "Ceeeeeeee"


95

Una vez que escribí un programa de JavaScript que tomaría como entrada una cadena y un carácter y eliminaría todos los caracteres excepto el primero y el carácter dado como entrada, uno por uno.

Por ejemplo, calcular esto con entradas codegolf.stackexchange.comy epara los rendimientos de caracteres:

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 el primer personaje y todos los es. Todos los demás personajes se eliminan uno por uno.

Su tarea es escribir un programa (o función) que tome dos entradas y salidas (o devuelva) una cadena que logre este efecto.

Especificaciones

  • Puede suponer que la cadena no contendrá ninguna línea nueva.
  • La segunda entrada siempre será un carácter.
  • Si la respuesta tiene la forma de una función, puede devolver una serie de cadenas que contienen cada línea en la salida.
  • La salida puede contener una nueva línea final.

Casos de prueba

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

Este es el , por lo que gana el código más corto (en bytes).


27
Al azar, pero +1
TuxCrafting

25
+1 paraMeeeeeeeeegram
FlipTack

En el caso de que devuelva una matriz, ¿cada uno de los elementos tiene que incluir una nueva línea final?
Brad Gilbert b2gills

@ BradGilbertb2gills No.
Esolanging Fruit

44
Meeeeeeeeeeeeem
Mathime

Respuestas:


5

V , 12 bytes

òYpó.“„a]òd

Pruébalo en línea!

Hexdump:

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

He probado esto con la última versión de V disponible antes del desafío , y todo funciona correctamente, haciendo que esta respuesta sea competitiva.

Explicación:

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

La expresión regular comprimida se traduce en

.\zs[^e]

Lo que significa

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

Versión no competitiva (11 bytes)

Esta versión utiliza un acceso directo para Ypque no estaba disponible cuando se publicó este desafío.


@ challenger5 ¡Impresionante! Comprobaré una versión anterior y verificaré que funciona correctamente. Puede que tenga que modificarlo un poco. Te enviaré un ping una vez que haya actualizado.
DJMcMayhem

@ Challenger5 Edité la respuesta y verifiqué que esta versión funcionaba cuando se publicó el desafío.
DJMcMayhem

¿Cómo ejecutaría un montón de comandos Vim almacenados en un archivo en un sistema Linux? ¿ cat filename | vimHaría o haría otra cosa?
ckjbgames

31

Vim, 27, 26 , 25 bytes

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

Pruébalo en línea!

La entrada viene en este formato:

e
codegolf.stackexchange.com

Mi primer acercamiento ingenuo es tres bytes más largo:

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

También estoy contento con esta respuesta porque comienza con mi nombre.

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

¿Ves la similitud? Eh?

Enfoques menos exitosos:

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

Explicación:

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
Creo que tienes un error tipográfico allí donde se da la entrada hay kdemasiado :)
geisterfurz007

@ geisterfurz007 ¿No estoy seguro si entiendo lo que quieres decir?
DJMcMayhem

Dice (...)comkEn la línea 5 actualmente.
geisterfurz007

No hay razón para usar :taquí. Normal Ypsalvaría un byte. Tendrás que cambiar a, <C-R>-por supuesto. Las reglas típicas de PPCG son frustrantes, porque para cualquier caso de prueba razonable, :t.|scon 99@:o incluso 999@:sería correcto, pero no hay una buena manera de obtener una repetición infinita de esa manera. Estás obligado a usar estrategias menos interesantes.
udioica

22

MATL , 20 16 bytes

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

Pruébalo en línea! O verificar los casos de prueba: 1 , 2 , 3 , 4 , 5 .

Prima

Código modificado para ver que la cadena se reduce gradualmente (compilador fuera de línea):

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

ingrese la descripción de la imagen aquí

¡O pruébalo en MATL Online!

Explicación

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! los gifs son geniales!
Brain Guider

20

Haskell, 50 bytes

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

Define una función que (%)devuelve una lista de cadenas.

Explicación

(%)se llama como w%c, wsiendo la cadena de entrada, y cel carácter a mantener. En resumen, esta definición funciona separándose wen el primer carácter ( a) y el resto ( x), dividiéndose xen la primera aparición de un carácter que no sea c, y recursivamente se llama a sí mismo con ese carácter eliminado.

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
¿Puedes explicar el código?
bli

1
@bli Listo! Espero que esto ayude?
dianne

14

Retina , 28 27 bytes

El recuento de bytes asume la codificación ISO 8859-1.

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

Pruébalo en línea!

Explicación

;{G*1`

Hay mucha configuración aquí. El escenario en sí es realmente justo G1`, lo que mantiene solo la primera línea, descartando el carácter de entrada. *lo convierte en una ejecución en seco, lo que significa que el resultado (es decir, la primera línea de la cadena) se imprime sin cambiar realmente la cadena. {le dice a Retina que ejecute ambas etapas en un bucle hasta que la cadena deje de cambiar e ;impide la salida al final del programa.

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

Esto descarta el primer carácter que a) no está al comienzo de la entrada, b) no es igual al carácter de entrada separado.


10

Pip , 22 26 24 22 bytes

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

Toma la cadena como primer argumento de la línea de comandos, el carácter como segundo. Pruébalo en línea!

Explicación

Recorre los caracteres de entrada; si el personaje es igual al personaje especial, pase al siguiente; si no, elimínelo e imprima la cadena.

Una versión sin golf ( a, bobtener cmdline args; ocomienza con un valor de 1, xes ""):

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
 }

Trucos de golf:

  • El encabezado del bucle Lsolo se evalúa una vez, por lo que podemos filtrar la impresión inicial allí. #Pa-1no funcionará porque Pes de baja precedencia (se analizaría como #P(a-1)), pero podemos reorganizarlo v+#Pa, usando la vvariable preinicializada en -1.
  • El RA:operador devuelve el nuevo valor de a, por lo que podemos imprimir esa expresión en lugar de tener una Padeclaración separada .
  • Ahora ambas ramas de la instrucción if son expresiones individuales, por lo que podemos usar el operador ternario en su ?lugar.

10

Perl 5, 29 bytes

Obtuve 35 bytes usando Strawberry Perl: 31 bytes, más 1 para en -nElugar de -e, más 3 para espacio + -i(usado para la entrada de una sola letra; la cadena más larga es de STDIN).

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

Sin embargo, no tengo dudas de que esto es factible sin chomp;usar <<<, que es de 29 bytes, aunque no puedo probarlo yo mismo usando Strawberry.

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

Así:

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

Simplemente puede especificar "sin nueva línea en la entrada" (que es cómo funciona el segundo programa). Si realmente necesita eliminar las nuevas líneas en la entrada, busque la -lopción, que activa un modo de manejo automático de nueva línea en el que printimprime una nueva línea adicional (irrelevante aquí) y -p/ -ninput elimina la nueva línea (muy relevante). Además, está en desuso, pero creo que puede reemplazarlo ^Icon un control literal-I para obtener un byte adicional de ahorro. Finalmente, creo s/.\K[^$^I]/redo/eque sería un personaje más corto, aunque no estoy 100% seguro de que sea un lugar legal para poner un redo.

@ ais523, gracias por el consejo de la nueva línea, pero supongo que ya manejé el problema lo suficientemente bien. Re literal ^I, eso es cierto para la mayoría de las variables de letras de control, pero no esta, IIRC. Re \Ky poner redoen el reemplazo con /e, gracias! Lo probaré cuando tenga la oportunidad de ...
msh210

... y no funciona. @ ais523
msh210

8

Perl 6 ,  47 40  38 bytes

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

Expandido:

{       # 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 razón que ...^se utilizó en lugar de ...es que &[eq]no volvería Truehasta que se repitiera el último valor.


7

05AB1E ,26 25 bytes

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

Pruébalo en línea!

Tenga en cuenta que ¬²k0Qpodría reescribirse ¬²Q, pero por alguna razón no funciona cuando el carácter actual es una comilla: Q devuelve la cadena real en lugar de un booleano y provoca un bucle infinito.

Este código se puede seguir jugando ya que ¯J?está duplicado. Mover esta parte en el bucle eliminaría la duplicación y también permitiría soltar el corchete de cierre.


DˆćUΔD²KRнõ.;DXìˆ}¯¨»para 21, pero que usa nuevos comandos.
Magic Octopus Urn

7

Python 2, 71 66 bytes:

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

Un programa completo Toma 2 entradas a través de STDIN en el formato '<String>','<Char>'.

Además, aquí hay una solución recursiva actualmente en 140 bytes :

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)

Este debería llamarse en el formato print(Q('<String>','<Char>')).


No soy un pitón aficionado, pero ¿no debería esto imprimir solo una línea?
Conor O'Brien el

@ ConorO'Brien Sí, leí mal la publicación antes. Ya está arreglado.
R. Kap

7

Python 3 , 72 bytes

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

Pruébalo en línea!

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

Ponerse a dieta:

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

6

JavaScript (ES6), 74 bytes

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

Creo que esto produce una salida incorrecta para f('test cases', 's')(que termina con stss, en lugar de tsss). Creo que esto se debe a que replaceelimina la primera ocurrencia, por lo que elimina la primera en tlugar de la segunda ten la cuarta iteración del mapbucle.
Lmis

@Lmis Gracias por señalar eso, creo que pude arreglar una de mis versiones para "solo" una penalización de 7 bytes.
Neil

5

Ruby, 148 139 97 90 83 77 62 bytes

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

No estoy seguro de si se acepta el código de aficionado en este intercambio, pero estoy interesado en aprender a codificar el golf, aunque soy terrible, ¿alguna ayuda sobre cómo conseguiría que este programa se vea tan pequeño como los otros aquí?

EDITAR:

Reemplaza put con p

Se eliminó una tonelada de espacios en blanco y bytes contados correctamente gracias al Asistente de trigo

Gracias a challenger5 pasó de s=gets.chop;c=gets.chop;as,c=gets.chop,gets.chop;

reemplazado thencon ;y gets.chopcon gets[0]gracias Mhutter!

Tomando entrada como variables de línea de comando ahora, por ejemplo. prog.rb helloworld l

Gracias a numerosas mejoras mediante la sustitución de jeroenvisser101 a=s.dupcon s=""+ay la anterior sentencia if if s[i]!=c;s[i]="";p s;else i+=1;endcon (d!=c)?(s[i]="";p s):i+=1;gran mejora!


Bienvenido al sitio! No soy un experto en golf Ruby, pero parece que tienes espacios en blanco adicionales. Particularmente alrededor del =s. Para obtener consejos más completos, puede visitar nuestra página de consejos .
Wheat Wizard

La forma más fácil de eliminar bytes es eliminar el exceso de espacios en blanco, por ejemplo s=gets.chomp. No estoy seguro de si puedes hacer esto en Ruby, pero en algunos lenguajes como Python puedes combinar múltiples tareas en una sola declaración, como a,b,c=0,1,2.
Esolanging Fruit

Hola, gracias por el consejo sobre el espacio en blanco, lea la documentación de ruby ​​y se dio cuenta de que los puntos y comas pueden reemplazarlos para las declaraciones finales: ') en cuanto a hacer que s = gets.chop y c = gets.chop no puedo hacer s, c = gets.chop o cualquier cosa así, desafortunadamente, son definitivamente la mayor parte del código y me gustaría eliminar esa larga declaración ...
Ben Hili

Todavía tiene algunos espacios adicionales, particularmente antes de las palabras clave ( do, theny end), y alrededor del cuarto =.
Wheat Wizard

Parece que eres corto cambiándote en el recuento de bytes. Solo cuento 90 bytes yo mismo.
Wheat Wizard el

4

c90, 129 125 bytes

con espacios en blanco:

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

sin espacios en blanco:

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

sin golf:

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

Esto lleva un puntero al inicio de la cadena y realiza un bucle, iterando este puntero hasta que llega al final de la cadena. Dentro del ciclo, imprime el primer carácter, luego cualquier instancia del segundo argumento que encuentra entre el inicio de la cadena y el puntero. Después de esto, llama a puestos en el puntero, imprimiendo el resto de la cadena.

Esto debe compilarse en un sistema donde sizeof (int) == sizeof (char *). +3 bytes de lo contrario.

Esta es la primera vez que intento jugar golf con código aquí, así que estoy seguro de que hay algunas optimizaciones que hacer.


3

Dyalog APL , 27 bytes

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

es el carácter excluido, es la cadena inicial

argumento de impresión; encontrar el índice idel primer no después del primer carácter; si se encuentra, llame recursivamente con ieliminado


3

Mathematica, 64 bytes

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

Función anónima. Toma dos cadenas como entrada y devuelve una lista de cadenas como salida. Funciona eliminando repetidamente la primera no instancia del personaje.


Definitivamente voy a comenzar a usar FixedPointList.
ngenisis

3

PHP, 88 84 86 85 82 81 78 bytes

1 byte guardado gracias a @IsmaelMiguel, 3 bytes gracias a @ user59178, 3 bytes inspirados por @ user59178

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

toma datos de los argumentos de la línea de comandos; corre conphp -r <code> '<string>' <character>


  • agrega una nueva línea a la entrada para una impresión final implícita.
    Eso agrega 5 4 bytes de código, pero guarda en la salida y un adicional echo$a;.

1
$argv[1]."\n"puede escribirse como"$argv[1]\n"
Ismael Miguel

1
A medida que $bse agrega una nueva línea, siempre será verdadera siempre que tenga una longitud> = 1. Como tal, ""<es innecesario.
user59178

Puede guardar otro byte utilizando un ternario en substr()lugar de asignar $b.
user59178

@ user59178 Realmente no te atrapé allí: necesito el substrresultado tanto para la condición como para el print; así que debería asignarlo en alguna parte. Pero me inspiraste.
Tito el

Quise decir, for(;$b=substr($b?:".$argv[1]\n",1);)pero lo que tienes ahora es aún mejor.
user59178

3

05AB1E, 26 24 23 bytes

¡Gracias @Kade por 2 bytes!
¡Gracias @Emigna por 1 byte!

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

Utiliza la codificación CP-1252 . Pruébalo en línea!

y²k0Ê podría ser y²Ê pero lo "arruina todo.

Esto probablemente podría ser más golf porque «se repite dos veces. Por favor, deje un comentario si tiene alguna sugerencia o forma de jugar más golf.


3

Java 10, 155 140 139 124 bytes

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

Pruébalo en línea.

Explicación:

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

Antigua respuesta recursiva de 139 bytes:

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 bytes gracias a @Eugene . (La próxima vez haga un comentario en lugar de editar la publicación de otra persona, por favor).

Pruébalo en línea.

Explicación:

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

¿No sería mucho más corto no molestarse con un char [] y usar s.charAt ()?
dpa97

@ dpa97 Ah, tienes toda la razón. Al principio usé un bucle foreach, pero lo cambié a un bucle for regular. Olvidé eliminar el conjunto de caracteres. Gracias.
Kevin Cruijssen

2

C #, 122 117 112 bytes

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

Sin golf:

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

Devuelve una colección de cadenas.


1
Buen truco con el uso de una colección no genérica. Pero no funcionará si el último personaje no es un personaje especial c. En ese caso, el bucle intentará funcionar para siempre.
paldir

1
@paldir Woops, tienes razón! Al girar mi cerebro esta vez, encontré una mejor (¡y más corta!)
psycho

Puede eliminar el paréntesis del bucle for para guardar 2 bytes.
PmanAce

@PmanAce Lo siento, ¿qué quieres decir? ¿Qué paréntesis?
psycho

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

2

TSQL, 127 bytes (excluyendo definiciones 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

Formateado:

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

Buen uso de patindex, pero el alphabetejemplo no parece del todo correcto, se muestra aaphabethacia abajo aaa. También vale la pena mencionar que esto debe ejecutarse en un servidor o base de datos con una intercalación entre mayúsculas y minúsculas; de lo contrario, el upperCASEejemplo también falla y se muestra ueEen su fila final.
BradC

2

C #, 135 138 :( 137 bytes

Golfizado:

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

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

La función devuelve la colección de cadenas.

EDITAR1: @psycho notó que el algoritmo no se implementó correctamente.

EDIT2: Variable creada para s.Length. Un byte guardado gracias a @TheLethalCoder.


1
No funcionará si el carácter de entrada está presente más de una vez en una fila. Ej: codeegolf edaría en celugar de cee.
psycho

@psycho intercambié ifcon whiley funciona.
paldir

Mejor ! Pero puede ser más corto. ¡Publicaré el mío!
psycho

1
Cree una variable para s.Lengthguardar 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 bytes

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

Y una solución recursiva de 76 Bytes , porque a pesar de ser más larga que la primera, me gusta más:

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

Raqueta 194 bytes

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

Sin golf:

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

Pruebas:

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

Salida:

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

Devolver una sola cadena con nuevas líneas

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>


Ligeramente extraño en el sentido de que no toma dos argumentos sino un argumento y luego devuelve otra función donde debe dar el segundo argumento. No estoy seguro de que este fuera el comportamiento esperado.
MT0

@ MT0 I es extraño pero se acepta para una función con 2 argumentos, ya que ahorra 1 byte. Te daré una referencia cuando encuentre una. Aquí está meta.codegolf.stackexchange.com/a/8427/21348
edc65

Gran técnica, no me di cuenta de que modificar el tercer argumento .mapera acumulativo. Vi .map().filter()y pensé "¡Esto sería una gran comprensión de la matriz!", Pero la falta de índice en las comprensiones de la matriz lo mató y terminó con la misma longitud: s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)](por cierto, cuento 68 bytes para todos estos).
ETHproductions

1
En realidad, al reorganizar los parámetros puede obtener la comprensión de la matriz hasta 66:([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
ETHproductions

@ETHproductions no puede creer que me haya equivocado en el recuento de bytes nuevamente . De todos modos, gracias por hacerme pensar de nuevo al respecto, obtuve 64 con el estándar ES6
edc65

2

Swift 3 - 151 147 bytes

Swift no es el lenguaje ideal para jugar al golf, especialmente cuando se relaciona con la indexación de cadenas. Esto es lo mejor que puedo hacer:

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

Desafortunadamente, Swift necesita espacios alrededor !=(pero no para ==), y Swift 3 dejó caer al ++operador. El truco para ambos es convertir a una matriz de caracteres que permita la indexación de enteros y usar la interpolación de cadenas de un carácter para volver a convertir a String( "\(c)").

Sin golf:

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

Solución previa no recursiva

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

Bienvenido a PPCG! ¿Se puede eliminar parte del espacio en blanco hacia el final del código?
ETHproductions

@ETHproductions lamentablemente no, el operador ternario y la whilenecesidad de espacios para compilar. También jugué con el typealiasing Stringe intenté establecer printun cierre, pero no ahorraron espacio.
rabidaudio

2

Pyke, 26 19 17 bytes

jljjhF3<Q/Q*jih>s

Pruébalo aquí!

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

¿Podría agregar una explicación?
Esolanging Fruit

@ Challenger5 hecho y golfed 2 bytes!
Azul

1

Mathematica, 78 bytes

Maldita sea Martin Ender, casi fui el primero: p

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

Función sin nombre; Implementación sencilla con un Whilebucle y algunas variables temporales.


Oh, vamos, ambos sabemos que Mathematica no es imprescindible
LegionMammal978

1
<agita una bandera blanca>
Greg Martin

1

JavaScript ES6, 89 bytes

Pensé que sería un desafío fácil, pero estoy bastante seguro de que me falta algo aquí ...

Utiliza la recursividad y devuelve una serie de cadenas.

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.