Prelude es un lenguaje de programación esotérico, que tiene muy pocas, pero inusuales, restricciones sobre lo que constituye un programa válido. Cualquier bloque de texto ASCII imprimible ("bloque" significa que las líneas de ASCII imprimibles están separadas por nuevas líneas - 0x0A) es válido siempre que:
- Cada columna de texto (vertical) contiene como máximo uno de
(y). - Ignorando su posición vertical, los
(y)están equilibrados, es decir, cada uno(está emparejado con exactamente uno)a la derecha de la misma, y viceversa.
Escriba un programa o función que, dada una cadena que contenga ASCII imprimible y líneas nuevas, determine si constituye un programa Prelude válido. Puede recibir información a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función. El resultado puede devolverse o imprimirse a STDOUT, utilizando cualquiera de los dos valores de verdad / falsedad fijos que elija.
Debe no asume que la entrada es rectangular.
Este es el código de golf, por lo que gana el envío más corto (en bytes).
Ejemplos
Los siguientes son programas Prelude válidos (de hecho, incluso son programas Prelude reales ):
?1-(v #1)-
1 0v ^(# 0)(1+0)#)!
(#) ^#1-(0 #
1(# 1) v # - 1+)
vv (##^v^+
? v-(0 # ^ #)
?
1+ 1-!
Y aquí hay una serie de entradas, todas las cuales no son válidas :
#(#(##)##)##(
)##(##(##)#)#
#(#)
)###
#(##
(##)
(##)
(#)#
(##)
(###
#(#)
(##)
#(#)
###)
#()#
()##
#(#)##
###
###(#)
fuente

)y 2(. ¿No debería ser solo 1 por línea?Respuestas:
CJam,
5756 bytesDemasiado tiempo, se puede jugar mucho al golf. Explicación que se agregará una vez que lo juegue.
Breve explicacion
Hay dos verificaciones en el código:
Number of "(" - Number of ")") debe complementarse mutuamente. Entonces, cuando los sumas, debería resultar en 0. Cualquier parte que falle esta propiedad hace que toda la entrada tenga corchetes no coincidentes.Number of "(" - Number of ")"no puede ser negativo para el bloque del lado derecho.Pruébalo en línea aquí
fuente
Python 2,
128119105 bytes¿Sabía que puede asignar Ninguno en Python 2?
Explicación
Queremos comenzar transponiendo el Preludio para que las columnas se conviertan en filas. Por lo general, haríamos esto con
zip, pero dado que seziptrunca a la longitud de fila más corta yitertools.zip_longestes demasiado larga para el golf de código, parece que no hay una forma corta de hacer lo que queremos ...Excepto para el mapeo
None:Desafortunadamente (o más bien, afortunadamente para todos los propósitos que no sean de golf), esto solo funciona en Python 2.
En cuanto a
nyv:nactúa como una pila, contando1 - <number of unmatched '(' remaining>. Por cada(que vemos, restamos 1, y por cada)que vemos sumamos 1. Por lo tanto, sin >= 2en algún momento, hemos visto demasiados)sy el programa no es válido. Sinno termina en 1, entonces tenemos al menos un(resto sin igual .vcomprueba la validez y comienza en 1. Si el programa no es válido (n >= 2oA+B >= 2), sevconvierte en 0 para marcar la invalidez.Por lo tanto, si el programa es válido, al final debemos tenerlo
n = 1, v = 1. Si el programa no es válido, al final debemos tenerv = 0, ov = 1, n <= 0. Por lo tanto, la validez se puede expresar sucintamente comon*v>0.(¡Gracias a @feersum por una multitud de buenas sugerencias que despegaron 14 bytes!)
Envío anterior, más legible:
fuente
map...def F(p): v=n=3 for r in map(None,*p.split("\n")):A,B=map(R.count,"()");n+=A-B;v*=n>2>A+B return n*v==9oren el encadenamiento de comparación, pero yo no había pensado en cambiar|=a*=. Sin embargo, eliminó otro byte, haciendo las cosas aún más al revés :)J, 64 bytes
La entrada es una cadena con una nueva línea final. La salida es 0 o 1.
Ejemplo de uso
El método es el siguiente.
];.2(/)/anything elseen1/-1/01 _1 0{~[:'()'&i.]s=.+/@:adverbio que agregado a un verbo suma la salida de la matriz de verbosagregar valores en columnas
]s()saldo positivo en cada prefijo[:(0>])s)[:+/\]()saldo igual en toda la lista (es decir, en el último prefijo)|@{:@]agregue abs (valores) en columnas y verifique que cada elemento tenga un valor máximo de 1
(1<|s)sComo todas las comprobaciones anteriores arrojaron resultados positivos en caso de fallo, las sumamos y las comparamos con 0 para obtener la validez de la entrada
0=]fuente
J, 56 bytes
Esa es una función anónima que acepta una cadena con una nueva línea final y devuelve 0 o 1. Lectura de derecha a izquierda:
];.2 y, como en la otra presentación J, corta la cadenayen todas las apariciones de su último carácter (por lo que la entrada necesita una nueva línea final) y crea una matriz rectangular cuyas filas son las piezas, rellenadas con espacios si es necesario.'()'=/compara cada carácter en esa matriz primero con(y luego con la)devolución de una lista de dos matrices 0-1.+.^:_1]0|:convierte esa lista de dos matrices en una única matriz de números complejos. Hasta ahora, el programa convierte cada(entrada en un 1, cada una)en i y cualquier otro carácter en 0.b=.+/asigna la suma de las filas de esa matriz compleja ab.-.|bhace una lista de 1- | z | por cada z enb. La condición de que cada columna contenga como máximo un paréntesis se traduce en todos estos números 1- | z | ser no negativo+/\*:bes el vector de ejecutar sumas de los cuadrados de los números enb. Si cada columna contiene como máximo un paréntesis, los cuadrados de los númerosbson todos 0, 1 o -1. Los,concatena este vector con el vector de 1- | z | 's.ahora todo lo que tenemos que hacer es probar que las entradas de nuestro vector concatenado
vson números reales no negativos, esto es casi*/0<:v, excepto que causa un error si algunas entradas devno son reales, por lo que reemplazamos<:con el<: ::0:que solo devuelve 0 en caso de error .fuente
0={:+/\*:bpor ejemplo, porque(no es válido.0=(-|)ves 2 bytes más corto para verificar reales no negativos. (¡Vamos a vencer a CJam!: P)invlugar de^:_1guardar otro byte.3 :'*/0=({:,]-|)(-.@|,+/\@:*:)+/+.inv]0|:''()''=/];.2 y'.