Konvertiere Fractran in Brainfuck

18

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

  1. 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.
  2. 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.
  3. Sie müssen angeben, welche Option Sie gewählt haben.
  4. Sie können die Grenzen für den BF-Speicher und das Band sowie den Umbruch festlegen
  5. CODE GOLF. Auch die Größe der ausgegebenen BF-Programme spielt keine Rolle, nur die Größe des Programms, das die Konvertierung durchführt.
  6. 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.

PhiNotPi
quelle
Im Grunde wollen Sie also einen Fraktran-Interpreter in Brainfuck. Alles andere ist ziemlich trivial.
Captncraig
@CMP Ich möchte ein Programm, das die BF-Version eines Fractran-Programms ausgibt. Der Code, der diese Konvertierung durchführt, muss nicht in BF sein. Das BF-Programm selbst hat nur einen Zweck.
PhiNotPi
1
Gibt es Grenzen für den von uns verwendeten Brainfuck-Interpreter? Müssen wir Zellen mit Byte-Größe verwenden, oder können wir int-Zellen verwenden? Beschränktes Gedächtnis? Speicher einschließen? Zellen einwickeln? Was wollen wir, damit es funktioniert?
Captncraig
Alles, was Sie wollen, um es zum Laufen zu bringen, aber geben Sie dies bitte in Ihrer Antwort an.
PhiNotPi
1
Es ist wahrscheinlich möglich, dies mit BF zu lösen ...
mbomb007

Antworten:

7

Python, 182 Zeichen

Option 1, Standardbytezellen. Es gibt nur 255 mögliche Eingaben (0, da eine Eingabe nicht wirklich sinnvoll ist), daher führe ich in Python nur 255 Mal einen Fractran-Interpreter aus und erstelle ein einfaches Tabellen-Lookup-Brainfuck-Programm, das die Ergebnisse codiert.

import sys
I=map(eval,sys.stdin)
P='+>,'
Q=''
for i in range(1,256):
 while i:j=i;i=([i*x/y for x,y in I if i%y==0]+[0])[0]
 r=j&255;P+='-[';Q=']<[-'+'+'*r+'.'+'-'*r+']>'+Q
print P+Q

Ausgabe für die Beispieleingabe ( ___= 246 weitere verschachtelte Bedingungen, ich kann das gesamte Ergebnis nicht einfügen, da es zu groß ist):

+>,-[-[-[-[-[-[-[-[___]<[-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-------------------------------------------------------------------------------------------------------------------------------------------------------------------------]>]<[-+++++++++++++.-------------]>]<[-+++++++++++++.-------------]>]<[-+.-]>]<[-+++++++++++++.-------------]>]<[-+++++++++++++.-------------]>]<[-+++++++++++++.-------------]>]<[-+.-]>
Keith Randall
quelle
1
@PhiNotPi: Richtig, ich muss möglicherweise Schleifen und Sonderfälle erkennen, die ...
Keith Randall
7
Tatsächlich denke ich, dass das Bestimmen, ob ein bestimmtes Fractran-Programm eine Endlosschleife ist oder nicht, dem Halteproblem entspricht. Viel Glück damit. :)
PhiNotPi
1
Ein interessanter Ansatz. Ein einziges Manko kann sein, wenn die Fractran-Spezifikation angibt, dass Ausgaben größer als 255 verarbeitet werden müssen, auf die sich meines Wissens viele Programme verlassen, sodass es etwas seltsam erscheint, nur das LSB des Ergebnisses zu verwenden.
Captncraig
1
@CMP, in der Frage wird ausdrücklich angegeben, dass die Eingabe für Option 1 von ASCII stammt.
Stand
1
@PhiNotPi Wenn bestimmt wird, ob ein Programm anhält oder nicht, unterscheidet es sich geringfügig von der Möglichkeit, ein anderes Programm in einer anderen Sprache zu erstellen, sodass es genau dann anhält, wenn das Original anhält. Ersteres ist unmöglich, während Letzteres jeden Tag von Compilern durchgeführt wird.
Cruncher
3

Python, 420 Zeichen

