Su desafío es expandir algunos corchetes en la entrada de un programa como se muestra:
- Encuentre una cadena s entre dos corchetes coincidentes
[
y]
, con un solo dígito n después del corchete de cierre. - Retirar los soportes.
- Reemplace s con sí mismo repetido n veces. (Si n es 0, simplemente elimine s .)
- Vaya al paso 1 hasta que no haya más corchetes coincidentes en la entrada.
Reglas y aclaraciones adicionales:
- Tomará entrada y dará salida a través de cualquier medio permitido.
- Se permite una nueva línea final en la salida.
- Solo necesita manejar ASCII imprimible en la entrada.
- Puede suponer que todos los corchetes coinciden, es decir, nunca recibirá la entrada
[]]]]
o[[[[]
. - Puede suponer que cada paréntesis de cierre
]
tiene un dígito después.
Casos de prueba:
Input -> Output
[Foo[Bar]3]2 -> FooBarBarBarFooBarBarBar
[one]1[two]2[three]3 -> onetwotwothreethreethree
[three[two[one]1]2]3 -> threetwoonetwoonethreetwoonetwoonethreetwoonetwoone
[!@#[$%^[&*(]2]2]2 -> !@#$%^&*(&*($%^&*(&*(!@#$%^&*(&*($%^&*(&*(
[[foo bar baz]1]1 -> foo bar baz
[only once]12 -> only once2
[only twice]23456789 -> only twiceonly twice3456789
[remove me!]0 ->
before [in ]2after -> before in in after
Como se trata de código de golf , gana la respuesta más corta en cada idioma. ¡Buena suerte!
code-golf
string
compression
decode
MD XF
fuente
fuente
s
nunca debe contener otros corchetes? Por ejemplo, intentar resolver[Foo[Bar]3]2
expandiendo la cadenaFoo[Bar
3 veces resultaría en un estado inválidoFoo[BarFoo[BarFoo[Bar]2
[a[b]2c[d]2e]2
? Se obtieneabbcddeabbcdde
expandiéndoseb
yd
primero, peroababcdbcdedbabcdbcdede
expandiéndosea[b
yd]2e
primero.Respuestas:
Gema , 17 personajes
Ejecución de muestra:
fuente
Retina ,
242322 bytesPruébalo en línea! Esto es prácticamente un elemento incorporado en Retina 1. Editar: Guardado 1 byte gracias a @Kobi.
4745 bytes en Retina 0.8.2:Pruébalo en línea!
fuente
Haskell ,
10196 bytesPruébalo en línea! En lugar de usar expresiones regulares como la mayoría de las otras respuestas, esto implementa un analizador recursivo.
-5 bytes gracias a BMO !
fuente
(%)
ahorra 1 byte y le['1'..d]
ahorra otros 4, vea esto .Perl 5 ,
343329 + 1 (-p
) = 30 bytesPruébalo en línea!
Córtalo con ayuda de @Shaggy y @TonHospel.
fuente
]
.perl -pe 's/.([^[]*?)](.)/$1x$2/e&&redo'
yperl -pe 's/.([^][]*)](.)/$1x$2/e&&redo'
Japt v2 ,
212019 bytesGuardado 2 bytes gracias a @Shaggy
¡Pruébelo en línea!
e
es un reemplazo recursivo, que hace un reemplazo a la vez hasta que no haya más coincidencias. En este caso, coincidencias de la expresión regular/\[([^[]*?)](\d)/g
se reemplazan con <texto interno> repetido <digit> veces hasta que no haya más coincidencias.Según lo que he planeado ( aquí ), esta expresión regular debería ser al menos
32 bytes más corta:fuente
]
tiene un dígito después ", debería poder reemplazarlo(\d
por(.
.\[
con.
JavaScript,
716766 bytes¡ Tenía una solución de 54 bytes pero el segundo caso de prueba lo arruinó! :(
Casos de prueba
fuente
Python 3 ,
1109392 bytesPruébalo en línea!
-17 bytes gracias a pizzapants184 -1 byte gracias a Kevin Cruijssen
fuente
in
.(\d)
a(.)
, porque sabemos que un bloque de paréntesis]
siempre va seguido de un dígito.Scala , 173 bytes
Pruébalo en línea!
Expandido:
Vieja solución
Scala ,
219215213212199bytesPruébalo en línea!
Expandido:
Donde l es la lista de cadenas que procesaremos.
Gracias Kevin Cruijssen por -1 byte
Pasó de 212 a 199 eliminando un parámetro no utilizado, no prestó atención.
fuente
(\d)
a(.)
, porque sabemos que un paréntesis de bloque]
siempre va seguido de un dígito.Apilado ,
3938 bytes¡Salvamos 1 byte gracias a Shaggy, jugamos al golf!
Pruébalo en línea!
Simplemente reemplaza recursivamente una expresión regular
'\[([^[\]]+)](.)'
con la regla de repetición.fuente
]
.Python 3,
15514810197 bytesPruébalo en línea
Gracias a HyperNeutrino y Mego por -47 bytes y user202729 por -4 bytes.
fuente
def f(x):a=x.rfind('[');b=x.find(']',a);return f(x[:a]+x[a+1:b]*int(x[b+1])+x[b+2:])if~a else x
JavaScript -
777572 bytesEditar: expresiones regulares actualizadas con la recomendación de Shaggy
Retazo:
Mostrar fragmento de código
fuente
f=
!QuadR con el
≡
argumento,3028 bytesPruébalo en línea!
\[[^[]+?].
reemplazar "[
no[
material]
" con¯2↓⍵M
soltar los dos últimos caracteres del M atch ( "]
dígito ')1↓
deje caer el primer carácter ('[
")⊂
encierran a ser tratado como un todo(
...)⍴
r eshape de longitud:⌽⍵M
revertir el M atch⊃
escoger el primero (el dígito)⍎
evaluar∊
ε nlist ( aplanar)≡
repita hasta que no ocurran más cambiosLa función APL Dyalog equivalente es de 47 bytes:
Pruébalo en línea!
fuente
Java 8,
250249241239 bytes-2 bytes gracias a @JonathanFrech (el código contiene dos caracteres ASCII no imprimibles ahora, que se pueden ver en el enlace TIO a continuación).
Suspiro ... Java con expresiones regulares es tan limitado ... Citaré otra respuesta aquí:
Explicación:
Pruébalo en línea.
fuente
Wolfram Language (Mathematica) , 86 bytes
Pruébalo en línea!
fuente
C,
407368 bytesGracias a Jonathan Frech por guardar bytes.
golfed (archivo soporte.c):
sin golfista con el programa:
Compilado con gcc 5.4.1,
gcc bracket.c
fuente
malloc
yrealloc
, inclusostdlib.h
por sí mismo.Rojo , 147 bytes
Sin golf:
Ayer empecé a aprender el dialecto de Red's Parse, así que estoy seguro de que mi código se puede mejorar aún más. Parse es incomparablemente más detallado que regex, pero es muy claro, flexible y legible y se puede mezclar libremente con el resto del lenguaje rojo.
Pruébalo en línea!
fuente
Jalea , 30 bytes
Pruébalo en línea!
Explicación.
fuente
C, 381 bytes
Versión compacta:
Versión completa:
fuente
Python, 80 bytes
Pruébalo en línea!
s("[Foo[Bar]3]2")
Convierte[Foo[Bar]3]2
a''+('Foo'+('Bar')*3+'')*2+''
y se evaluará.No se puede ingresar con comillas entre paréntesis (p
[']3
. Ej. )fuente