sfondo
Fractran è un linguaggio di programmazione esoterico completo di Turing inventato da John Conway. Un programma Fractran consiste in un elenco ordinato di frazioni. Il programma inizia prendendo un singolo intero come input. Ogni iterazione del programma, cerca nell'elenco la prima frazione in modo tale che moltiplicare il numero per quella frazione produce un altro numero intero. Quindi ripete questo processo con il nuovo numero, ricominciando dall'inizio dell'elenco. Quando non vi è alcuna frazione nell'elenco che può essere moltiplicata per il numero, il programma termina e fornisce il numero come output.
Il motivo per cui Fractran è Turing completo è perché simula una macchina di registro. La scomposizione in fattori primi del numero memorizza il contenuto dei registri, mentre la divisione e la moltiplicazione sono un modo per aggiungere e sottrarre condizionalmente dai registri. Consiglierei di leggere l'articolo di Wikipedia (linkato sopra).
La sfida
Il tuo compito è quello di scrivere il programma più breve possibile che possa prendere un programma Fractran valido da STDIN come unico input e generare un programma BF valido su STDOUT che simuli il programma Fractran. Esistono due modi per simulare un programma Fractran con BF.
NOTA: la tua risposta non è un programma BF. La tua risposta è il codice che genera il programma BF da qualsiasi programma Fractran. L'obiettivo è far sì che il programma BF sia l'equivalente del programma Fractran. (tecnicamente potresti fare la competizione in BF, ma sarebbe difficile)
opzione 1
Il tuo programma dovrebbe generare un programma BF che procede come segue:
- Prende esattamente 1 numero da STDIN sotto forma del corrispondente carattere ASCII (a causa del modo in cui funziona l'input BF), che è l'input per il programma Fractran.
- Stampa esattamente 1 numero su STDOUT sotto forma del corrispondente carattere ASCII, che è l'output dal programma Fractran.
Questa opzione ha lo scopo di rappresentare l'input e l'output esatti da una macchina virtuale Fractran.
opzione 2
Il codice BF prodotto dal tuo programma dovrebbe effettuare le seguenti operazioni:
- Prendi l'input avendo la scomposizione in fattori primi del numero già codificato in memoria (prima di eseguire il programma). Se l'ingresso è 28 (2 * 2 * 7), allora ci sarà un valore di 2 nella seconda cella e un valore di 1 nella settima cella (il puntatore inizia sulla cella 0). Tutte le altre celle saranno zero.
- Fornire output avendo la fattorizzazione in primo piano dell'output codificato in memoria al termine del programma. Se l'output è 10, allora deve esserci un valore 1 in ciascuna delle celle 2 e 5. Tutte le altre celle con numeri primi devono avere un valore pari a zero. Il contenuto di altre celle non ha importanza.
Questa opzione rappresenta il modello di calcolo alla base del linguaggio Fractran.
Regole e requisiti
- Input (in alto il tuo programma) sarà un elenco di frazioni su STDIN. Ci sarà una frazione per riga con una virgola tra il numeratore e il denominatore. Una riga vuota rappresenta la fine dell'input. Le frazioni saranno sempre ridotte ai termini più bassi.
- L'output del programma deve essere un programma BF a riga singola valido per STDOUT. Questo programma dovrebbe essere in grado di simulare quel particolare programma Fractran secondo una delle due opzioni. Per qualsiasi input, il programma BF generato dovrebbe essere in grado di produrre lo stesso output del programma Fractran.
- Devi indicare quale opzione hai scelto.
- È possibile scegliere i limiti sulla memoria e sul nastro BF e se si stanno avvolgendo
- CODICE GOLF. Inoltre, la dimensione dei programmi BF emessi non ha importanza, ma solo la dimensione del programma che sta eseguendo la conversione.
- I programmi dovrebbero consistere solo di ASCII stampabile
Se sono ambiguo ovunque, non esitate a chiedere. Questa è una sfida molto complicata da descrivere.
Inoltre, inserisci il codice BF generato dal tuo programma per il seguente input, in modo da fornire un modo semplice per verificare se il tuo programma funziona:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Questo programma calcola il numero di 1 nell'espansione binaria di un numero. Tuttavia, l'input e l'output sono formattati in modo strano (come con tutti i programmi Fractran). L'input è nella forma 2 ^ A, mentre l'output è nella forma 13 ^ B.