Dies verwendet eine Art Mischung aus Option 1 und 2: Es wird davon ausgegangen, dass Brainfuck mit großen ganzen Zahlen implementiert ist (ich verwende eine Sage-Implementierung). Geben Sie beispielsweise ein Fractran-Programm ein 33/20,5/11,13/10,1/5,2/3,10/7,7/2. Laden Sie dann beispielsweise eine Zahl vorab 2^5über den Cursor. Führen Sie dann die Ausgabe dieses Python-Skripts aus. Warten Sie 44 Sekunden. Das Ergebnis befindet sich dort, 13^2wo der Cursor gestartet wurde. Ich habe nicht auf die Antwort gewartet 2^7.

s="[->>>+<<<]+["
for l in raw_input().split(','):
 a,b=map(int,l.split('/'))
 s+="[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>["+"[->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]<"*(b-1)+"[->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]<"+"[->+>+<<]>[-<+>]<"*a+"[-]>>[-<<+>>]<<<<<->>>>]<<]<<"
print s+">+<[->-<]>[-<+>]<]>>>[-<<<+>>>]"

Dies ist mein erstes Brainfuck-Skript. Es kann sicherlich weiter golfen werden, aber ich habe bis heute Abend andere Dinge zu tun.

Bearbeiten: Anstatt weiter Golf zu spielen, arbeite ich an einer Lösung für Option 2. Hier ist auch die Ausgabe für das angeforderte Programm:

[->>>+<<<]+[[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<[->+>+<<]>[-<+>]>[->[->+>>+<<<]>[-<+>]>>[ [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<->>]<<+[<[-]>-]>>]< [->+>+<<]>>[-<<+>>]<[[-]<-[->+>+<<]>>[-<<+>>]<<>[[-]<<<->>>]<<<++>>>]<]<<[->+>+<<]>>[-<<+>>]<[[-]<->]<[<[-]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]< [->+>+<<]>[-<+>]<[-]>>[-<<+>>]<<<<<->>>>]<<]<<>+<[->-<]>[-<+>]<]>>>[-<<<+>>>]
boothby
quelle
Das ist ein schönes erstes Brainfuck-Skript, +1. Sie können übrigens in weniger als 5 Sekunden 2^7mit meinem Brainfuck-Interpreter rechnen . Sollte es auch nicht raw_input()statt dessen sein raw_input(oder ist es eine Eigenart, von der ich nichts weiß)?
Kopieren
@copy, danke! du hast recht, raw_input()ist notwendig. Ich bin nicht überrascht, dass kompetente Brainfuck-Dolmetscher besser abschneiden als meine schrecklich naive Sage-Implementierung.
Stand
2

Perl, 326 Zeichen

Ich werde meine eigene Frage beantworten, um hoffentlich mehr Antworten zu finden. Ich bin natürlich nicht gewinnberechtigt. Dies ist Option 2 mit unbegrenztem Speicher und Zellen, obwohl das Umbrechen von Zellen möglich ist. Jeder Bruch wird in einen einzelnen Codeblock konvertiert. Die Zeilenumbrüche dienen der Lesbarkeit.

L:{$A=<>;
if($/eq$A){last L}
($B,$C)=eval$A;
$D=$E=$F=$G=$H=2;
while($C>1){
if($C%$H==0){
$C/=$H;
$R=">"x$H;
$L="<"x$H;
$D.=$R.'[-'.$L;
$E.=$R.'-'.$L;
if($H>2){$R.="+[->+<]]>[-<+>]<"}
else{$R.="+[-<+>]]<[->+<]>"}
$G=$R.$L.$G;
$H--}$H++}
$H=2;while($B>1){
if($B%$H==0){
$B/=$H;
$F.=">"x$H.'+'.'<'x$H;
$H--}$H++}
$I="+[-$I$D$E+$F$G]";
redo L}print$I

Hier ist die Beispielausgabe. Dies nutzt die Tatsache aus, dass andere Zeichen als Kommentare ignoriert werden. Dies scheint auch eine sehr kurze Ausgabe im Vergleich zu den anderen Einträgen zu sein, obwohl die Ausgabegröße technisch keine Rolle spielt.

