Hintergrund
Fractran ist eine esoterische Turing-vollständige Programmiersprache, die von John Conway erfunden wurde. Ein Fractran-Programm besteht aus einer geordneten Liste von Brüchen. Das Programm beginnt mit der Eingabe einer einzelnen Ganzzahl. Bei jeder Iteration des Programms wird die Liste nach dem ersten Bruch durchsucht, sodass das Multiplizieren der Zahl mit diesem Bruch eine weitere Ganzzahl ergibt. Dann wiederholt es diesen Vorgang mit der neuen Nummer, beginnend am Anfang der Liste. Wenn die Liste keinen Bruch enthält, der mit der Zahl multipliziert werden kann, wird das Programm beendet und gibt die Zahl als Ausgabe aus.
Der Grund, warum Fractran Turing-complete ist, ist, dass es eine Registermaschine simuliert. Die Primfaktor-Faktorisierung der Zahl speichert den Inhalt der Register, während die Division und Multiplikation eine Möglichkeit ist, die Register bedingt zu addieren und von ihnen zu subtrahieren. Ich würde empfehlen, den Wikipedia-Artikel zu lesen (oben verlinkt).
Die Herausforderung
Ihre Aufgabe ist es, das kürzestmögliche Programm zu schreiben, das ein gültiges Fractran-Programm von STDIN als einzige Eingabe nehmen kann, und ein gültiges BF-Programm an STDOUT zu generieren, das das Fractran-Programm simuliert. Es gibt zwei Möglichkeiten, ein Fractran-Programm mit BF zu simulieren.
HINWEIS: Ihre Antwort ist kein BF-Programm. Ihre Antwort ist der Code, der das BF-Programm aus einem bestimmten Fractran-Programm generiert. Ziel ist es, dass das BF-Programm dem Fractran-Programm entspricht. (technisch könnte man die Konkurrenz in BF machen, aber es wäre schwer)
Option 1
Ihr Programm sollte ein BF-Programm ausgeben, das Folgendes ausführt:
- Nimmt genau 1 Zahl aus STDIN in Form des entsprechenden ASCII-Zeichens (aufgrund der Funktionsweise der BF-Eingabe), das die Eingabe für das Fractran-Programm ist.
- Gibt genau 1 Zahl in Form des entsprechenden ASCII-Zeichens an STDOUT aus, das die Ausgabe des Fractran-Programms darstellt.
Diese Option soll die genaue Eingabe und Ausgabe einer virtuellen Fractran-Maschine darstellen.
Option 2
Der BF-Code, den Ihr Programm erzeugt, sollte Folgendes tun:
- Nehmen Sie die Eingabe vor, indem Sie die Primfaktorisierung der Zahl bereits im Speicher speichern (vor dem Ausführen des Programms). Wenn die Eingabe 28 (2 * 2 * 7) ist, wird in der zweiten Zelle ein Wert von 2 und in der siebten Zelle ein Wert von 1 angezeigt (der Zeiger beginnt in Zelle 0). Alle anderen Zellen sind Null.
- Geben Sie eine Ausgabe aus, indem Sie die Primfaktor-Faktorisierung der Ausgabe beim Beenden des Programms im Speicher speichern. Wenn die Ausgabe 10 ist, muss in jeder der Zellen 2 und 5 ein Wert von 1 vorhanden sein. Alle anderen Zellen mit Primzahlen müssen den Wert Null haben. Der Inhalt anderer Zellen spielt keine Rolle.
Diese Option repräsentiert das Rechenmodell hinter der Sprache Fractran.
Regeln und Anforderungen
- Input (über Ihrem Programm) ist eine Liste von Brüchen auf STDIN. Es gibt einen Bruch pro Zeile mit einem Komma zwischen Zähler und Nenner. Eine leere Zeile steht für das Ende der Eingabe. Die Brüche werden immer auf den niedrigsten Wert reduziert.
- Die Ausgabe Ihres Programms sollte ein einzeiliges, gültiges BF-Programm für STDOUT sein. Dieses Programm sollte in der Lage sein, dieses bestimmte Fractran-Programm gemäß einer der beiden Optionen zu simulieren. Für jede Eingabe sollte das generierte BF-Programm die gleiche Ausgabe wie das Fractran-Programm erzeugen können.
- Sie müssen angeben, welche Option Sie gewählt haben.
- Sie können die Grenzen für den BF-Speicher und das Band sowie den Umbruch festlegen
- CODE GOLF. Auch die Größe der ausgegebenen BF-Programme spielt keine Rolle, nur die Größe des Programms, das die Konvertierung durchführt.
- Programme sollten nur aus druckbarem ASCII bestehen
Wenn ich irgendwo mehrdeutig bin, zögern Sie nicht zu fragen. Dies ist eine sehr komplizierte Herausforderung zu beschreiben.
Stellen Sie außerdem den generierten BF-Code Ihres Programms für die folgende Eingabe bereit, um auf einfache Weise zu überprüfen, ob Ihr Programm funktioniert:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
Dieses Programm berechnet die Anzahl der Einsen in der binären Erweiterung einer Zahl. Die Eingabe und Ausgabe sind jedoch seltsam formatiert (wie bei allen Fractran-Programmen). Die Eingabe hat die Form 2 ^ A, während die Ausgabe die Form 13 ^ B hat.