Fondo
Alice y Bob están creando un lenguaje de golf para ganar cada desafío PPCG. Alice quiere hacer un lenguaje bidimensional, como> <>, pero Bob prefiere una sintaxis de prefijo-infijo como en J. Como compromiso, deciden crear un lenguaje de prefijo-infijo bidimensional. Es difícil escribir el analizador y necesitan tu ayuda.
Especificación de sintaxis
En el lenguaje de Alice y Bob, hay variables , que están representadas por letras minúsculas ASCII a-z
, y funciones , que están representadas por letras mayúsculas ASCII A-Z
. Se puede invocar una función con uno o dos argumentos. Un programa es una cuadrícula rectangular de letras a-zA-Z
y espacios, y la esquina superior izquierda no debe contener un espacio. Este es un ejemplo de un programa válido:
F Gy
H
R x
Cuando se analiza el programa, se transforma en una expresión de un lenguaje de estilo C (C, Java, Python ...) que contiene variables de una sola letra y llamadas a funciones en el formato <func>(<arg>)
o <func>(<arg1>,<arg2>)
. Por ejemplo, el programa anterior da como resultado esta expresión:
F(H(R(x)),G(x,y))
Los detalles del proceso de análisis son los siguientes:
- Los espacios son solo de relleno, por lo que no se analizan.
- Cada variable
a-z
siempre se analiza como sí misma. - Cada función
A-Z
se analiza como una llamada a función. Sus argumentos son las expresiones más cercanas debajo y a su derecha en la cuadrícula, en este orden. Si solo uno de estos está presente, se da como único argumento. Puede suponer que todas las funciones tienen al menos un argumento en la cuadrícula.
En el ejemplo anterior, las variables x
y y
se analizan como ellas mismas. La función R
no tiene nada debajo y x
a su derecha, por lo que se analiza como la invocación de un argumento R(x)
. Del mismo modo, H
se analiza como H(R(x))
, ya que tiene R
debajo de él. La función G
tiene x
por debajo de ella y y
a su derecha, por lo que se analiza como G(x,y)
, y lo mismo para F
. La expresión analizada en la esquina superior izquierda es el resultado del proceso de análisis.
Entrada y salida
Su entrada es una matriz rectangular de caracteres no vacía. Siempre será un programa válido en el lenguaje de Alice y Bob, pero puede contener expresiones que no se utilizan en la salida. Su salida será la expresión analizada resultante del proceso anterior.
Reglas y puntaje
Puede escribir un programa completo de una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
Estos se dan en el formato grid <newline> expression
, con guiones ---
entre los casos. El formato SE deja algunas líneas en blanco, pero deben rellenarse con espacios.
x
x
---
x y
z
x
---
Fx
F(x)
---
Fx
y
F(y,x)
---
ABu
A(B(u))
---
G
H
k
G(H(k))
---
ABCA
x xs
DFk
A(x,B(D(F(k)),C(x,A(s))))
---
A B
C D x
A(C(D(x)),B(D(x)))
---
RT Hq
I xR k
R(I(x),T(H(R(k),q)))
---
A A A a
S A b
B C Dx
d X u f
A(B(d,C(D(f,x))),A(X(u),A(u,a)))
(A (B (D x)) (C (D x)))
sería adecuada o el formato es fijo?Respuestas:
CJam,
676260585754 bytesGracias a Dennis por guardar 4 bytes.
Esto define un bloque con nombre (función)
J
y lo deja en la pila. La función en sí misma espera una matriz de cadenas en la pila, que representa la cuadrícula de entrada, y deja la cadena deseada en su lugar.Pruébalo aquí.
He tenido la intención de abordar esto desde que se publicó, pero aparentemente necesitaba una recompensa y una solución Pyth demasiado larga para motivarme lo suficiente.
Explicación
La solución es, por supuesto, recursiva y aumenta gradualmente la cadena.
fuente
Python 2,
227223192182179177 bytes(Los cuatro espacios son de hecho pestañas)
Toma una lista 2d de caracteres como primer argumento para r.
fuente
Pyth, 97 bytes
Dios mío, que tardó mucho en hacer (¿aproximadamente 5/6 horas?). Pyth realmente no fue diseñado para esto ...
Probarlo aquí .
Intento de explicación, así como el equivalente de Python
Donde las funciones
Pprint
yassign
devolver lo que se les da.fuente
Haskell,
124122120119 bytesEjemplo de uso:
(#id) ["RT Hq ","I xR k"]
->"R(I(x),T(H(R(k),q)))"
.Cómo funciona: además de la cuadrícula de entrada
r
, la función#
toma otra funcióng
como argumento que se aplicar
siempre que el carácter superior izquierdo es un espacio. Si se trata de un carácter en minúscula, devuélvelo. De lo contrario, debe ser un carácter en mayúscula y#
se llama de forma recursiva, una veztail
para bajar y otramap tail
para ir a la derecha.!
une los resultados de las llamadas recursivas con a,
, si es necesario. Todo comienza con la cuadrícula de entrada y la función de identidad.fuente
Python 3, 187 bytes
Todavía estoy buscando maneras de jugar golf, pero estoy contento de haber logrado convertirlo en una frase.
fuente