+[-+[-+[-+[-+[-+[-+[-2>>[-<<>>[-<<>>>>>[-<<<<<2>>-<<>>-<<>>>>>-<<<<<+2>>>+<<<>>>>>>>>>>>+<<<<<<<<<<<>>>>>+[->+<]]>[-<+>]<<<<<<>>+[-<+>]]<[->+<]><<>>+[-<+>]]<[->+<]><<2]2>>>>>>>>>>>[-<<<<<<<<<<<2>>>>>>>>>>>-<<<<<<<<<<<+2>>>>>+<<<<<>>>>>>>>>>>+[->+<]]>[-<+>]<<<<<<<<<<<<2]2>>[-<<>>>>>[-<<<<<2>>-<<>>>>>-<<<<<+2>>>>>>>>>>>>>+<<<<<<<<<<<<<>>>>>+[->+<]]>[-<+>]<<<<<<>>+[-<+>]]<[->+<]><<2]2>>>>>[-<<<<<2>>>>>-<<<<<+2>>>>>+[->+<]]>[-<+>]<<<<<<2]2>>>[-<<<2>>>-<<<+2>>+<<>>>+[->+<]]>[-<+>]<<<<2]2>>>>>>>[-<<<<<<<2>>>>>>>-<<<<<<<+2>>+<<>>>>>+<<<<<>>>>>>>+[->+<]]>[-<+>]<<<<<<<<2]2>>[-<<2>>-<<+2>>>>>>>+<<<<<<<>>+[-<+>]]<[->+<]><<2]
PhiNotPi
quelle
1

Salbei, 431 Zeichen

Dies ist eine völlig neue Lösung. Ich fand einige bessere Möglichkeiten, um Dinge in Brainfuck zu erledigen, und dies implementiert Option 2. Neue Zeilen, die der Klarheit halber hinzugefügt wurden. Dies kann wahrscheinlich weiter ausgenutzt werden, aber es beinhaltet das Umschreiben des BF, um eine geringere Loop-Tiefe zu haben.

exec"f=factor;
J=''.join;
Q=L(a,b):Lz:a*z+b*-z;M=Q('<>');
C=Lj,k:(Ll:'[-%s+%s+%s]%s[-%s+%s]%s'%tuple(map(M,[-j,-k,l,-l,l,-l,k])))(j+k);
print '>+[>>>+'+J(map(L(n,m):reduce(Lr,(p,e):'[-%s%s%s[[-]<<+>>]%s<<%s]'%(M(4-p),C(6-p,2),'[-'*(e-1),']'*(e-1),r),f(m),'[-<<<->>>%s]'%J(map(L(p,e):M(4-p)+Q('+-')(e)+M(p-4),f(n/m))))+'<<<'+C(3,2),[map(QQ,x.split('/'))for x in raw_input().split(',')]))+'<<<<+>[-<->]<[->+<]>]'".replace('L','lambda ')

Beispielausgabe:

Angesichts der Eingabe 33/20,5/11,13/10,1/5,2/3,10/7,7/2

>+[>>>+[->[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<<+>>]<<[-<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[-[[-]<<+>>]]<<[-<<<->>><<-->><+>>-<>>>>>>>+<<<<<<<]]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->>>>>>>[-<<<<<+>>+>>>]<<<[->>>+<<<]<<[[-]<<+>>]<<[-<<<->>>>+<>>>>>>>-<<<<<<<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<<+>>]<<[-<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[[-]<<+>>]<<[-<<<->>><<->>>-<>>>>>>>>>+<<<<<<<<<]]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->[->+>>+<<<]>>>[-<<<+>>>]<<[[-]<<+>>]<<[-<<<->>>>-<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[-<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[[-]<<+>>]<<[-<<<->>><<+>><->]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[->>>[-<+>>+<]>[-<+>]<<[[-]<<+>>]<<[-<<<->>><<+>>>+<>>>-<<<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<[-<<[->>>>+>>+<<<<<<]>>>>>>[-<<<<<<+>>>>>>]<<[[-]<<+>>]<<[-<<<->>><<->>>>>+<<<]]<<<[->>>+>>+<<<<<]>>>>>[-<<<<<+>>>>>]<<<<<<+>[-<->]<[->+<]>]
boothby
quelle