¡Terminamos donde empezamos! ...

29

Reto:

Entrada:

Toma dos entradas:
- Una cadena que solo contiene ASCII imprimible (excluyendo espacios, tabulaciones o nuevas líneas)
- Un carácter ASCII imprimible

Salida:

La primera línea contendrá la entrada de cadena. Cada iprimera aparición de -modulo-3 de este personaje se moverá en dirección sudeste; cada isegundo -modulo-3 segundo evento se moverá en dirección Sur; y cada itercera ocurrencia de -modulo-3 se moverá en dirección suroeste. Continuará hasta que los caracteres estén a punto de volver a su posición inicial inicial (lo que significa que se ajustará de un lado al otro si es necesario), y luego imprimirá la última línea con la entrada de cadena nuevamente para terminarlo (Tenga en cuenta que todos los casos de prueba terminarán en su entrada inicial después de la mayoría de las length(input)filas, incluida la fila que contiene la entrada posterior. Sin embargo, puede ser antes, como se ve en este primer caso de prueba a continuación, con una longitud de 14, pero terminando después 9.)

Todo esto puede ser bastante vago, así que aquí hay un ejemplo:

Caso de prueba 1:

Entrada de cadena: Entrada de "This_is_a_test"
caracteres:'s'

Salida:

This_is_a_test
    s s    s  
     ss   s   
      s  s    
      sss     
      sss     
      s  s    
     ss   s   
    s s    s  
This_is_a_test

Aquí está el mismo caso de prueba con las rutas de colores de los tres s:

ingrese la descripción de la imagen aquí

donde el primero 's'sigue el camino verde en dirección sureste; el segundo 's'sigue el camino amarillo en dirección sur; y el tercero 's'sigue el camino azul claro en dirección suroeste. (Si hubiera un cuarto 's', iría nuevamente en dirección sudeste, lo que se puede ver en algunos de los otros casos de prueba a continuación).

Reglas de desafío:

  • Las entradas solo contendrán ASCII imprimibles (excluyendo espacios, pestañas y nuevas líneas)
  • Los formatos de E / S son flexibles. Puede ser una cadena delimitada por una nueva línea, una matriz de caracteres, etc. Su llamada.
  • Es posible que el carácter dado no esté presente en la cadena, en cuyo caso se le permite generar la cadena de entrada una o dos veces (es decir, "test", 'a'puede tener cualquiera de estos como salida posible: "test\ntest"/ "test").
  • Los espacios iniciales son obligatorios; los espacios finales son opcionales. Se permiten una o varias líneas nuevas iniciales / finales.

Reglas generales:

  • Este es el , por lo que la respuesta más corta en bytes gana.
    No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación.
  • Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
  • Las lagunas predeterminadas están prohibidas.
  • Si es posible, agregue un enlace con una prueba para su código.
  • Además, agregue una explicación si es necesario.

Casos de prueba / más ejemplos:

Caso de prueba 2:

Entrada de cadena: Entrada de "abcabcabcabcabc"
caracteres:'b'

Salida:

abcabcabcabcabc
  b b b    b b 
   bbb      bb 
    b        b 
   bbb       bb
b b b b      b 
 b  b  b     b 
b b b   b    b
   bb    b   bb
    b     b  b 
    bb     bbb
    b b    bbb 
    b  b  b  b 
    b   bb   bb
b   b   bb   b 
abcabcabcabcabc

Aquí está el mismo caso de prueba con las rutas de colores de los cinco a:

ingrese la descripción de la imagen aquí

Caso de prueba 3:

Entrada de cadena: Entrada de "only_two_paths?"
caracteres:'o'

Salida:

only_two_paths?
 o     o       
  o    o       
   o   o       
    o  o       
     o o       
      oo       
       o       
       oo      
       o o     
       o  o    
       o   o   
       o    o  
       o     o 
       o      o
only_two_paths?

Aquí está el mismo caso de prueba con las rutas de colores de los dos o:

ingrese la descripción de la imagen aquí

Caso de prueba 4:

Entrada de cadena: "lollollollollol"
Entrada de caracteres:'l'

Salida:

lollollollollol
lll   ll  ll   
 ll   ll  ll   
l ll ll ll ll  
  lll l ll l ll
  llllll  ll ll
l l  ll    ll  
 ll  lll   ll  
l l l lll ll l 
  ll  l ll l  l
l l l l llll l 
 ll  lll  lll  
l l   l    ll  
  ll lll  lllll
  l l l ll l ll
lollollollollol

Aquí está el mismo caso de prueba con las rutas de colores de los diez l:

ingrese la descripción de la imagen aquí

