Pyth es quizás el lenguaje de golf de propósito general más exitoso. Aunque está algo en declive como resultado de los idiomas más nuevos, de 2014 a 2016 la sintaxis concisa de Pyth, las actualizaciones constantes, la sobrecarga y (para su época) muchas incorporaciones lo convirtieron en el favorito para la mayoría de las preguntas.
El código Pyth es a menudo difícil de leer. Incluso la salida del modo de depuración (Python transpilado) a menudo consiste en una línea larga, a veces con paréntesis anidados de diez de profundidad. Sin embargo, Pyth formateado correctamente es muy legible.
Aquí hay un fragmento de código Pyth, escrito por @isaacg en Play the Word Chain .
.MlZfqhMtTeMPT+Lzs.pMyQ
Es mucho más legible como este.
.M Filter by gives-maximal-value of
l Z lambda Z:length(Z) over
f filter by (lambda T:
q equal
hM t T head-map tail T
eM P T end-map Pop T)
+L Append z to each element in
z
s .pM y Q flattened permutations of each subset of Q
Para este desafío, eliminamos el aspecto de complejidad kolmogorov de categorizar los caracteres Pyth y centrarnos en el formateo. En lugar de ser código Pyth, la entrada consistirá en caracteres en 0123456789M
. El dígito n
representa una función de aridad n
y M
representa un operador. Por ejemplo, el código anterior se representa como 210221M101M102M011M10
. Estos son los pasos para desminificar:
Separa la cuerda en fichas.
Un token coincide [0-9]M*
. 0M
no ocurrirá en la entrada.
Añadir ceros finales.
Cuando no hay suficientes argumentos, Pyth agrega tantas variables implícitas (variables lambda o Q
s) al código como sean necesarias para completar los argumentos del programa; estos deben estar representados por 0
s.
Agrupe las fichas en líneas.
La aridad de una ficha es el valor de su dígito.
Un token arity-0 (es decir, un 0) termina una línea.
Para una ficha arity-1, la siguiente ficha debe ir en la misma línea, separada por un espacio.
Para un token arity> = 2, sus argumentos van en líneas separadas, en el orden en que aparecen en el código, cada uno seguido de sus propios subargumentos, etc. Los argumentos de una ficha están sangrados al final de esa ficha más un espacio.
Entrada
Una cadena no vacía (o matriz de caracteres, matriz de cadenas de longitud 1, etc. según lo permitido por los métodos de E / S estándar) que consta de 0123456789M
, que no contendrá la subcadena0M
.
Salida
La cadena formateada de acuerdo con las reglas anteriores.
Casos de prueba
210221M101M102M011M10
2
1 0
2
2
1M 1 0
1M 1 0
2M
0
1 1M 1 0
123M4M
1 2
3M
4M
0
0
0
0
0
0
0
2MM
2MM
0
0
11011100
1 1 0
1 1 1 0
0
9000000
9
0
0
0
0
0
0
0
0
0
210221M101M102M011M10
sería[2,1,0,2,2,1,'M',1,0,1,'M',1,0,2,'M',0,1,1,'M',1,0]
M
se permite que los s sean un tipo de datos diferente de los enteros.M
?Respuestas:
Javascript (ES8),
160159 bytesPruébalo en línea!
Comentado
fuente
Haskell ,
192190187 bytesPruébalo en línea!
Tiene que haber una mejor manera de manejar el caso arity-1, actualmente ocupa 45 bytes.
Ediciones:
pred
lugar den-1
.Pruébalo en línea!
fuente
Carbón de leña , 75 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Pase los caracteres de entrada y conviértalos en una lista de dígitos con
M
sufijos opcionales .Invierta esta lista para que podamos usarla
Pop
para consumirla.Esta variable es una pila de tokens cuyo arity aún no se ha cumplido.
Esta variable es una pila de la aridad restante de las fichas no cumplidas.
Repite hasta que hayamos consumido todas las fichas y vaciado la pila.
Obtenga el siguiente token o
0
si ninguno.Imprima el token y luego mueva el cursor horizontalmente si comienza de
1
otra manera en diagonal.Agregue el token y su arity a las variables apropiadas.
Repita mientras la pila de arity no está vacía, pero la arity superior es cero.
Descarta la aridad cero.
Elimina su ficha y mueve tantos caracteres restantes.
Si quedan aridades restantes, disminuya la aridad superior.
fuente