Pyramid Scheme es un lenguaje desarrollado por @ ConorO'Brien . En Pyramid Scheme, el código que escribe se ve así:
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
Ahora, ese código tiene dos cualidades obvias: es difícil de analizar y es difícil de escribir. Conor ha resuelto el primero, sin embargo, será su trabajo resolver ese segundo problema.
El intérprete PyramidScheme procesa el código anterior en una matriz de cadenas anidadas, como esta:
[["+", ["9123", "3"]], "3"]
Su tarea es escribir un programa o función que, dado un conjunto anidado de cadenas, genera o devuelve el código PyramidScheme recreado. Puede suponer que la matriz de entrada siempre será válida.
Una pirámide es un triángulo isósceles. La parte superior es ^
, los lados se inclinan diagonalmente con /
y \
, y la parte inferior es -
. Las dos esquinas inferiores están vacías o contienen el comienzo de otras pirámides, que son argumentos. El centro está lleno con el nombre de la pirámide, ignorando los saltos de línea.
Así es como el analizador convierte el código a un formato utilizable. Primero, busca una pirámide de nivel superior. Si no toma argumentos, lo representa con una sola cadena y continúa. De lo contrario, representa es como una matriz ["name",[arg1,arg2]]
o ["name",[arg1]]
. Los argumentos son las pirámides en la parte inferior izquierda e inferior derecha de la pirámide, que pueden ser cadenas o más matrices descritas anteriormente. Puede notar que esto se parece un poco a Lisp, en cuyo caso también puede haber notado el juego de palabras horrible que es el nombre del idioma. Una vez que la pirámide está totalmente representada, el analizador pasa a la siguiente.
Este es el código de golf , ¡el código más corto gana!
Casos de prueba: estos no son los únicos resultados válidos, estos son ejemplos de resultados válidos.
[["+", ["9123", "3"]], "3"]
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
[["out", [["chr", ["72"]], ["chr", ["101"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["111"]]]]]
^ ^ ^ ^
/ \ / \ / \ / \
/out\ /out\ /out\ /out\
^-----^ -----^----- -----^
/ \ / \ / \ / \
/chr\ /chr\ /chr\ /chr\
^----- -----^ -----^ ^-----
/ \ / \ / \ / \
/72 \ /101\ /108\ /111\
----- ----- ----- -----
[ ["+", [ ["asdfghjkl"], ["do", [ "1" ]] ]] ]
^
/ \
/ + \
/ \
^-------^
/a\ /d\
/sdf\ /o \
/ghjkl\ ^-----
-------/1\
---
Observe que en el segundo caso de prueba, la segunda y la tercera out
pirámide tienen ["chr", ["108"]]
un parámetro, que se contrae en una pila de pirámide compartida por dos de nivel superior. Esta es una optimización válida que su código puede admitir, pero es completamente opcional; la puntuación no se basa en la longitud de su salida.
Para los curiosos, el primer caso se muestra 9126 3
debido a la impresión implícita de pirámides de nivel superior, el segundo se imprime Hello
y el último es un error de sintaxis, incluido solo porque tiene una estructura ordenada.
Usted puede asumir que la entrada sólo contiene ASCII imprimible, excluyendo espacios, ^
, /
, \
, y -
. La entrada siempre será válida y contendrá al menos una pirámide. No hay límite en el tamaño de la matriz o las cadenas de entrada, sin embargo, puede escribir su código como si el tipo entero predeterminado de su idioma fuera de precisión infinita y que su computadora tenga memoria arbitraria. Si toma la entrada como una sola cadena, puede usar cualquier cosa razonable (coma, espacio, etc., siempre que esté en ascii imprimible y no "
o []
) para delimitar las matrices. No tiene que incluir corchetes que rodean todo el asunto y, en su lugar, tomar múltiples matrices separadas por su delimitador.
Su salida no tiene que ser golfizada, puede insertar espacio extra o hacer que sus pirámides sean más grandes de lo necesario. Las pirámides de Toplevel deberían estar en la primera línea. La salida debe ser una cadena con nuevas líneas o una lista de cadenas.
Cualquier persona que hace incluirá una versión de su código que juega golf de manera óptima las pirámides puede recibir algún representante en forma de upvotes / bondades (pero probablemente sólo upvotes).
Respuestas:
Lisp común -
25241890 bytesGracias a @coredump por una serie de trucos de golf. Ejemplo de salida de la pregunta:
Aquí está la versión original, (en su mayoría) sin golf:
Pruébalo en línea!
fuente
()
; También puede usar variables de lectura, a vecesloop while (not x)
esloop until x
,(cdr (cdr x))
es(cddr x)
,(setf a b c d)
es más corto que(setf a b)
seguido(setf c d)
, etc. Pero esta ya es una buena respuesta