Caso de prueba 5:

Entrada de cadena: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
Entrada de caracteres:'C'

Salida:

AbCdEeDcBaAbCdEeDcBa_CCCCC
C  C        C       C  C  
 C  C       C      C  CCC 
  C  C      C     C  C C C
C  C  C     C    C  C  C  
 C  C  C    C   C  C   C  
  C  C  C   C  C  C    C  
   C  C  C  C C  C     C  
    C  C  C CC  C      C  
     C  C  CC  C       C  
      C  C CC C        C  
       C  C CC         C  
        CC CC C        C  
        CC CC  C       C  
       C  C CC  C      C  
      C  C CC C  C     C  
     C  C   C  C  C    C  
    C  C    CC  C  C   C  
   C  C     C C  C  C  C  
  C  C      C  C  C  C C  
 C  C       C   C  C  CC  
C  C        C    C  C  C  
  C         C     C  C CCC
 C          C      C  CCCC
C           C       C  C  
 C          C        CCCCC
AbCdEeDcBaAbCdEeDcBa_CCCCC

Aquí está el mismo caso de prueba con las rutas de colores de los siete C:

ingrese la descripción de la imagen aquí

Caso de prueba 6:

Entrada de cadena: "XyX"
Entrada de caracteres:'X'

Salida:

XyX
 XX
  X
XyX

Aquí está el mismo caso de prueba con las rutas de colores de los dos X:

ingrese la descripción de la imagen aquí

Caso de prueba 7:

Entrada de cadena: "aaaa"
Entrada de caracteres:'a'

Salida:

aaaa
aa  
aaa 
 aaa
aaaa

Aquí está el mismo caso de prueba con las rutas de colores de los cuatro a:

ingrese la descripción de la imagen aquí

Kevin Cruijssen
fuente
Entonces, cuando la cadena contiene un múltiplo de 3 del carácter, ¿la salida puede tener menos filas que la longitud de la cadena?
Neil
@Neil No estoy seguro si es un múltiplo de 3, no lo he investigado tanto. Todo lo que sé es que, a lo sumo, length(input)todo vuelve a coincidir, pero puede ser antes, como lo demuestra el primer caso de prueba. Pero parece que tienes razón sobre el múltiplo de 3 partes (aunque no estoy 100% seguro).
Kevin Cruijssen
@Neil cualquier cadena con el carácter que aparece solo 3 veces seguidas imprimirá 3 líneas por más tiempo que sea
Asone Tuhid
¿Se permiten nuevas líneas finales entre 2 líneas impresas?
Asone Tuhid
@AsoneTuhid Lo siento pero no. No me importa la cantidad de nuevas líneas finales o iniciales antes o después de todo el resultado esperado, pero no permitiré entre líneas. Las líneas diagonales ya no serían correctas también ..
Kevin Cruijssen

Respuestas:

1

Stax , 24 bytes

»v↕*δó‼Γ█|q┬YM╨|·£↕fßßZo

Ejecútelo y depúrelo en línea

Esta es la representación ascii del mismo programa.

