Antecedentes
Fractran es un lenguaje de programación esotérico completo de Turing inventado por John Conway. Un programa Fractran consiste en una lista ordenada de fracciones. El programa comienza tomando un solo entero como entrada. Cada iteración del programa, busca en la lista la primera fracción de tal manera que multiplicar el número por esa fracción produce otro número entero. Luego repite este proceso con el nuevo número, comenzando de nuevo al comienzo de la lista. Cuando no hay una fracción en la lista que pueda multiplicarse con el número, el programa termina y da el número como salida.
La razón por la que Fractran es Turing completo es porque simula una máquina de registro. La factorización prima del número almacena el contenido de los registros, mientras que la división y multiplicación es una forma de sumar y restar condicionalmente de los registros. Recomendaría leer el artículo de Wikipedia (vinculado a arriba).
El reto
Su tarea es escribir el programa más corto posible que pueda tomar un programa Fractran válido de STDIN como su única entrada y genere un programa BF válido a STDOUT que simule el programa Fractran. Hay dos formas de simular un programa Fractran con BF.
NOTA: Su respuesta no es un programa BF. Su respuesta es el código que genera el programa BF de cualquier programa de Fractran. El objetivo es lograr que el programa BF sea el equivalente del programa Fractran. (técnicamente podrías hacer la competencia en BF, pero sería difícil)
Opción 1
Su programa debería generar un programa BF que haga lo siguiente:
- Toma exactamente 1 número de STDIN en la forma del carácter ASCII correspondiente (debido a la forma en que funciona la entrada BF), que es la entrada al programa Fractran.
- Imprime exactamente 1 número en STDOUT en la forma del carácter ASCII correspondiente, que es la salida del programa Fractran.
Esta opción está destinada a representar la entrada y salida exactas de una máquina virtual Fractran.
opcion 2
El código BF que produce su programa debe hacer lo siguiente:
- Tome la entrada teniendo la factorización prima del número ya codificado en la memoria (antes de ejecutar el programa). Si la entrada es 28 (2 * 2 * 7), habrá un valor de 2 en la segunda celda y un valor de 1 en la séptima celda (el puntero comienza en la celda 0). Todas las demás celdas serán cero.
- Proporcione salida al tener la factorización prima de la salida codificada en la memoria cuando finalice el programa. Si la salida es 10, entonces debe haber un valor de 1 en cada una de las celdas 2 y 5. Todas las demás celdas con números primos deben tener un valor de cero. El contenido de otras células no importa.
Esta opción representa el modelo informático detrás del lenguaje Fractran.
Reglas y requisitos
- La entrada (encabeza tu programa) será una lista de fracciones en STDIN. Habrá una fracción por línea con una coma entre el numerador y el denominador. Una línea vacía representa el final de la entrada. Las fracciones siempre se reducirán a los términos más bajos.
- La salida de su programa debe ser un programa BF válido de una sola línea para STDOUT. Este programa debería poder simular ese programa Fractran en particular de acuerdo con una de las dos opciones. Para cualquier entrada, el programa BF generado debería poder producir la misma salida que el programa Fractran.
- Debe indicar qué opción eligió.
- Puede elegir los límites en la memoria BF y la cinta, y si están envolviendo
- CÓDIGO GOLF. Además, el tamaño de los programas BF emitidos no importa, solo el tamaño del programa que realiza la conversión.
- Los programas solo deben consistir en ASCII imprimible
Si soy ambiguo en alguna parte, no dudes en preguntar. Este es un desafío muy complicado de describir.
Además, publique el código BF generado de su programa para la siguiente entrada, a fin de proporcionar una manera fácil de verificar si su programa está funcionando:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Este programa calcula el número de 1s en la expansión binaria de un número. Sin embargo, la entrada y la salida tienen un formato extraño (como con todos los programas de Fractran). La entrada tiene la forma 2 ^ A, mientras que la salida tiene la forma 13 ^ B.