Por razones principalmente históricas, bash es una mezcla de paradigmas de sintaxis y programación; esto puede hacer que jugar golf sea incómodo y, a veces, frustrante. Sin embargo, tiene algunos trucos bajo la manga que a menudo pueden hacerlo competitivo con otros guiones convencionales. idiomas Una de ellas es la expansión de llaves .
Hay dos tipos básicos de expansión de llaves:
- Las llaves de lista pueden contener listas de cadenas arbitrarias separadas por comas (incluidos los duplicados y la cadena vacía). Por ejemplo,
{a,b,c,,pp,cg,pp,}
se expandirá aa b c pp cg pp
(tenga en cuenta los espacios alrededor de las cadenas vacías). - Las llaves de secuencia pueden contener puntos finales de secuencia separados por
..
. Opcionalmente,..
puede seguir otro , seguido de un tamaño de paso. Los puntos finales de secuencia pueden ser enteros o caracteres. La secuencia ascenderá o descenderá automáticamente según el punto final que sea mayor. Por ejemplo:{0..15}
se expandirá a0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{-10..-5}
se expandirá a-10 -9 -8 -7 -6 -5
{3..-6..2}
se expandirá a3 1 -1 -3 -5
{a..f}
se expandirá aa b c d e f
{Z..P..3}
se expandirá aZ W T Q
Más allá de esto, la secuencia y las llaves de lista pueden existir con llaves de lista:
{a,b,{f..k},p}
se expandirá aa b f g h i j k p
{a,{b,c}}
se expandirá aa b c
Las llaves se expanden con cadenas que no son espacios en blanco a cada lado de ellas. Por ejemplo:
c{a,o,ha,}t
se expandirá acat cot chat ct
Esto también funciona para múltiples llaves concatenadas juntas:
{ab,fg}{1..3}
se expandirá aab1 ab2 ab3 fg1 fg2 fg3
Esto puede ser bastante complejo. Por ejemplo:
{A..C}{x,{ab,fg}{1..3},y,}
se expandirá aAx Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
Sin embargo, si hay espacios en blanco entre las expansiones, entonces simplemente se expanden como expansiones separadas. Por ejemplo:
{a..c} {1..5}
se expandirá aa b c 1 2 3 4 5
Tenga en cuenta cómo se conserva siempre el orden.
Las entradas para este desafío expandirán las expansiones de llaves bash como se describió anteriormente. En particular:
- eval by
bash
(u otros shells que realizan una expansión similar) no está permitido - las llaves de secuencia siempre serán número a número, minúsculas a minúsculas o mayúsculas a mayúsculas sin mezcla. Los números serán enteros en el rango de 32 bits con signo. Si se proporciona, el tamaño de paso opcional siempre será un número entero positivo. (Tenga en cuenta que bash también se expandirá
{A..z}
, pero esto puede ignorarse para este desafío) - los elementos individuales en llaves de lista siempre estarán compuestos solo por caracteres alfanuméricos en mayúsculas y minúsculas (cadena vacía incluida)
- la lista de llaves puede contener anidaciones arbitrarias de otras expansiones de llaves
- Las llaves se pueden concatenar números arbitrarios de veces. Esto estará limitado por la memoria de su idioma, por lo que la expectativa es que en teoría pueda hacer números arbitrarios de concatenaciones, pero si se queda sin memoria, eso no contará en su contra.
Los ejemplos en el texto anterior sirven como casos de prueba. Resumiendo, con cada línea de entrada correspondiente a la misma línea de salida, son:
Entrada
{0..15}
{-10..-5}
{3..-6..2}
{a..f}
{Z..P..3}
{a,b,{f..k},p}
{a,{b,c}}
c{a,o,ha,}t
{ab,fg}{1..3}
{A..C}{x,{ab,fg}{1..3},y,}
{a..c} {1..5}
{a{0..100..10},200}r
Salida
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-10 -9 -8 -7 -6 -5
3 1 -1 -3 -5
a b c d e f
Z W T Q
a b f g h i j k p
a b c
cat cot chat ct
ab1 ab2 ab3 fg1 fg2 fg3
Ax Aab1 Aab2 Aab3 Afg1 Afg2 Afg3 Ay A Bx Bab1 Bab2 Bab3 Bfg1 Bfg2 Bfg3 By B Cx Cab1 Cab2 Cab3 Cfg1 Cfg2 Cfg3 Cy C
a b c 1 2 3 4 5
a0r a10r a20r a30r a40r a50r a60r a70r a80r a90r a100r 200r
Respuestas:
Ruby,
405403401400 bytesUn hombre sabio (Jamie Zawinski) dijo una vez: "Algunas personas, cuando se enfrentan a un problema, piensan 'Lo sé, usaré expresiones regulares'". Ahora ellos tienen dos problemas."
No creo que aprecie completamente esa cita hasta que traté de resolver este problema con expresiones regulares recursivas. Inicialmente, los casos de expresiones regulares parecían simples, hasta que tuve que lidiar con los casos extremos que involucraban letras adyacentes a los corchetes, y luego supe que estaba en el infierno.
De todos modos, ejecútelo en línea aquí con casos de prueba
Sin golf:
fuente
Python 2.7,
752728 bytes¡Guau, esto es como un montón de golf de código en un desafío!
Gracias a @Neil por acortar una lambda
Explicación
b
: calcula el rango según las especificaciones.e
: devuelve la posición de la primera llave de cierre más externa. Iterativo.m
: divide los elementos más externos en comas. Recursivo.n
: combina matrices mientras busca vacíos.No pude irand/or
a trabajar.p
: Donde se realiza la mayor parte del trabajo. Comprueba todos los casos (Rango, solo lista, debe combinarse). Recursivo.o
: Lo que debe tomar entrada. Formatos de entrada / salida ap
.Siento que puedo mejorar en algunos lugares, así que intentaré jugar más al golf. También debería poner más detalles en la explicación.
fuente
[c+d for c in a for d in b] or a or b
trabajar.JavaScript (Firefox 30-57),
465427425 bytesLa versión ES6 de
f
pesa 10 bytes adicionales:Explicación: Comienza cambiando los espacios en comas y envolviendo toda la cadena
{}
para lograr consistencia (gracias a @Blue por la idea). Luego busca todas las{..}
construcciones y las expande en{,}
construcciones. Luego usa la recursión para expandir repetidamente todas las{,}
construcciones de adentro hacia afuera. Finalmente reemplaza todas las comas con espacios.fuente