Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge angibt und ein gültiges Brainfuck-Programm zurückgibt, das diese Zeichenfolge zurückgibt, wenn es als Brainfuck kompiliert und ausgeführt wird.
Angenommen, alle Eingaben sind als ASCII codiert.
Angenommen, das ausgegebene BF-Programm wird in einer Umgebung mit einem unendlichen Band ausgeführt.
Angenommen, der Zeiger beginnt bei Zelle 0, wobei jede Zelle auf den Wert Null initialisiert wird.
Jedes Beispiel unten repräsentiert eine mögliche korrekte Ausgabe für die angegebene Eingabe. Die Beispiele enthalten insbesondere zusätzliche Zeilenumbrüche und Leerzeichen, um die Lesbarkeit zu verbessern. Die Lösungen können den ausgegebenen BF-Code beliebig formatieren.
Das Band ist doppelt unendlich.
Alle vom Interpreter bereitgestellten Zellen sind genau 8-Bit-Zellen. Über- und Unterlauf sind eine vorhersehbare und vernünftige Angelegenheit.
Beispiele
Leerzeichenfolge
In Anbetracht der Eingabe könnte Ihr Programm / Ihre Funktion Folgendes zurückgeben:
+++++ +++++
+++++ +++++
+++++ +++++
++ .
Ausrufezeichen
In Anbetracht der Eingabe könnte !
Ihr Programm / Ihre Funktion Folgendes zurückgeben:
+++++ +++++
+++++ +++++
+++++ +++++
+++
.
Zwei Buchstaben
In Anbetracht der Eingabe könnte hi
Ihr Programm / Ihre Funktion Folgendes zurückgeben:
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
++++
.
+
.
Das ist Code-Golf , also gewinnt der Code mit der geringsten Anzahl von Bytes. Viel Glück.
Antworten:
Gelee , 8 Bytes
Probieren Sie es online!
Probelauf
Zur Eingabe
hi
druckt dieses Programm(ohne die Zeilenvorschübe), die wiederum gedruckt werden
hi
.Wie es funktioniert
quelle
.>
in der Ausgabe nicht angezeigt?p
) kürzer ist als an jedes (;€
) anzuhängen . Diese Ausgabeprogramme verdoppeln die Zelle nach dem Drucken und vor dem Umschalten. Da wir die Zelle nie wieder besuchen, hat dies keine Auswirkungen auf die Ausgabe.Brainfuck,
5551 BytesProbieren Sie es online!
Beispielausgabe für
hi
(ohne die Zeilenvorschübe):Erläuterung
Dies bewegt sich über das Band, während das Programm geschrieben wird. Die Umgebung
,[...,]
ist eine Standardeingabeschleife. Für jedes Zeichen verwenden wir vier Zellen:Wo
x
ist die Zelle, in die wir die Eingabe schreiben?Dieser Teil verwendet cell
a
, um über eine Standardmultiplikation von und ein21
in cell zu schreiben .b
3
7
Jetzt verwenden wir , dass
21
zu schreiben42
ina
und63
inc
von durch Multiplikation2
und3
jeweils. Bewegt<+<
sich dann zurück zur Zellex
und verwandelt sich42
in einen43
(den Codepunkt von+
). Rekapitulieren:Nun die Hauptausgabeschleife:
Das heißt, während
x
wir dekrementieren , drucken wir+
jedes Mal eines.Nachdem wir fertig sind, verwenden wir die
+
Zelle wieder, indem wir addieren3
, um zu geben.
.Schließlich bewegen wir uns zu
63
, dekrementieren es zu62
(>
) und geben es ebenfalls aus. Die nächste Iteration verwendet diese Zelle alsx
.quelle
Brainfuck,
39333231 BytesDer Algorithmus, der 45 auf das Band legt, wird aus Esolangs Brainfuck-Konstanten entnommen .
Diese Antwort setzt voraus, dass der Interpreter des Ausgabeprogramms umschließende, begrenzte Zellen hat. und das setzt
,
die aktuelle Zelle auf Null (was bedeutet, dass das Ausgabeprogramm ohne Eingabe ausgeführt wird). Probieren Sie es online!Eine (längere) Lösung, die bedingungslos funktioniert, finden Sie in meiner anderen Antwort .
Testlauf
Für die Eingabe
Code Golf
wird die folgende Ausgabe generiert.Probieren Sie es online!
Wie es funktioniert
Wir beginnen damit, die Ganzzahl 45 (Zeichencode von
-
) in eine Zelle des Bandes zu schreiben. Der folgende Code erreicht dies.Bevor wir in die Schleife eintreten, sieht das Band so aus.
Diese drei Zellen - -2 , -1 und 0 - sind die einzigen, die wir in diesem Programm verwenden.
In der ersten Iteration der Schleife ist die Zelle ganz rechts, dann werden diese Zelle und die mittlere Zelle zweimal dekrementiert, wobei der folgende Zustand verbleibt.
In den nächsten 126 Iterationen
-
dekrementiert der Anfang die mittlere Zelle,[>]<
springt zur Zelle ganz rechts und--<--
dekrementiert die mittlere und die rechte Zelle. Infolgedessen wird 3 von der mittleren Zelle (Modulo 256 ) und 2 von der Zelle ganz rechts subtrahiert.Da 254 ≤ 3 (mod 256) = (254 + 256) ≤ 3 = 510 ≤ 3 = 170 und 252 ≤ 3 = 84 ist , wird die Zelle ganz rechts vor der mittleren auf Null gesetzt, wodurch der folgende Zustand verbleibt.
Ähnlich wie bei der ersten Iteration der Schleife werden bei der nächsten Iteration nun 3 von der mittleren Zelle und 2 von der Zelle ganz links subtrahiert , wobei der Kopf auf die Zelle ganz links gelegt wird.
Nachfolgende Iterationen subtrahieren, wie in der vorhergehenden Iteration 126, 3 von der Zelle ganz links und 2 von der Zelle ganz rechts.
Da 254 ≤ 3 (mod 256) = 170 und 129 ≤ 2 (mod 256) undefiniert ist, wird dies 170 Mal durchgeführt, wobei der folgende Zustand verbleibt.
Die Zelle unter dem Kopf ist Null; Die Schleife endet.
Jetzt können wir die Ausgabe generieren.
quelle
\0
.Brainfuck,
35 1343 BytesDiese Antwort enthält keine Annahmen über den Interpreter des Ausgabeprogramms. Probieren Sie es online!
Für eine kürzere Lösung (die nur mit einigen Dolmetschern funktioniert), siehe meine andere Antwort .
Testlauf
Für die Eingabe
Code Golf
wird die folgende Ausgabe generiert.Probieren Sie es online!
Wie es funktioniert
Wir beginnen damit, die Ganzzahl 43 (Zeichencode von
+
) in die zweite Zelle des Bandes zu setzen. Der folgende Code erreicht dies.Dies führt im wesentlichen die modulare Division 2 ÷ 6 (mod 256) durch . Da (2 + 256) ≤ 6 = 258 ≤ 6 = 43 ist , ist das Ergebnis wie beabsichtigt 43 .
Jetzt können wir die Ausgabe generieren.
quelle
Pyth - 11 Bytes
Probieren Sie es hier online aus .
quelle
05AB1E,
1211 BytesErklärt
Probieren Sie es online aus
1 Byte dank @Adnan gespeichert
quelle
'+×
stattF'+}
speichert ein Byte.Java, 98 Bytes
String
s sind nichts anderes als unveränderlichechar[]
s mit einer Reihe von Dienstprogrammmethoden. Verwenden wir also das Array!Ungolfed:
Gleichwertiges eigenständiges Programm mit 138 Byte Länge:
Bonus:
Diese 207-Byte-App kodiert tatsächlich eine Datei als BF-Programm, wie im Titel erwähnt.
quelle
Vitsy,
1917 BytesBeachten Sie, dass diese Antwort eines der wenigen Male ist, die ich jemals benutzt habe
I
undu
. : DProbieren Sie es online!
quelle
O , 13 Bytes
Erläuterung:
quelle
K6, 16 Bytes
Verwendung
Erläuterung
quelle
Python 3, 43 Bytes
Das Python fügt eine Reihe von Pluszeichen ein, die dem ASCII-Code jedes Zeichens entsprechen, gefolgt vom
.>
Drucken und Verschieben in die nächste Zelle. Der Brainfuck erhöht sich auf den korrekten Wert, druckt und wechselt zur nächsten Zelle.Ausgabe für
hi
(mit Zeilenumbrüchen zur Verdeutlichung):Die Ausgabe dieses Programms:
quelle
Perl, 25 Bytes
Verwendung
Erläuterung
Verwendet eine Ersetzungsoperation mit regulären Ausdrücken, um jedes Zeichen in jeder Zeile, die bei der Standardeingabe angegeben wurde, durch eine Zahl zu ersetzen,
+
die aus dem Ordnungswert dieses Zeichens berechnet wird. Anschließend erfolgt die Ausgabe.>
, um das nächste Zeichen zu drucken und fortzufahren.Verwendet das Perl-
-p
Flag, um die Eingabe automatisch zu lesen und das Ergebnis auszudrucken, und fügt dem Bytecount 1 hinzu.quelle
Java, 91 Bytes
Requisiten an Dorukayhan, weil er mich geschlagen hat :)
quelle
C
726460 BytesUngolfed-Version:
Kompilieren und testen mit:
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt
Ergebnisse
hi
- http://paste.ubuntu.com/17995958/quick brown fox jumps over the lazy dog
- http://paste.ubuntu.com/17996059/quelle
c
die bitweise Inversion vongetchar
, besonders wenn Sie die Inversion nur erneut invertieren?c = ~getchar( )
mit 0 bewertetEOF
.c = ~getchar( )
und~c++
sind einfach kürzer als~( c = getchar( ) )
undc--
CJam, 12 Bytes
Konvertiert jedes Zeichen in seinen ASCII-Wert und erhöht die aktuelle Zelle vor dem Drucken um diese Anzahl. Da wir unendlich viele Bänder haben, können wir uns nach der Bearbeitung jedes Zeichens einfach nach rechts bewegen.
Probieren Sie es online!
quelle
Lua,
67,6661 BytesEinfach Iterierte über jedes Zeichen in dem Argument, und drucken Sie eine Zeile für jeden mit
n
+
s gefolgt von.>
won
ist der Wert dieses Zeichen in der ASCII - Tabelle.Verwendet gmatch als @LeakyNun, das im Kommentar zum Speichern von 1 Byte gegenüber der gsub-Lösung empfohlen wurde
Alte Lösung mit gsub
Alt 67
Um es auszuführen, speichern Sie es einfach als Datei (
golf.lua
zum Beispiel) und führen Sie es mit auslua golf.lua "hi"
. Fürhi
sollte es ausgebenquelle
attempt to index a nil value
, undf = ...
gibt das gleiche, undfunction f ... end
gibtunexpected symbol near ':'
lua file.lua "argument"
, ich werde den Beitrag aktualisieren, um Anweisungen zu geben....
ein Bezeichner mit argv?...
enthält die Werte in der Tabellearg
entpackt. Das heißt, es wird immer entsprechen, esarg[1]
sei denn, Sie verwenden es in einem Funktionsaufruf als letzten Parameter, dann wird es ausgegeben.n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")end
für 48 BytesJ, 28 Bytes
Einfach genug.
3&u:
wandelt Zeichen in Zeichencodes um. Der Rest wird nur so'+'
oft wiederholt , dann.>
am Ende jeder Zeile verkettet und;
das Ergebnis geglättet.Einige Ergebnisse
quelle
Pyke, 11 Bytes
Probieren Sie es hier aus!
quelle
Eigentlich 13 Bytes
Probieren Sie es online!
Die hier angewendete Strategie ist die gleiche wie in vielen anderen Lösungen: Geben Sie für jedes Zeichen genügend
+
s aus, um eine nullinitialisierte Zelle auf die richtige ASCII-Ordnungszahl zu erhöhen, sie mit auszugeben.
und zur nächsten Zelle mit zu wechseln>
.Erläuterung:
quelle
Mouse-2002, 27 Bytes
Dies funktioniert theoretisch und gemäß der Dokumentation der Sprache, aber die Referenzimplementierung von Mouse's Interpreter scheint einen Fehler zu haben, bei dem die Zeichenketteneingabe an a angehängt wird
'
, also füra
diese AusgabenWas wiederum ausgibt
a'
. Das mag sein oder auch nicht in Ordnung, so ist hier ein 39 Byte lang , das nicht der Fall ist Ausgang'
immer und so wird wahrscheinlich mehr ungültig.Was gibt die richtige Ausgabe in der Referenz impl. solange es keine
'
s gibt :)Erklärt:
quelle
Faktor 58 Bytes
Funktioniert wie:
Da Factor mit einem Brainfuck-Interpreter geliefert wird, ist es einfach zu testen.
bfcat.factor
bfcat-tests.factor
Ausgabe
Yay! sie gehen alle vorbei.
quelle
Rubin,
4038 Bytesquelle
puts
anstelle von verwendenprint
, da das Format der Ausgabe nicht von Bedeutung ist, solange es gültig ist Brainfuck und Brainfuck kümmert sich nicht um andere ZeichenSidef , 38 Bytes
Hey, genauso lang wie Ruby! nur dass Sidef nicht Ruby ist: D
Lies ein paar Zeichen, dann mache für jedes Byte das Ding.
quelle
GNU Bash,
10085 BytesDanke @cat , dass du mir 15 Bytes gespart hast!
Postramble
bash bfcat.sh <path to file containing string>
bash bfcat.sh <(echo -n '<string>')
Ungolfed
Referenzen in ungolfed version
Datei byteweise lesen
ord
eines char in bashZeichen $ n mal ausgeben
quelle
read -rn1
Entfernen Sie nachher die Leerzeichen;
, entfernen Sie die Leerzeichendone <"$1"
, um insgesamt 9 Bytes zu sparenES6,
119115 Bytesf=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}
4 Bytes gespart, dank @Leibrug
quelle
charCodeAt
(sagen wir malc
) und wie folgt verwenden:s[c](i)
um 1 Byte zu verkürzen und auch einige Zeichen zu entfernen (ich habe 3: Leerzeichen vorher gefunden[...s]
, logisches ODER durch bitweises Eins und Semikolon vorher ersetztreturn
).Sesos (nicht konkurrierend)
Hexdump:
Probieren Sie es online!
Assembler
quelle
Ruby, 26 Bytes
+ 1 Byte für die
p
Befehlszeilenoption. Um zB den Brainfuck-Code fürABC xyz
dich zu bekommen, kannst du laufenund bekomme
quelle
Haskell 50 Bytes
quelle