YxP|Ic{{i3%v-x%%mb-!Czny&PWxP

Obtiene los índices de todos los caracteres, y luego los muta hasta que son iguales a los índices originales. Para cada cambio, genere una cadena con el carácter en esos índices.

Y                               Store character in y.  Now the inputs are x and y.
 xP                             Print x.
   |Ic                          Get all indices of y in x. Make a copy.
      {                   W     Loop until cancelled.
       {        m               Map index array using block.
        i3%v-                   Subtract i%3-1 from each element. i is the loop index.
             x%%                Modulo len(x)
                 b-!            Is the mutated array set-equal to the original?
                    C           If so, cancel W loop
                     zny&P      Print a string with y at all specified indices
                           xP   Finally, print x again
recursivo
fuente
8

Perl 5 , -plF 101 100 99 98 97 96 bytes

Reemplace el \0byte 0 por un literal para obtener 96. Observe que el enlace Pruébelo en línea tiene 97 bytes porque no parece posible ingresar un carácter 0 literal allí.

#!/usr/bin/perl -plF
say;say$$l=~y/\0/ /runtil--$l,(s:\Q${\<>}:$$l|=v0 x((++$#$l%3*$l-$l+"@-")%@F).$&;v0:oreg^$$l)eq$_

El resaltador de código de golf perl piensa #comenzar un comentario. Que ingenuo 😈

Pruébalo en línea!

Cómo funciona

$les un contador para qué línea después de la primera en la que estamos (sin embargo, cuenta hacia atrás, por ejemplo, -3 para 3 líneas debajo de la cadena superior). Después de imprimir la cadena inicial una vez, repetidamente hace lo siguiente.

Busque en la primera cadena las apariciones del carácter objetivo y calcule en qué desplazamiento debe aparecer: (++$#$l%3*$l-$l+"@-")%@Fcuál es la posición actual más el número de línea (negativo) veces -1, 0, 1(cíclico). Construya una cadena con tantas veces \0seguidas por el carácter objetivo y oreso en un acumulador $$l(que es un acumulador diferente para cada uno $ly la razón $lcuenta hacia atrás en lugar de hacia arriba porque $1, $2etc. son de solo lectura). Simularmente se $#$lrefiere a una matriz diferente cada vez a través del ciclo. El resultado es la $llínea th pero con en \0lugar de espacios.

Los caracteres de destino en la primera cadena se sustituyen por \0lo que termina con la cadena original con "agujeros" (con \0) en las posiciones originales del personaje de destino. Si xorcon el acumulador, los agujeros se llenan si y solo si el acumulador tiene los caracteres de destino en las posiciones originales, entonces el resultado será la cadena original. Eso se usa para terminar el ciclo. Si el bucle aún no ha terminado, imprima el acumulador \0reemplazado por espacio.

Cuando el ciclo finaliza, la -popción imprime una vez más la primera cadena y el programa termina .

El personaje objetivo se recoge de una manera bastante complicada. Los ${\<>}convierte una línea de lectura de STDIN a una referencia que a continuación se elimina la referencia y sustituido en la expresión regular inmediatamente. El \Qprefijo escapa a todos los caracteres que son especiales en una expresión regular (como .y *). El \Ees implícito. El omodificador hace que la parte de búsqueda nunca se evalúe nuevamente, sino que se repita en todas las coincidencias posteriores (lo cual es bueno ya que ya no hay nada en STDIN).

Ton Hospel
fuente
No creo que pueda poner un byte nulo directamente, pero podría ejecutarlo en bash o algo así.
FryAmTheEggman
@FryAmTheEggman Gracias, es un buen esquivar. Pero no creo que me moleste. La gente tendrá que confiar en mí para que funcione si no quieren probarlo ellos mismos :-)
Ton Hospel
Completamente justo, pero dejaré el comentario para que la gente pueda verlo. Buen golf, por cierto :)
FryAmTheEggman
4

Python 2 , 199 193 191 bytes

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;break
 print''.join((' '+c)[i in j]for i in r(l))

Pruébalo en línea!


Si el bucle puede salir por excepción:

Python 2 , 187 bytes

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;q
 print''.join((' '+c)[i in j]for i in r(l))

Pruébalo en línea!


  • -4 bytes gracias a Jonathan Frech
  • -2 bytes gracias a Lynn
TFeld
fuente
Posibles 189 bytes (saliendo del bucle a través de una excepción).
Jonathan Frech
Puede colocar un par de parens en (j[i]-i%3+1)%ldos bytes.
Lynn
2

C (gcc) , 261 bytes

i,j,l,k;g(L,t,r,c)char**L;{L[r++][c]=k;c-=t?t-1?:0:-1;l<r||g(L,t,r,c<0?l-1:c%l);}f(S,K){char*s=S,*L[i=1+(l=strlen(s))];for(k=K;i--;)for(L[i]=calloc(j=l,1);j--;)L[i][j]=32;for(puts(s);s[++i];)s[i]-k||g(L,++j%3,0,i);for(i=1;strcmp(*L,L[i]);)puts(L[i++]);puts(s);}

Pruébalo en línea!

Steadybox
fuente
2

JavaScript (Node.js) , 197 194 bytes

s=>c=>{(C=console.log)(s);w=0;g=[];while(~(w=s.indexOf(c,w)))g.push(w++);h=(H=_=>g.map(x=>A[x]=c,A=Array(l=s.length).fill` `)&&A.join``)();while(h!=(y=H(g=g.map((x,i)=>(l-~x-i%3)%l))))C(y);C(s)}

Pruébalo en línea!

Toma entradas en la sintaxis de curry, es decir f(s)(c).

No es perfecto en absoluto, pero necesito JS. Muchas funciones en función.

Shieru Asakoto
fuente
2

Rubí , 189 176 171 156 150 146 144 137 bytes

->s,c,r=0..k=s.size,b=[p,s]{d=0;g=s.tr c,n=' '*k;l=r=r.map{|i|l||c==s[i]?(n[z=(i+1-d%3)%k]=g[z]=c;d+=1;z):p}-b;g==s||b<<n&&redo;puts b,s}

Pruébalo en línea!

Asone Tuhid
fuente