Otro problema de análisis de Brainfuck, pero esta vez ... diferente.
Estás trabajando en Infinite Monkeys Incorporated, la compañía que desarrolla los programas Brainfuck, para resolver varios problemas interesantes (por accidente, nada menos, después de todo, la compañía hace programas aleatorios). Sin embargo, parece que las máquinas rápidas de Turing que solo ejecutan Brainfuck tienen un pequeño y costoso problema con los errores de sintaxis: crea uno y la computadora explota. Probablemente sea un defecto de diseño, pero nadie se había molestado en descubrir por qué sucede.
Como las máquinas de Turing (especialmente las rápidas) son caras (después de todo, tienen RAM infinita que cuesta), sería mejor asegurarse de que el programa no tenga errores de sintaxis antes de ejecutar el código. Su empresa ejecutará mucho código, por lo que la verificación manual no funcionará. Escriba un programa que lea el STDIN para el código Brainfuck y salga con el estado de salida establecido en cualquier cosa que no sea 0 (error) si el programa tiene algún error de sintaxis (por ejemplo,
]
es un error de sintaxis, porque no hay coincidencia[
). Salga con el estado de salida establecido en 0 si el programa está completamente bien.Asegúrese de que su programa advierta correctamente los errores relacionados
[]
. No querrías que explotara otra computadora, ¿verdad? Ah, y asegúrese de que sea lo más breve posible: su jefe paga los programas cortos (porque cree que son rápidos o algo así). Ah, y no tiene que codificar en Brainfuck (de hecho, no puede, porque Brainfuck no admite códigos de salida): su código se ejecutará en una computadora normal.
Entonces, como puede ver, su trabajo es verificar si el programa Brainfuck es "válido" (tiene []
símbolos emparejados ). Tenga en cuenta que los programas Brainfuck pueden tener otros caracteres que []
no sean , así que no rechace el programa solo porque tiene otros comandos. El código más pequeño gana, pero de todos modos probablemente te interesarían más los votos a favor.
fuente
GCD(a,b)
lugar de0 != a || b
.Respuestas:
GolfScript, 18 caracteres
Este código se ejecuta con éxito con el código de salida 0 (e imprime algo de basura en stdout) si los corchetes en la entrada están equilibrados. Si no lo están, falla con un código de salida distinto de cero e imprime un mensaje de error en stderr, por ejemplo:
o
Como el desafío no dijo nada sobre la salida a stdout / stderr, creo que esto califica. En cualquier caso, siempre puedes redirigirlos a
/dev/null
.Explicación:
El código
{[]`?)},
elimina todo menos los corchetes de la entrada, y~
evalúa el resultado como código GolfScript. La parte difícil es que los corchetes desequilibrados son perfectamente legales en GolfScript (y, de hecho, ¡mi código incluye uno!), Por lo que necesitamos otra forma de bloquear el código.El truco que estoy usando es dejar una copia de la entrada en la parte inferior de la pila, recopilar toda la pila en una matriz (usando el desequilibrado
]
) y desactivar el primer elemento. En este punto, pueden suceder tres cosas:[
, tratar de cambiar un elemento de una matriz vacía bloqueará el intérprete (que, en este caso, ¡es exactamente lo que queremos!)]
o un no cerrado[
) será una matriz.Mi entrada original de 14 caracteres comparó el valor desplazado con una cadena, que se bloquearía si fuera una matriz anidada. Desafortunadamente, resulta que comparar una matriz plana (o, en particular, vacía) con una cadena también es legal en GolfScript, por lo que tuve que cambiar de táctica.
Mi presentación actual, en cambio, utiliza un método de fuerza bruta para distinguir las matrices de las cadenas: las des-evalúa e intenta encontrar la primera aparición de
[
(código ASCII 91), que será cero si y solo si no se evade variable fue una matriz. Si es así, dividir el cero consigo mismo desencadena el bloqueo deseado.PD. Otras dos soluciones de 18 caracteres son:
y
Por desgracia, todavía no he encontrado una forma más corta de resolver el "problema de matriz vacía".
fuente
][
(es decir, ¿falla en su programa?)[[]
; Lo arreglé ahora, al costo de 4 caracteres, y ahora pasa todas mis pruebas.1+
convertirá una matriz vacía en una matriz no vacía, una matriz no vacía en una matriz no vacía y una cadena en una cadena..{[]`?)},~](n<
. Intenté su1+
, pero parece que la matriz necesita contener algo más que un número (presumiblemente para que el intérprete se bloquee cuando intenta comparar recursivamente un personaje con una matriz / cadena). El uson+
no funciona bien, ya que coacciona a la matriz en una cadena;[n]+
hace el trabajo, pero todavía me pone a los 18 caracteres.Brainfuck 76 bytes
Esto desaparece si sus corchetes están desequilibrados, lo que hace que el intérprete / compilador bf falle en tiempo de ejecución y algunos de ellos tienen códigos de salida para reflejar eso.
requiere eof = 0, valores de ajuste y número finito de celdas
En Ubuntu puedes usar el intérprete
bf
(sudo apt-get install bf
)fuente
Brainfuck
Turing se completa sin E / S, ya que puede ejecutar un programa que calcula cualquier cálculo y ver el resultado inspeccionando su memoria después de ejecutarlo. BF sin E / S haría que las personas estuvieran menos interesadas, ya que sería difícil hacer utilidades. Por ejemplo, nunca podría haber hecho mi intérprete lisp .Befunge 98 -
26312019 caracteresSe deshizo de algunos condicionales masivos. Ahora el programa funciona de la siguiente manera:
q
sale del programa y muestra el valor superior como un valor de error. El valor de error será-11 si hay demasiados]
, 0 si están equilibrados ypositivonegativo si hay demasiados[
. Si el número espositivonegativo, entonces se necesitanmuchos delos valores absolutos de ese número]
para equilibrar el programa.Editar: Incremento y decremento conmutados.
[
usado para incrementar el contador y]
usado para disminuirlo. Al cambiarlo, ahorro 1 carácter, porque para la condición de salida, solo tengo que verificar si el contador es positivo, en lugar de negativo.Versión antigua
Este código funciona de la siguiente manera:
Editar: me di cuenta de que esto aceptaba entradas
][
, ahora termina cada vez que el recuento se vuelve negativo, usandofuente
[
y]
para hacer la comparación con ambos.J (
3835)Explicación:
1!:1[3
: leer stdin'[]'=/
: crea una matriz donde la primera fila es una máscara de bits de la[
s en la entrada, y la segunda fila es la]
s.1 _1*
: multiplica la primera fila por 1 y la segunda fila por -1.+/
: suma las columnas de la matriz juntas, dando sangría delta por carácter+/\
: crea un total acumulado de estos, dando un nivel de sangría en cada personaje({:+.<./)
: devuelve el MCD del elemento final ({:
) y el elemento más pequeño (<./
). Si todos los frenos coinciden, ambos deberían ser0
así para que esto regrese0
. Si las llaves no coinciden, devolverá un valor distinto de cero.exit
: establezca el valor de salida en eso y salga.fuente
rubí (64)
anteriormente (68) era:
Otra solución equivalente utiliza
no se puede usar
size
solo porque daría falsos negativos (!!!) cuando el número total de paréntesis desequilibrados es múltiplo de 256fuente
=
operador.0
can pueden ir.Perl, 30 caracteres.
Tu expresión regular recursiva de Perl al rescate:
Para aquellos que no están familiarizados con los argumentos de la línea de comandos utilizados aquí:
-0
permite establecer el carácter de final de línea para la entrada del archivo; el uso-0
sin argumento establece el carácter de final de línea en EOF.-n
lee automáticamente la entrada (en este caso, el archivo completo) de$_
antemano.Si la expresión regular coincide, devuelve un valor verdadero, que se niega a 0 para el código de salida. De lo contrario, el valor de retorno falso produce un código de salida de 1.
fuente
bash (tr + sed) - 42
Si no le importan los mensajes de error, puede eliminar el último espacio entre
`
y]
para obtener la longitud 41.fuente
cat
y$()
(también"[]"
se puede escribir como[]
). Acepté esta respuesta, pero hasta que vea mejoras en la longitud, no voy a votar esto, ya que si bien es corto, podría ser mucho más corto para bash.$()
con backticks e hice el"[]"
->[]
que sugirió.Perl (56 caracteres)
La solución obvia de Perl: una expresión regular recursiva. Lamentablemente es una construcción bastante detallada.
fuente
Haskell (143)
jgon: Usar 2 guardias parece ser más denso que if-then-else. Además, no creo que el suyo verifique que los corchetes estén en el orden correcto ("] [" pasa)
fuente
C,
7364 caracteresGracias a las sugerencias de breadbox (aunque esto probablemente requiera little-endian para funcionar):
Cómo funciona:
i
se inicializa a 0c
se convierte en un int implícito que obtieneargc
(inicializado a 1 pero no nos importa, siempre y cuando los bits más altos no estén configurados)read(0,&c,1)
lee un solo carácter en el byte bajo de c (en arquitecturas little-endian) y devuelve 0 en EOF;i+1 != 0
a menos que la cita del paréntesis equilibrado vaya a -1; multiplicarlos juntos funciona como un booleano (seguro) Y que requiere un carácter menos que&&
c==91
evalúa a 1 para'['
yc==93
evalúa a 1 para']'
. (Puede haber algún truco complicado que sería más pequeño, pero no puedo pensar en nada).return i
sale con el código de estado 0 si está equilibrado, no es cero si no lo está. Devolver -1 técnicamente viola POSIX, pero a nadie realmente le importa eso.Versión previa:
fuente
getchar()
lugar de leer acortará el código y le permitirá usar (implícito) enint
lugar dechar
para su variable. También recuerde que los globales se inicializan automáticamente a cero.c;
define un int global.][
? Estoy seguro de que no está equilibrado. ¿No tienes que hacer un seguimiento si se vuelve negativo al menos una vez?Lua, 56
fuente
"^%b[]$"
¿Que es esto? ¿Puedes explicar? Seguramente, esto no es regex?^
), el conjunto equilibrado de[
y]
con cualquier cosa entre (%b[]
) y el final de la cadena ($
).GTB , 55
Señoritas
[]
Use
0
para parar.fuente
MATEMÁTICA, 88 caracteres
fuente
s name like
RegularExpression` yStringLength
nunca puedo ganar contexto de golf de código de texto con Mathematica! :)ToCharacterCode
es mucho más largo queord
también ... PD: ¿Qué pasa con la configuración de un código de salida?Length[StringCases[s,"["|"]"]//.{x___,"[","]",y___}:>{x,y}]
Rubí,
5958Busca el corchete de apertura y cierre, contando
[
como 1 y]
como -1, y sale si el recuento cae por debajo de 0.fuente
exit 1
en blanco después en caso de que lo solicite).Hasio , 104 bytes
Completamente expandido (la nota no funciona en el intérprete en línea ya que la entrada () está deshabilitada) aquí
fuente
Código de máquina de Turing,
286276 bytesNuevamente, estoy usando la sintaxis de la tabla de reglas definida aquí.
Termina en estado
halt
para aceptar la entrada yhalt-err
rechazarla.fuente
halt-err
puede ser más corto, comohalt*
por ejemplo.Pyth, 25 bytes
Pruébalo en línea!
Traducción de Python 3:fuente
Haskell
167, 159)Lo hice principalmente por diversión, si alguien tiene alguna sugerencia sobre cómo hacerlo más corto, me alegraría escucharlo aunque :)
Editar: solucionó un problema que me señalaron en los comentarios (se agregaron 11 bytes).
Edición 2: función auxiliar creada para probar predicados utilizando guardias inspirados en el usuario 1350, eliminando 8 bytes.
fuente
][
( señalado por user13350 )Stax ,
1411 caracteresEjecutar y depurarlo
Crédito a @recursive para -3 bytes.
ASCII equivalente:
Elimine todos los caracteres excepto
[]
, luego elimine[]
hasta que la cadena ya no cambie. Regrese1
si la cadena final está vacía.fuente
.[]|&
para filtrar los caracteres, y luego reutilizar el literal para 11