Dada 2 fragmentos de código brainfuck A
y B
, de salida de algún código brainfuck C
que tiene el mismo comportamiento que se ejecuta B
con la entrada del A
resultado s. Tenga en cuenta que C
debe funcionar para cualquier entrada que coincida con los siguientes supuestos, como si se le hubiera dado A
.
Puedes asumir:
- Entrada finita.
- tanto A como B se detienen.
- EOF es consistentemente 0 o consistentemente -1.
- Permitir o rechazar constantemente las celdas a la izquierda
- Cinta sin límites (de lo contrario, el requisito puede ser imposible)
- Constantemente envoltura de 8 bits o entero ilimitado
- Ninguna secuencia (entrada o salida para A o B) contiene el byte que representa EOF
- Los códigos A y B pueden contener caracteres que posiblemente aparezcan en su C, y
+-[]<>,.
Por ejemplo (EOF = 0)
A = ,[..,]
B = ,[...,]
C = ,[......,]
A = >,[>,]<[.<]
B = ,[...,]
C = >>>>,[[-<+<+<+>>>]>>>,]<<<<[.<]
A = >,[>,]<[.<]
B = ,[...,]
C = >,[>,]<[...<]
A = ,.
B = ,.
C = ,>,[,]<.
A = ,.
B = ,.
C = ,.
son pruebas válidas
El código más corto en cada idioma gana. El ganador en Brainfuck será aceptado.
Shortest code in each language win
yShortest Brainfuck solution will be accepted
son dos criterios ganadores diferentes.4.Consistently allow or disallow cells to left
? La respuesta inicial requiere que las celdas de la izquierda en la respuesta funcionen, pero no permita que A, B y C no se muevan pasado el primer byte. Mis diallows de respuesta se mueven hacia la izquierda en la respuesta, A, B y C. Si las reglas para mi programa y C pueden ser diferentes de A y B, entonces seguramente puedo acortar mucho mi respuesta.>
segundos al comienzo de mi respuesta para que cumpla con un sabor más restrictivo (pero para el golf, también deberíamos considerar alternativas). Además, me parece claro que A, B y C deben tener el mismo sabor entre sí.Respuestas:
brainfuck, 526 bytes
Formateado:
Con respecto a A, B y C: EOF = 0, las celdas a la izquierda del inicio no están permitidas, celdas de envoltura de 8 bits.
Espera A seguido de
?
seguido de B.Pruébalo en línea
(Esta respuesta se puede hacer compatible con un intérprete de brainfuck que no permite ir a la izquierda desde el principio a costa de un byte al transcribir
y/<>/></
y anteponer a>
).La idea básica es utilizar una serie de reemplazos de cadenas para simular las cintas de A y B utilizando nodos de 2 celdas, con especial atención a la sustitución
.
en A y,
en B para que el flujo de datos intermedio se mantenga en un bloque de celdas a la izquierda de la cinta simulada. El esquema de reemplazo de cadenas es:Insertar
>>
antes de AEn A y B, reemplace
>
con>[-]+>
y<
con<<
En A, reemplace
.
con>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</
Insertar
>[>>]+>
después de A y antes de BEn B, reemplace
,
con,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*
fuente
,[>,]<[.<]?,[...,]
la entrada12345
vuelve111
, incluso con suficiente>
antes?,[>,]<[.<]
no es válido pero lo>,[>,]<[.<]
es)>
s a D según sea necesario.brainfuck , 1287 bytes
Pruébalo en línea!
¡Aquí está! El código brainfuck que compone dos códigos brainfuck. Utilizar un "!" para separar los dos fragmentos de código de entrada. Por ejemplo fragmento A:
>,[>,]<[.<]
, snippet B:,[...,]
. Entrada para mi programa:>,[>,]<[.<]!,[...,]
. No terminará si no "!" es encontrado.Esto hace esencialmente lo mismo que mi versión de VBA. El código que se genera es el mismo que en la versión de VBA (tenga en cuenta que los ejemplos en la publicación de VBA se realizaron antes del último cambio en los fragmentos de brainfuck).
Explicación
Este es mi código fuente:
fuente
>[,>]<[.<]!,[...,]
, por lo que el fragmento A no genera nada. Por supuesto, debe ser>,[>,]<[.<]!,[...,]
para un ejemplo de trabajo.VBA,
512489479 bytesExplicación
El código VBA cambia el código de brainfuck de una manera, que la salida del fragmento A se almacenará en una lista y la entrada del fragmento B se leerá de esa lista.
Primero inicializa algunas variables
Luego lee el fragmento A y reemplaza cada
<
por<<<[+]-<<
, cada>
por>>>>>>>[+]-<<
y cada.
por la rutina de almacenamientodespués de eso, elimina la memoria del fragmento A y realiza cambios en la lista almacenada, por lo que puede leerse como entrada para el fragmento B:
Luego se leerá el fragmento B,
<
se reemplazará por<<<<<
cada>
, se reemplazará por>>>>>
cada y,
se reemplazará por la rutina de lectura de la lista:Código fuente de Brainfuck
Esta es mi fuente para las porciones de cerebro del código. Explicaré eso en detalle más adelante.
Salida para el caso de prueba 1:
f ",[..,]",",[...,]"
Pruébalo en línea!
Salida para el caso de prueba 2:
f ">,[>,]<[.<]",",[...,]"
Pruébalo en línea!
Salida para el caso de prueba 3:
f ",.",",."
Pruébalo en línea!
Caso de prueba complejo: Fragmento A: Construir triángulo alfabético ¡
>+++++[<+++++>-]<+[>>[>[.>]]>++++++++++.--[<++++++++>-]<[+.<]<-]>>,>[.>]++++++++++.[<[.<]>,>[.>]<]
Pruébelo en línea!Fragmento B: orden de entrada en orden ascendente ¡
>>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<]
Pruébelo en línea!Resultado:
Pruébalo en línea!
fuente
Brainfuck , 785 bytes
Pruébalo en línea!
Para dividir A de BI optó por
/
.Explicación:
El código real que genera esto es sólo una lectura de circuito con una bandera para A / B y un interruptor que reduce la entrada a buscar
>
,<
,/
,,
, y.
, y de lo contrario sólo la salida de la entrada. En realidad, es solo un transpilador donde el código transpilado vive dentro de una estructura de datos para que no interfiera con los datos almacenados de A o entre sí. El/
solo mueve la celda activa a la primera celda no utilizada. Originalmente lo limpié, pero eso hace que el programa y la salida sean más grandes.El resultado del programa tiene el siguiente modelo de memoria:
El
c
se desmorona.cz
siempre0
señala dónde se encuentra el puntero en mis datos BF emulados. El valor activo es -1 mientras que todas las celdas visitadas tendrán1
. En operaciones comoaprint
ybread
algunasc
tienen un significado especial.La impresión de código A omite todas las celdas de 1 byte para dejar espacio para una entrada de byte más, que es copias con una copia de seguridad en el siguiente desmoronamiento de bytes para volver a copiar.
La lectura del código B obtiene la entrada de la entrada. Aquí ser destructivo está bien y cuando "lees" el último byte obtienes 0 como EOF independientemente de la implementación.
Comencé como código extendido BrainFuck haciendo resultado EBF. La mayor parte de la depuración se realizó en los archivos de resultados y luego se actualizó a la fuente que lo generó. Luego simplemente ejecuté las operaciones de forma independiente para obtener la salida de BF, pero noté la respuesta de Dorian, que me ganó mucho tiempo, así que seguí jugando al golf con la fuente de EBF para una salida de BF más pequeña. La fuente original es bastante legible y simple en comparación con otras cosas que he hecho con ella:
fuente
[->+]
en el programa C se produce un error para entradas como->->,./,.
, y esto podría solucionarse utilizando[->>+]
(asegurándose de que el puntero se inicia en una celda con la paridad deseada). Porque[-<+]
, ¿creo que puedes cambiar el esquema de navegación para que todas las salidas de A sean distintas de cero?->->,.
y B es,.
, ¿su intérprete preferido produce la misma C que TIO, y C funciona como se espera en su intérprete? Porque falla en TIO . (Escribí esto en respuesta a un comentario que ahora se elimina.)-1
los datos del usuario, pero de hecho lo hice en la línea "ir a la celda activa, ponerlo a cero". He actualizado mi respuesta y luego agregué un byte: -O pero al menos funciona. Por cierto. Si no estoy usando para la exploración-1
al cual se deben recuperar de entrada en B voy a tener que mover el byte activo con una copia>[-<+]<
y por lo tanto añadir más caracteres de lo que se ahorra al sustituir+[-<+]-
con[<]
. Si no copia, no podrá saber si el byte que compiló se terminó y copie todos los bytes.[-<+]
realidad también se refería a la eliminación de errores (en lugar de guardar bytes), para entradas como-./,>++++++[<++++++>-]<.
, que deberían imprimirse en#
lugar de%
. :) Pero también veo algunas oportunidades para guardar bytes. ¡Buena suerte! Trataré de optimizar mi solución de cinta doblemente infinita, aunque ver lo que hiciste me hace pensar que tal vez la cinta derecha-infinita es más golfista al final.sed, 165 bytes
Para sabores con EOF = 0, las celdas a la izquierda del inicio no están permitidas, celdas de envoltura de 8 bits.
Espera el programa A en la primera línea y B en la segunda línea.
Pruébalo en línea
Esto utiliza nodos de 2 celdas para simular las cintas de A y B, con la salida de A ocupando celdas contiguas a la izquierda del nodo más a la izquierda.
Solución alternativa de 173 bytes:
Pruébalo en línea
Originalmente, mi diseño se basaba en una cinta doblemente infinita, que requería mucho más trabajo para moverse hacia la izquierda (mover datos al pasar más allá de la celda más a la izquierda encontrada anteriormente) y pasar de A a B (borrar los datos en lugar de simplemente pasar por la celda más a la derecha previamente encontrado).
Gracias a Sylwester y Dorian por trucos e ideas.
fuente
,[..,]
y B del programa,[...,]
.s/x/>>/g
al final, pero estoy más interesado en las mejoras que acortarán la salida por ahora.