Geben Sie bei einer Eingabe eines in oOo CODE geschriebenen Programms den BF-Code aus, den es darstellt.
Hier ist eine kurze Beschreibung der Funktionsweise von oOo CODE:
Zunächst werden alle nicht alphabetischen Zeichen entfernt (alles, was nicht im Bereich liegt
A-Za-z
).Nehmen Sie zum Beispiel das Programm
PROgRam reVERsES giVeN iNPut sEqUENcE
(ein Beispiel auf der Wiki-Seite von esolangs, das genau das tut, was Sie erwarten). Nach diesem ersten Schritt haben wir jetztPROgRamreVERsESgiVeNiNPutsEqUENcE
.Teilen Sie als nächstes alle verbleibenden Zeichen in Gruppen von 3 auf. Wir haben jetzt
PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE
. Wenn es eine nachgestellte Gruppe von 1 oder 2 Zeichen gibt, verwerfen Sie sie.Konvertieren Sie jede Gruppe von 3 Buchstaben in einen BF-Befehl basierend auf der folgenden Tabelle:
ooo > ooO < oOo [ oOO ] Ooo - OoO + OOo . OOO ,
Das heißt, wenn der erste Buchstabe einer Gruppe in Kleinbuchstaben geschrieben ist, der zweite in Großbuchstaben und der dritte in Kleinbuchstaben, wird dies in den Befehl übersetzt
[
.In unserem Beispiel wird dies schließlich zum BF-Programm
,[>,]<[.<]+
, das seine Eingabe in der Tat umkehrt.
Da es sich um Code-Golf , wird der kürzeste Code in Bytes gewinnen.
Testfälle:
<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+
quelle
Antworten:
oOo,
15691515 BytesMusste getan werden. Probieren Sie es hier aus .
Golf gespielt:
Übersetzt nach Brainfuck (mit Zeilenumbrüchen zur Verdeutlichung):
Ungolfed mit Erklärung:
Danke für die interessante Herausforderung!
quelle
CJam,
3635 BytesTeste es hier.
Erläuterung
quelle
JavaScript (ES6),
949391858483 Byte1 Byte dank @ dev-null gespeichert
Ich habe viele Varianten davon ausprobiert, aber dies scheint die kürzeste zu sein. Funktioniert auch bei leerer Eingabe!
Wie es funktioniert
Zunächst
x.replace(/[a-z]/gi,c=>
finden wir mit jeden Buchstabenc
in der Eingabe. Wir setzena
undb
zu""
am anderen Ende der Funktionsaufruf, da die Funktion alle Parameter über die zweite ignoriert.a
speichert eine Binärzeichenfolge, um zu bestimmen, welches Zeichen gerade erstellt wird, undb
speichert das Ergebnis.Nun zum verwirrenden Teil: Zuerst
(a+=+(c<'a'))
hängen wir mit0
ana
ifc
Großbuchstaben an;1
Andernfalls. Dieser Ausdruck gibt den neuen Werta
, so ist, dann können wir überprüfen , ob es mit drei Zeichen Länge erreicht hat , durch Prüfen , ob das Zeichen an dem Index 2 vorhanden ist :[2]?
. Wenn nicht, beenden wir die Funktion einfach mit:0
.Wenn
a
es jetzt drei Zeichen lang ist, ist es eine Binärzahl zwischen000
und111
. Wir können dies in eine Dezimalzahl umwandeln, indem wir sie"0b"
an den Anfang anhängen und dann die Engine zwingen, sie als Zahl mit zu analysieren'0b'+a-0
.Wir müssen jedoch noch
a
auf die leere Zeichenfolge zurücksetzen . Dies können wir nicht einfach tun,'0b'+(a="")-0
da dies bedeuten würde, dass die analysierte Zeichenfolge gerecht ist0b
. Zum Glück, wenn sie als Nummer analysiert, wird die leere Zeichenkette 0, so dass wir das ersetzen können0
mit(a="")
.Jetzt haben wir unsere Nummer, und wir können nur das Zeichen an diesem Index in anhängen
"><[]-+.,"
zub
. Nachdem das Ersetzen abgeschlossen ist, verwenden wir&&b
, um es von der Funktion zurückzugeben. (Nun, es sei denn, das Ergebnis von.replace
ist leer, was nur bei leerer Eingabe geschieht und die leere Zeichenfolge trotzdem zurückgibt.)quelle
'0b'+a-0
vs+`0b${a}`
und+("0b"+a)
replace
gewinnt doch!match
Weg entlang geführt habe ...05AB1E ,
3532 BytesCode:
Mit einem sehr cleveren Trick von Martin Büttner, aus dieser Antwort . Erläuterung:
Probieren Sie es online!
Verwendet CP-1252- Codierung.
quelle
Retina ,
79757170 BytesDanke an randomra für das Speichern von 1 Byte.
Probieren Sie es online!
Erläuterung
Zunächst entfernen wir alles, was kein Buchstabe ist.
Dadurch wird die Zeichenfolge in Blöcke mit drei Zeichen aufgeteilt, indem alle (nicht überlappenden) Übereinstimmungen mit drei Zeichen zurückgegeben werden. Dadurch werden unvollständige nachgestellte Blöcke automatisch verworfen.
Stellen Sie
;
jeder Zeile ein voran . Wir werden dies als Marker für die Base-2-Konvertierung verwenden. Apropos, wir behandeln Großbuchstaben einfach als1
und Kleinbuchstaben als0
.Dies führt eine lustige Basis-2-Konvertierung zur unären durch. Bei jedem Schritt verdoppeln wir einfach die Zeichen links von
;
und verschieben das Zeichen;
nach rechts. Warum funktioniert das? Denken Sie daran, wir interpretieren Kleinbuchstaben als0
und Großbuchstaben als1
. Wann immer wir einen Buchstaben verarbeiten, verdoppeln wir einfach die laufende Summe (links) bis jetzt - doppelte Kleinbuchstaben sind gerecht2*0=0
, so dass sie vollständig ignoriert werden können und Großbuchstaben die Binärzahl bis jetzt darstellen, so dass sie verdoppelt werden Was wir wollen. Dann addieren wir den aktuellen Buchstaben zu der laufenden Summe, die für0
oder1
entsprechend steht.Entfernen Sie alle Kleinbuchstaben / Nullen.
Passen Sie jede Zeile an und ersetzen Sie sie durch die (dezimale) Anzahl der Zeichen in dieser Zeile. Aufgrund
;
dessen wird die unäre Zahl zu ihrem Dezimaläquivalent + 1.Transliteration, die 1-8 durch den entsprechenden Befehl ersetzt.
Zeilenumbrüche entfernen.
quelle
;
. Ich werde das später bearbeiten.MATL ,
3832 BytesProbieren Sie es online!
quelle
Japt,
3736 BytesOnline testen!
Wie es funktioniert
quelle
JavaScript (ES6),
111 bis95 ByteEntfernt einfach Nichtbuchstaben, wandelt Großbuchstaben in Einsen und Kleinbuchstaben in Nullen um, teilt sie in Dreiergruppen auf, ignoriert eine nachfolgende Gruppe von 1 oder 2 und decodiert die Gruppen.
Bearbeiten: 16 Bytes dank @ dev-null gespeichert, obwohl der Code nicht mehr funktioniert, wenn die leere Zeichenfolge übergeben wird.
quelle
match(/.../g).map().join
Ansatz ausprobiert, aber die Anzahl der Bytes falsch gezählt und obwohl es mir nichts erspart hat. Vielen Dank für den Tipp zum ersten Spiel.Python 3, 91 Bytes
Hmm ... sieht ein bisschen lang aus, besonders die zweite Zeile.
b=[b,2*b+(c<'a')][c.isalpha()]
ist allerdings etwas schlimmer.quelle
Pyth, 40 Bytes
Probieren Sie es hier aus!
Könnte 2 Bytes sparen, wenn ich das Ergebnis als Liste von Zeichen anstelle einer Zeichenfolge ausgeben kann.
Erläuterung
Filtert alle Nichtbuchstaben heraus, konvertiert Großbuchstaben in 1 und Kleinbuchstaben in 0, teilt sie in 3er-Blöcke auf, interpretiert jeden Block als Binärzahl und verwendet diesen als Index in einen String, der alle BF-Befehle enthält.
quelle
Jolf,
3134 BytesProbieren Sie es hier aus! Ersetzen Sie
►
mit\x10
und♣
mit\x05
. Da ich die Chop-Funktion falsch implementiert habe, gewinne ich 3 Bytes. :(quelle
Hoon , 212 Bytes
Ungolfed:
Hoon hat keine richtigen regulären Ausdrücke, nur eine Parser-Kombinator-Bibliothek, daher ist es leider ziemlich ausführlich. ++ Scan stürzt auch ab, wenn der gesamte Eingabestream nicht analysiert wird. Daher muss ++ rose verwendet, in eine Einheit umgewandelt und für den Wert "Am weitesten entfernt" entpackt werden. Es macht auch viel Gebrauch für das Currying und Mapping über Listen (++ wiederum), so dass ich die Funktionsnamen zu Ein-Buchstaben-Variablen alias.
Hoon ist die Programmiersprache für Urbit, ein Projekt zur Neuimplementierung von Clean Slate. Es ist rein funktional, statisch typisiert, vage lispelhaft und kompiliert nach Nock. Nock ist eine kombinatorbasierte VM, die auf einem Bignum-Speichermodell mit binären Bäumen ausgeführt wird.
Wenn Sie Urbit starten, werden Sie in das folgende Verzeichnis versetzt: dojo, the shell and Hoon repl. Um das Snippet auszuführen, geben Sie einfach Folgendes ein:
Fügen Sie dann die eigenständige Funktion in der nächsten Zeile ein.
quelle
Gelee , 27 Bytes
Probieren Sie es online! Beachten Sie, dass Backslashes in der Eingabezeichenfolge für den vorletzten Testfall maskiert werden müssen.
quelle
Matlab, 98 Bytes
quelle
Perl,
767372 + 1 = 73 BytesBenötigt die
-n
Flagge:Verwenden Sie den Trick mit Base-2-Konvertierung .
Wie es funktioniert:
quelle
Julia, 107 Bytes
Dies ist eine anonyme Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Ungolfed:
quelle
Lua, 120 Bytes
Wenn
string.gsub()
ich das hier ausführlich nutze , hätte ich ein weiteres Mal einen Ein-Zeichen-Zeiger für diese Funktion erstellen können, um ein paar Bytes zu erhalten. Außerdem ist es mein erstes Lua-Programm ohne Leerzeichen! : DDieses Programm nimmt seine Eingabe über ein Befehlszeilenargument entgegen und gibt ein BrainFuck-Programm aus, einen Befehl pro Zeile.
Edit: 1 Byte gespeichert dank @Oleg V. Volkov
Ungolf und Erklärungen
quelle
b
und ein weiteres Byte beim Speichernstring.gsub
in eine kürzere Variable und beim manuellen Falten der ersten Argumente speichern :g=("").gsub g(g(g(g(arg[1],"[%A]",""),"%l",0),"%u",1),"...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)
Python 2, 112 Bytes
Werde versuchen mehr Golf zu spielen.
quelle
Mathematica, 192 Bytes
Anonyme Funktion, die die gewünschte Zeichenfolge als Argument verwendet. Schritte im (ziemlich einfachen) Algorithmus:
quelle
Ruby
1171141131118679 Bytestr(?^+m='a-zA-Z','')
Setzt m auf'a-zA-Z'
und entfernt Nichtbuchstaben.tr(m,?0*26+?1)
wandelt Kleinbuchstaben in 0, Großbuchstaben in 1 um.scan(/.../)
Teilstring in Dreiergruppen aufteilen und letzte Gruppe verwerfen, wenn sie weniger als 3 hat{$><<"><[]-+.,"[$&.to_i 2]}
Wandle jede Binärzahl in ein Zeichen umquelle
tr("a-zA-Z","01")
? oder sogartr("A-Za-z",10)
"AAz".tr("a-zA-Z","01")
gibt111
gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
(86 Bytes). Die Eingabe von der Befehlszeilenoption in stdin geändert. Die umgebenden Anführungszeichen in der Ausgabe wurden korrigiert (aber jetzt gibt es keinen nachgestellten Zeilenumbruch)tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)
ist kürzerPerl 6, 81 Bytes
Dies kann wahrscheinlich besser gemacht werden, aber das ist mein Versuch
Verwendungszweck
Ungolfed
quelle
C ++,
173167 BytesVolles Programm, Golf (liest von der Standardeingabe):
Etwas ungolfed:
Beachten Sie, dass
@A
...Z[
in ASCII, und ebenfalls für`a
...z}
.quelle
Japt v2.0a0
-P
, 27 Bytes3 Bytes gespart dank @Shaggy
Versuch es
quelle
Pyke, 31 Bytes, nicht wettbewerbsfähig
Pyke ist älter als die Herausforderung, aber ich habe einige Funktionen hinzugefügt, um die Wettbewerbsfähigkeit zu verbessern - die Chunk-Funktion. Ich habe den gleichen Trick benutzt wie @Martin Büttner .
Probieren Sie es hier aus!
quelle
JavaScript, 148 Bytes
quelle
TI-BASIC,
311288 BytesWas, keine TI-BASIC Antworten? Zeit für mich, das zu beheben!
Eingabe ist der oOo- Code in
Ans
.Ausgabe ist der übersetzte BF- Code.
Beispiele:
Ungolfen:
(Zeilenumbrüche und Kommentare hinzugefügt)
Anmerkungen:
quelle