Entrada
Un entero no negativo n
y una cadena no vacía que s
contiene solo caracteres alfanuméricos y guiones bajos _
. El primer personaje de s
no es _
. Los guiones bajos de s
se interpretan como espacios en blanco que se pueden rellenar con otros caracteres.
Definimos una secuencia infinita de "cadenas infinitas" de la siguiente manera. La cadena se repite infinitamente muchas veces. Para todos , la cadena se obtiene al llenar sus espacios en blanco con los caracteres de , de modo que el primero de se reemplaza con , el segundo con , y así sucesivamente. Desde la primera carta des1 = s s s...
s
k > 1
sk+1
sk
s1
_
sk
s1[0]
s1[1]
s
no es _
, cada espacio en blanco se llena eventualmente, y denotamos por la cadena infinita donde cada uno ha sido reemplazado por su valor final.s∞
_
Salida
El primero n
caracteres de como una cadena.s∞
Ejemplo
Considere las entradas n = 30
y s = ab_c_
. Tenemos
s1 = ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_ab_c_...
Sustituyendo a los espacios en blanco de , tenemoss1
s1
s2 = abacbab_ccab_caabbc_abcc_abacbab_cc...
Nuevamente sustituimos a los espacios en blanco, lo que resulta ens1
s3 = abacbabaccabbcaabbc_abcccabacbab_cc...
Una sustitución más:
s4 = abacbabaccabbcaabbcaabcccabacbabbcc...
De esto ya podemos deducir los primeros 30 caracteres de , que sons∞
abacbabaccabbcaabbcaabcccabacb
Esta es la salida correcta.
Reglas
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten. Fallar en una entrada incorrecta es aceptable.
Casos de prueba
0 "ab__" -> ""
1 "ab__" -> "a"
3 "ab__" -> "aba"
20 "ab" -> "abababababababababab"
20 "ab__" -> "abababababababababab"
20 "ab_" -> "abaabbabaabaabbabbab"
30 "ab_c_" -> "abacbabaccabbcaabbcaabcccabacb"
50 "ab_a_cc" -> "abaabccabaaaccabbacccabcaaccabbaaccabaaaccabcaccca"
50 "abc____" -> "abcabcaabcbcaaabcbcbcabcaaababccbcbabccabcabcaaaba"
Respuestas:
Pyth, 17
La entrada debe darse con la cadena en la primera línea y la longitud en la segunda, en STDIN. Por ejemplo:
Pruébalo aquí.
Explicación:
fuente
APL
2928se usa así:
Explicación:
Tryapl.org
fuente
⍣≡
Es una idea ingeniosa. Tal vez debería intentar portar esto a J ...CJam,
262420 bytes4 bytes guardados gracias a Peter.
Pruébalo aquí. Toma la cuerda primero y
n
segundo en STDIN.Puede ejecutar todos los casos de prueba pegándolos en la entrada tal como están (incluya el
-> output
si lo desea) y utilizando el siguiente arnés de prueba (que invierte el orden del código):Explicación
El resultado se imprime automáticamente al final del programa.
Una nota sobre
[\]
: En principio,[
recuerda el tamaño actual de la pila y]
recoge todo hasta el último tamaño recordado en una matriz. Sin embargo, si el tamaño de la matriz cae por debajo del tamaño recordado en el medio, entonces el inicio de la matriz se ajusta en consecuencia. Ahora puede pensar que intercambiar los dos elementos superiores de la matriz no afecta en absoluto el tamaño de la matriz, sino que en\
realidad muestra dos valores y luego los empuja en orden inverso. Esto es lo que empuja el inicio de la matriz hacia abajo en dos. Por lo tanto,[\]
es la forma más corta de envolver los dos elementos superiores de la pila en una matriz. A veces, el efecto secundario de recopilarlos en orden inverso es bastante molesto, pero en este caso, es exactamente lo que necesito.fuente
_'_#)
g
conI*
. Funciona para mí en GolfScript.Python 3, 110 bytes
Necesita un poco más de golf, pero aquí hay algo de locura. Lee
n
entoncess
de STDIN.La parte divertida es que, en la asignación del bucle que copiamos
b
, luego comenzamos a aparecerb
durante una comprensión de la lista . Si la tarea fuera al revés, ¡no funcionaría!fuente
k, 30
fuente
Java - 162
174No todos los días puedo usar un bucle do / while al jugar golf en Java: D
Esto solo se repite y completa los espacios en blanco a medida que aparecen. Simplemente continúa hasta que no haya más
_
en el resultado.Con saltos de línea:
fuente
Java 8, 238
Menos golfizado:
fuente
Rubí, 60
Concatena
s
a si mismon
veces, luego generan
copias de código que reemplaza los guiones bajos cons
, evalúa esas copias y devuelve los primerosn
caracteres del resultado. Como se elimina al menos un guión bajo en cada bucle, se garantiza que nos darán
caracteres sin guión bajo.fuente
f
y correrputs f[10,"ab_"]
, me sale el siguiente error:in 'eval': undefined method 'next' for #<Array:...
. Sin embargo, parece funcionar cuando no hay guiones bajos en la cadena.String#chars
cambió entre Ruby 1.9.3 y Ruby 2.0; en Ruby 1 devuelve un enumerador cuando no hay bloque, en Ruby 2 una matriz. Puede hacerse insensible a la versión cambiandochars
aeach_char
, a costa de 4 bytes netos más de código.Pitón 2, 75
Esto espera una entrada como
(30,"ab_c_")
.En Python, las cadenas no permiten la asignación. Por lo tanto, reemplazar los espacios en blanco con el carácter deseado es difícil. Uno puede evitar esto convirtiendo a una lista y viceversa, pero me pareció más corto simplemente generar la cadena de salida desde cero, agregando los caracteres deseados uno a la vez.
La salida que se está construyendo es
S
, que comienza vacía. Recorremos los caracteres de la entradas
copiados muchas veces para simular un círculo. Verificamos si está en blanco a través del booleanob
. Verificamos la igualdadx=='_'
lugar de la comparación porque el guión bajo se encuentra entre mayúsculas y minúsculas.Si el personaje no está en blanco, simplemente lo agregamos
S
. Si está en blanco, agregamos la siguiente letra no utilizada de la salida hasta ahoraS
. Rastreamos letras usadas por un puntero índicec
que comienza en 0 y se incrementa cada vez que encontramos un espacio en blanco.Al final, imprimimos los primeros
n
caracteres de la cadena resultante.S
.Tenemos que usar
S[c:c+b]
en lugar del más cortob*S[c]
porque este último da un error fuera de los límites cuandoS
comienza vacío yc
es 0. Nunca importa porque estamos garantizados que el primer carácters
no está en blanco, por lo que estoS[c]
nunca es necesario, pero el código no lo sabe. Cambiaror
al cortocircuito también podría resolver esto, pero cuesta más personajes.Pitón 2, 83
Un puerto Pyth-to-Python de la solución de isaacg , que usa
split
yzip
realiza el reemplazo:Resultó más largo porque, sorpresa, los métodos con nombre son largos en Python. Pero tal vez se pueda mejorar revolviendo
s
ys.split('_')
juntos de una manera más corta.fuente
Haskell
(93)67No he escrito ningún Haskell en mucho tiempo,
por lo que esto puede acortarse mucho.¡pero fue tan bueno que tuvimos que acortarlo y mejorarlo!Uso:
fuente
Lote - 425
¿Pierdo?
El lote tiene limitaciones, acepto esto. Por ejemplo; Tuve que usar un bucle for para obtener una sola variable en un formato utilizable debido a las limitaciones de la sintaxis de análisis de variables.
for %%b in (!c!)do...
simplemente existe para que pueda usar en%%b
lugar de!c!
para poder hacer la manipulación de la cadena!s:~%%b,1!
y hacer que las variables se expandan en el momento correcto.Hay un par de cosas bastante básicas que podría hacer para seguir jugando al golf, pero probablemente no por debajo de los 400 bytes. Tendré otra grieta pronto.
fuente
ECMAScript 6, 78
Comienza con una cadena vacía y para cada aparición de guión bajo, lo reemplaza con el carácter en el siguiente índice de la cadena actual.
fuente
Python 2 -
9997 bytesDebido a que 4 presentaciones basadas en python no son suficientes ...
Ejemplo:
fuente
ECMAScript 6,
9391Afeitado 2 personajes de la primera versión.
fuente
C # - 162
Robé la solución Geobits y la cambié a C #
1 char mejor, para que puedas mejorar Geobits;)
fuente