Brain-Flak (un cruce entre Brainf ** k y Flak-Overstow) es un lenguaje esotérico basado en la pila. Desde que se publicó este desafío, el lenguaje ha evolucionado y actualizado, pero esta primera revisión del lenguaje se conoce como "clásico de ataque cerebral".
Debe escribir un programa o función que tome una cadena de código clásico Brain-Flak y lo evalúe. También tomará una lista (posible vacía) de enteros. Hay entradas para el programa clásico Brain-Flak.
El idioma
Brain-Flak tiene dos pilas, conocidas como 'izquierda' y 'derecha'. La pila activa comienza a la izquierda. Si aparece o se mira una pila vacía, devolverá 0. No hay variables. Cuando se inicia el programa, cada entrada se inserta en la pila activa en orden (de modo que la última entrada esté en la parte superior de la pila).
Los únicos caracteres válidos en un programa Brain-Flak son ()[]{}<>
, y siempre deben estar equilibrados . Si hay caracteres no válidos o los corchetes no coinciden, obtendrá un comportamiento indefinido. Todo es valido.
Hay dos tipos de funciones: Nilads y Mónadas . Un nilad es una función que toma 0 argumentos. Aquí están todas las nilas:
()
+1.[]
-1.{}
Pop la pila activa.<>
Alternar la pila activa.
Estos se concatenan juntos cuando se evalúan. Entonces, si tuviéramos un '3' en la parte superior de la pila activa, este fragmento:
()(){}
evaluaría a 1 + 1 + active.pop()
cuál evaluaría a 5. <>
evalúa a 0.
Las mónadas toman un argumento, un trozo de código Brain-Flak. Aquí están todas las mónadas:
(n)
Presione 'n' en la pila activa.[n]
Imprima 'n' como int y newline.{foo}
Mientras active.peek ()! = 0, haz foo. Evalúa a 0¹.<foo>
Ejecute foo, pero evalúelo como 0.
Estas funciones también devolverán el valor dentro de ellas, por lo que
(()()())
Empujará 3 y
[()()()]
Imprimirá 3 pero
[(()()())]
Imprimirá y empujará 3.
Cuando el programa termina de ejecutarse, cada valor que queda en la pila activa se imprime como un entero, con una nueva línea entre ellos. Los valores en la otra pila se ignoran.
Reglas:
Su programa debe admitir números en el rango (-128, 127) y un tamaño de pila de al menos 255. Si admite más grande, excelente.
Underflow / overflow no está definido.
Muestra IO:
El programa vacío:
Entrada: ninguna
Salida: ninguna
Adición. Fuente:
({}{})
Entrada:
2, 3
Salida:
5
Sustracción. Fuente:
({}<>){({}[])<>({}[])<>}<>
Entrada:
2, 3
Salida:
-1
Multiplicación. Fuente:
({}<>)<>({}[]){({}[])<>(({}))<>}<>{({}<>{})<>}<>
Entrada:
7, 8
Salida:
56
Fibonacci Fuente:
<>((()))<>{({}[])<>({}<>)<>(({})<>({}<>))<>}<>
Entrada:
5
Salida:
13
8
5
3
2
1
1
{[({})]}
Se aplican las lagunas estándar y gana la respuesta más corta en bytes.
- ¹: Esto fue realmente un error de mi parte.
{...}
debe evaluar la suma de todas sus ejecuciones, que es IMO una de las mejores características de brain-flak. Sin embargo, para los propósitos de este desafío, suponga que se{...}
evalúa como 0.
fuente
{...}
evalúa la mónada ?{...}
evalúa a 0. Además, los argumentos se ordenan, por lo que2
se empuja, luego3
se empuja, de modo que cuando se inicia el programa, la segunda entrada (3
) está en la parte superior de la pila. Aclararé a los dos en la publicación.Respuestas:
Pip
-n
,15114810198 bytesToma la lista de entradas como argumentos de línea de comandos y el código Brain-Flak de (una línea de) stdin. Pruébalo en línea!
Editar: guardé una gran cantidad de bytes sobre mi enfoque original al cambiar a una estrategia de traducir y evaluar.
Ungolfed y comentó
Esta versión también incluye algunos resultados de depuración que muestran el código Pip que resulta de la traducción, así como el contenido de la pila después de la ejecución.
fuente
Brain-Flak Classic ,
127112471239 bytesPruébalo en línea!
+4 bytes de arreglar un error con la condición en el
{...}
mónada, y -36 bytes de varios campos de golf.1238 bytes de código, +1 byte para el
-a
indicador (que se puede combinar con el indicador de idioma).Esto ahora evalúa
{...}
como cero según la especificación de desafío. Tenga en cuenta que Brain-Flak se ha evaluado{...}
como la suma de todas las ejecuciones desde la corrección de errores del 7 de mayo de 2016 dos días antes de que se publicara este desafío.El siguiente código interpreta Brain-Flak Classic correctamente, con
{...}
la suma de todas las ejecuciones. La única diferencia entre los dos intérpretes es la colocación de una{}
nilad.Pruébalo en línea!
La entrada (a cualquiera de los intérpretes) es el programa Brain-Flak Classic para interpretar, luego una nueva línea, luego una lista de enteros separados por espacios. No se realiza validación en la entrada. Se requiere la nueva línea, incluso si el programa o la entrada están en blanco.
El primer paso es analizar toda la entrada, comenzando con los corchetes:
Luego se analizan los enteros. Esto normalmente no sería necesario, pero la entrada se tomó como ASCII. Sin embargo, esto tiene un lado positivo: el ingreso de texto nos permite determinar la altura de la pila, lo que simplifica las cosas cuando no tenemos acceso a la altura de la pila nilad.
Los enteros se analizan en dos números en la segunda pila: uno para el valor absoluto y otro para el signo. Estos se mueven de nuevo a la primera pila.
Las pilas interpretadas se almacenan debajo del código en la primera pila en el siguiente orden: altura de pila actual, pila actual, otra altura de pila, otra pila. El 0 para la otra altura de la pila no necesita ser empujado en este punto, ya que será un cero implícito la primera vez que se lea.
La representación del código ahora se mueve de regreso a la pila izquierda. Para facilitar las cosas más adelante, restamos 4 de los corchetes de apertura de nilads, para que cada operación tenga un número entero único de -1 a -8.
La parte principal del programa es interpretar las instrucciones. Al comienzo de cada iteración del bucle principal, la instrucción actual está en la parte superior de la pila izquierda, todo lo que está debajo está en la misma pila, y todo lo que está antes en la pila derecha. Tiendo a visualizar esto como si tuviera un libro abierto en una página determinada.
Después de salir del bucle principal, todo el código está en la pila correcta. Las únicas cosas en la pila izquierda son un cero y las dos pilas interpretadas. Producir la salida correcta es una cuestión simple.
fuente
{...}
, que es el comportamiento correcto para el clásico cerebro-flak moderno y (creo) cerebro-flak clásico, sin embargo, escribí en el desafío que{...}
evalúa como 0. Probablemente podría jugar un número significativo de bytes de eliminando esa funcionalidad, aunque sería bueno mantener el original alrededor porque es técnicamente más correcto en general (simplemente incorrecto para este desafío)APL,
255257 bytesEsto toma el programa como su argumento derecho, y la entrada del programa como su argumento izquierdo, es decir:
Versión sin golf: aquí .
fuente
APL (Dyalog Classic) , 146 bytes
Pruébalo en línea!
un clásico interpretando otro :)
fuente
Python 3, 429 bytes
Utilizado como
g('[{}{}]', 2, 3)
Se utiliza
re.sub
para "compilar" la fuente de ataque cerebral a Python y luego ejecuta la pitón. (para depurar, reemplaceexec
conprint
para obtener una lista del código de Python)La sangría adecuada anidada mientras los bucles consume muchos bytes en el código.
fuente
Python, 616 bytes
Instrucciones:
[1,2,...]
formato, luego presione enterBásicamente, lo que hace este programa es "compilar" recursivamente el código Brain-flak en listas anidadas e interpretar esa lista recursivamente. Probablemente hay una manera de combinar los dos ...
Trataré de reelaborar la lógica más tarde.
fuente
Perl 5.6,
419414bytesLo he jugado un poco, pero probablemente hay margen de mejora. Nuevas líneas y pestañas agregadas aquí en aras de un poco de legibilidad:
fuente
Python 2 ,
361, 348 bytesPruébalo en línea!
-13 bytes guardados gracias a @Mr. Xcoder!
fuente