El reto
Dadas dos cadenas / una matriz de cadenas, la primera cadena se encoge lentamente y se expande nuevamente en la segunda cadena.
Puede suponer que las cadenas siempre comenzarán con el mismo carácter.
Ejemplo
Input:
"Test", "Testing"
Output:
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing
Primero saca la primera palabra:
Test
Luego sigue eliminando una letra hasta que la cadena tiene un carácter de longitud:
Tes
Te
T
Luego sigue agregando una letra de la segunda palabra hasta que esté lista:
Te
Tes
Test
Testi
Testin
Testing
(si ambas cadenas tienen un carácter de longitud, simplemente envíe una de ellas una vez).
Casos de prueba
"Hello!", "Hi."
Hello!
Hello
Hell
Hel
He
H
Hi
Hi.
"O", "O"
O
"z", "zz"
z
zz
".vimrc", ".minecraft"
.vimrc
.vimr
.vim
.vi
.v
.
.m
.mi
.min
.mine
.minec
.minecr
.minecra
.minecraf
.minecraft
" ", " "
SSSSS
SSSS
SSS
SS
S
SS
SSS
"0123456789", "02468"
0123456789
012345678
01234567
0123456
012345
01234
0123
012
01
0
02
024
0246
02468
(nota: en el espacio / cuarto caso de prueba, reemplace la S con espacios)
Reglas
Este es el código de golf , ¡así que la respuesta más corta en bytes gana! Tiebreaker es la publicación más votada. El ganador será elegido el 10/09/2016.
Las lagunas estándar están prohibidas.
Respuestas:
Pyth, 9 bytes
Un programa que toma la segunda cadena, y luego la primera cadena, como cadenas citadas en STDIN e imprime el resultado.
Pruébalo en línea
Cómo funciona
fuente
V , 14 bytes
Pruébalo en línea!
Explicación:
Ahora, el búfer se ve así:
Solo necesitamos hacer lo mismo a la inversa para la siguiente línea:
Solución alternativa más interesante :
fuente
Python, 93 bytes
Comienza con la cadena vacía
r
, agregaa
y una nueva línea y elimina el último caráctera
hasta quea
esté vacío, luego agrega las porciones requeridasb
y una nueva línea manteniendo un contadori
, que comienza2
hasta queb
se excede la longitud de , luego regresar
. Tiene una nueva línea final.Todas las pruebas están en ideone
fuente
r=""
. Simpler
aún funcionaría.f=
. 2. Sin elr=''
presentef('test','testing')
no funcionaría; Sí lof('test','testing','')
haría, pero debemos seguir las especificaciones.05AB1E , 9 bytes
Explicación
Pruébalo en línea!
fuente
Retina,
504126 bytesGracias a Martin Ender por guardar 15 (!) Bytes.
Toma entrada con las dos cadenas separadas por una nueva línea:
Pruébalo en línea!
Explicación
La primera línea genera los "pasos" de ambas palabras:
M
es para el modo de coincidencia,&
considera coincidencias superpuestas e!
imprime las coincidencias en lugar del número de ellas. La razón por la que se invierte es lar
opción de derecha a izquierda: el motor comienza a buscar coincidencias al final de la cadena y continúa hacia el principio.Esto hace que todo esté en el orden correcto:
O
establece todas las coincidencias de la expresión regular posterior: un carácter en su propia línea y cada carácter (incluidas las nuevas líneas) después, que coincide con la segunda mitad completa como un fragmento, o de lo contrario, una línea de caracteres , que coincide con cada línea individual. Estas coincidencias se ordenan por punto de código, por lo que la T seguida de la nueva línea va primero, seguida de las líneas, ascendiendo por longitud.Ahora solo tenemos esa primera línea de caracteres en la parte superior, por lo que usamos el
A
modo ntigrep para descartar la primera coincidencia de la expresión regular predeterminada.+
.Versión antigua
¡Prueba esta versión en línea!
Explicación
La primera línea es la misma, así que vea la explicación de eso arriba.
Esto invierte las líneas de la primera mitad (segunda palabra de entrada). En realidad,
O
marca las líneas y la expresión regular limita las coincidencias: debe ser una línea de dos o más caracteres (..+
) seguida de una nueva línea (¶
) que comienza donde quedó la última (\G
). En el ejemplo anterior, el sencilloT
en el medio no coincide, por lo que nada después puede.Ahora tenemos los dos componentes correctos, pero en el orden incorrecto.
¶.¶
coincide con la T solitaria en el medio, que no necesitamos pero separa las dos partes. Los dos(.*)
capturan todo antes y después, incluidas las nuevas líneas gracias als
modo de línea ingle. Las dos capturas se sustituyen en el orden correcto con una nueva línea en el medio.Ahora hemos terminado, a menos que las cadenas de entrada tengan un carácter de longitud, en cuyo caso la entrada no ha cambiado. Para deshacernos del duplicado, reemplazamos
¶.$
(cuando la última línea de la cadena un solo carácter) con nada.fuente
Python 2,
8882 bytesToma dos entradas, cada una entre comillas.
Gracias @JonathanAllan por guardar algunos bytes y señalar un error.
fuente
len(x)
inx=x[:len(x)-1]
ya que el corte en offset negativo funciona: solo puede escribirx=x[:-1]
. El único problema es que su código no manejará" ", " "
muy bien el caso de prueba.input()
y usar un formato de entrada como"<str1>", "<str2>"
for i in range(x):print x[-i:]
, y la cuarta línea afor i in range(1,y):print y[:-i]
. Sin embargo, no estoy seguro de que funcione.Perl,
3428 bytesIncluye
+2
para-0n
Ejecutar con las cadenas en líneas separadas en STDIN:
slow.pl
:Deje que regex backtracking haga el trabajo ...
fuente
Cheddar , 76 bytes
Un poco más de lo que me hubiera gustado. Agregaré una explicación pronto
Pruébalo en línea!
fuente
|>
hacer?Brachylog , 32 bytes
Pruébalo en línea!
Explicación
Brachylog no tiene prefijo incorporado, por lo tanto, obtendremos los prefijos usando
concatenate
(Ver predicado 2): un prefijo deS
esP
si seP
concatena aQ
(lo que sea) da como resultadoS
.Predicado principal:
Predicado 1:
Predicado 2:
fuente
Javascript,
10381 bytesEjemplo:
f("Test", "Testing")
Salida:
Respuesta original
fuente
Java,
188179 bytesActualizar
Sin golf :
Uso :
fuente
Haskell,
545347 bytesEjemplo de uso:
((.reverse.t).(++).init.t) "Hello" "Hi!"
->["Hello","Hell","Hel","He","H","Hi","Hi!"]
.Un poco de magia sin puntos. Es lo mismo que
f x y = (init(t x))++reverse (t y)
wheret
hace una lista de todas las subcadenas iniciales, por ejemplo,t "HI!"
->["H","HI","HI!"]
.fuente
t=reverse.tail.inits
?inits
necesitaimport Data.List
.Pyke, 14 bytes
Pruébalo aquí!
Y 17 bytes solo porque es una solución increíble:
Pruébalo aquí!
fuente
GNU sed,
5745 + 2 (rn flags) = 47 bytesCorrer:
La entrada debe ser las dos cadenas separadas por una nueva línea. El código lo ejecuta sed para cada línea.
El bucle
:
elimina un carácter del final de la cadena de forma iterativa. La salida relacionada con la primera cadena se imprime directamente, excepto el primer carácter:1{/../p}
. La salida para la segunda cadena se almacena en el espacio de espera en orden inverso (2G;2h
) durante la eliminación y se imprime al final.fuente
C (gcc) ,
102979593 bytesPruébalo en línea!
El primer bucle sobrescribe la cadena con 0 bytes a partir del final, y se utiliza
puts()
para imprimir la cadena. El segundo ciclo no puede simplemente sobrescribir desde el principio, sino que debe almacenar el valor anterior para que pueda volver a colocarlo; el byte 0 solo camina hacia el final.¡Gracias a @homersimpson y @ceilingcat por cada recorte de 2 bytes!
fuente
n
como int global como:n;f(char*a,char*b){n=strlen(a)...
. Y probablemente pueda hacerlon=*a=0
como una tarea encadenada en el cuerpo de su bucle for.Python 3, 104 bytes
Meh
Gracias a @DJMcMayhem por jugar 21 bytes de descuento.
Ideone it!
fuente
n='\n'
y usar n en lugar de'\n'
. Puede quitar otros 8 si usa una lambda en lugar de imprimir:n='\n';lambda x,y:n.join(x+n+n.join(x[:-i]for i in range(1,len(x)-1))+n+n.join(y[:i]for i in range(1,len(y)+1)))
REPL / Javascript, 109 bytes
Utiliza una cadena falsa para reducir la cadena original
Abusa de la subcadena con números más grandes para hacer crecer la segunda, se detiene cuando está a punto de imprimir la misma palabra que la última vez.
Manifestación:
fuente
a=>b=>...
y llamar a la función con (a) (b)Brainfuck,
3855 bytesEditar: líneas nuevas incluidas en la salida
fuente
Dyalog APL ,
2013 bytes↑
matrificar(⌽,\⍞)
invertido (⌽
) concatenación acumulativa (,\
) de entrada de caracteres (⍞
),
antepuesto a1↓
un elemento caído de,\⍞
concatenación acumulativa de entrada de caracteresTryAPL en línea!
fuente
Raqueta 193 bytes
Pruebas:
fuente
Floroide , 69 bytes
Es un comienzo. Toma la entrada de STDIN.
Casos de prueba
fuente
JavaScript (ES6), 92 bytes
Las
replace
declaraciones crean un triángulo de cadenas, que es exactamente lo que se requiere para la segunda mitad de la salida, sin embargo, la primera mitad debe invertirse y eliminarse la línea duplicada de un solo carácter. Nota: genera una nueva línea inicial si la primera cadena es un solo carácter. Si esto no es deseable, para un byte adicional, esta versión siempre genera una nueva línea final:fuente
C, 142 bytes
Proporcionar
f(char* str1, char* str2)
.fuente
TI-Basic, 56 bytes
Ejemplo de uso
fuente
Java,
168136 bytesPrograma de prueba sin golf
fuente
(Lambdabot) Haskell - 41 bytes
Más legible, pero dos bytes más largos:
Salida:
fuente
J, 18 bytes
Sin golf:
Este es un tren de 7:
El tren más interno
[: |. ]\@[
consiste en un límite[:
a la izquierda, por lo que aplicamos|.
(inverso) al resultado de]\@[
, que está]\
(prefijos) sobre[
(argumento izquierdo).Esto es lo que se ve en la
testing, test
entrada:Esto nos da la primera porción, casi. El 5-tren fuera de eso es
([: }: ([: |. ]\@[))
, que se aplica}:
(betail, remove last element) a la expresión anterior:(Esto se debe a que no podemos tener un punto medio duplicado).
La parte exterior es finalmente:
Esto se compone de
]\@]
(prefijos de argumento izquierdo) y,~
(agregue lo que está a la izquierda con lo que está a la derecha), dejándonos con el resultado deseado:Casos de prueba
fuente
(,~}:@|.)&(]\)
PHP,
117109bytesPHP, 107 bytes (no funciona con cadenas que contienen
0
)fuente
C, 111 bytes
Prueba sin golf
fuente
brainfuck, 162 bytes
Pruébalo aquí
La entrada toma las dos cadenas separadas por un salto de línea.
Primer programa con brianfuck y primer código de golf, así que estoy seguro de que hay mucha optimización por hacer. Aunque me divertí mucho haciéndolo.
Sin golf
fuente