RLE Brainfuck
(bezogen auf BF-RLE )
Die hypothetische RLE ( - Dialekt Run-Length Encoding ) von Brainfuck akzeptiert die Symbole für die 8 Befehle und auch Ziffern. Die Ziffern werden verwendet, um die Anzahl der aufeinanderfolgenden Wiederholungen eines Befehls darzustellen, wodurch eine Codierung des Quellcodes über die gesamte Laufzeit ermöglicht wird.
8>
entspricht >>>>>>>>
.
Die Länge steht immer auf der linken Seite des Befehls.
Ihre Aufgabe ist es, das kürzeste Programm / die kürzeste Funktion zu schreiben, die die Eingabezeichenfolge (RLE-Brainfuck-Fragment) in ein reguläres Brainfuck-Programm übersetzt.
Beispielsweise:
Eingang:
10+[>+>3+>7+>10+4<-]3>2+.>+.7+2.3+.2<2+.>15+.>.3+.6-.8-.2<+.<.
Ausgang:
++++++++++[>+>+++>+++++++>++++++++++<<<<-]>>>++.>+.+++++++..+++.<<++.>+++++++++++++++.>.+++.------.--------.<<+.<.
Der kürzeste Byte-Code in jeder Sprache gewinnt.
Antworten:
Python 2 ,
6261 BytesProbieren Sie es online!
Die Regex-Ersetzung wird
3<2+-
in die Zeichenfolge erweitert:das ist dann
eval
ed. (Beachten Sie, wenn\1
leer ist, erhalten wir1**1 = 1
.) Der erste+
ist ein unärer Operator, der an die erste Zahl bindet, und die anderen+
s sind Zeichenfolgenverkettung. Dies schlägt umso offensichtlicherum 14 Bytes. Normalerweise
"\2"
würde das nicht immer funktionieren, aber zum Glück\
und"
ohne Brainfuck-Befehle.xnor speicherte ein Byte und lieferte den
1*\1*1
Trick. Zuvor hatte ich\1L
in der Regex undL=1
als Lambda-Argument definiert, was auch ziemlich cool ist:3L
Ist ein langes Int-Literal undL
ist eine Variable.quelle
L
, um mit der leeren Zeichenfolge umzugehen. Es gibt aber einen kürzeren Wegr'+1*\1*1*"\2"'
.import re
unter dem Lambda?f=\
in die Kopfzeile eingefügt - jetzt hat das Lambda einen Namen!)Pyth , 2 Bytes
Probieren Sie es hier aus!
Wie es funktioniert
quelle
Lua,
656463 BytesGroß ! Ausnahmsweise schlägt Lua Python!Bearbeiten: Ein Byte dank @Jarhmander gespeichert, dank ihm für den nützlichen Trick, ein einzelnes Ergebnis zu erzwingen
Probieren Sie es online!
Erklärungen
quelle
,""
das gesamte print-Argument entfernen und in parens einschließen. In Parens eingeschlossene Ausdrücke werden in Lua auf einen Wert angepasst (siehe lua.org/manual/5.3/manual.html#3.4 ).Scala ,
7369 BytesProbieren Sie es online!
quelle
Perl 5 , 18 Bytes
17 Byte Code + 1 für
-p
.Probieren Sie es online!
quelle
vim,
2925232216 Bytes<C-V>
ist 0x16,<ESC>
ist 0x1b.Dabei wird jede Ziffer, die keine Ziffer ist, durch einen Befehl ersetzt, der dieses Zeichen an den Puffer anfügt. Die Zählungen bleiben allein und ändern diese Befehle. Zu diesem Zeitpunkt ist der Puffer ein Vimscript-Programm, das das gewünschte Brainfuck-Programm erzeugt. Daher ziehen wir es in ein Register und führen es aus.
Probieren Sie es online!
Edit: Size reductions thanks to suggestions: H.PWiz: 5, TheFamilyFroot: 5, DJMcMayhem: 1
quelle
&
oder\0
) ohne Klammern verwenden. Auch ein Tipp von mir, nicht TheFamilyFroot istdass Sie verwenden könnenD
anstattdd
für-1
Byte.RLE Brainfuck, 204 Bytes
Soweit ich weiß, sind die Spezifikationen für die Brainfuck-Umgebung nicht besonders gut definiert. Dieses Programm geht davon aus, dass die Zellen im Band beliebig große positive und negative ganze Zahlen ohne Überlauf zulassen. Dieser Code transkribiert auch befehlslose Kommentare, erweitert jedoch die Lauflängencodierung von Kommentaren (z. B. "see 3b" → "see bbb"). Das resultierende Programm sollte dasselbe laufen, damit ich nicht zu besorgt bin.
Ich bin mir ziemlich sicher, dass ich noch ein paar Bytes Golf spielen könnte, aber ich bin erschöpft davon, damit zu arbeiten.
Hier ist der benutzerdefinierte Interpreter + Tests, mit denen ich ihn getestet habe. Wenn Sie die Eingabe im Feld Standardeingabe übergeben, sollte sie für diese Eingabe ausgeführt werden, anstatt die Tests auszuführen.
Mein unordentliches ungolfed workpad:
quelle
10+
. B. ? Das OP hat in einem Kommentar klargestellt, dass count immer größer als 0 ist, so dass Sie möglicherweise einige Bytes wegschneiden können, wenn es das erstere ist.while max
Schleife immer mindestens einmal ausgeführt wird und ich den Puffer, in dem ich den Wert der Ziffer in dieser Schleife speichere, bedingungslos erhöhe, muss ich diesen Puffer bei -1 beginnen. Ich frage mich, ob ich ein paar Bytes einsparen könnte, wenn ich diesen Puffer logisch beivalue+1
🤔Gestapelt , 24 Bytes
Probieren Sie es online!
Erläuterung
quelle
TeX, 124 Bytes
(geschrieben in zwei Zeilen, um sichtbar zu sein, aber der Code kann in einer Zeile geschrieben werden)
Dies definiert ein Makro
\b
, das die Eingabe in das Formular übernimmt\b<input>;
und die gewünschte Ausgabe in das Dokument druckt.quelle
Retina ,
2823 Bytesdanke an @Leo für -5 bytes
Probieren Sie es online!
quelle
\b
im zweiten regulären Ausdruck nur einen1
pro Lauf von1
s zuordnen ?Pyon , 66 Bytes
Probieren Sie es online!
Pyon ist so ziemlich nur Python, dies ist jedoch kürzer, da
re
es automatisch importiert wird, wenn Sie es verwenden, unda
automatisch auf ein Argument oder die Eingabe festgelegt wird-4 Bytes dank Mr. Xcoder
quelle
g[0]
umg[:-1]
(für den gegebenen Testfall oder eine beliebige Anzahl von mehr als 9 ausfällt).lambda
die tatsächlich Bytes verschwendet? Golfed und korrigiert für 66 BytesPython 2 ,
1009389 Bytes-7 dank Mr.Xcoder
Probieren Sie es online!
quelle
Haskell , 60 Bytes
Probieren Sie es online!
quelle
R ,
12110690 BytesProbieren Sie es online!
Es wurden 15 Bytes gespart, indem erkannt wurde, dass dies
rep()
zu numerisch wird. Dank Giuseppe weitere 16 gespart, hauptsächlich durch die Verwendung vonpmax
, um leere Zeichenfolgen durch zu ersetzen1
quelle
ifelse(x>"",x,1)
ist ein Byte kürzer und\\D
entspricht[^\\d]
und das Beste von allem ist, dass Sie es nicht brauchen. Dasperl=T
sind also süße 99 Bytes . Ich hätte wirklich nicht gedacht, dass das weniger als 100 Bytes sein könnten!pmax
pmax
mit einer schönen großen Verbesserung - danke!"1"
mit1
aspmax
,character
um den Vergleich zu erzwingen .PowerShell ,
6662 BytesProbieren Sie es online!
Nervenzusammenbruch
Was für ein Chaos!
Ausgehend von
$args
, einem einzelnen Elementarray, das die RLE-Zeichenfolge enthält, erzwinge ich eine tatsächliche Zeichenfolge, indem ich sie in Anführungszeichen setze.Dann teilen Sie es durch die Wortgrenze (
\b
in Regex). Dadurch erhalte ich eine Reihe von Zeichenfolgen, wobei jedes Element entweder eine Zahl oder die BF-Token ist, die nach der Zahl stehen. So in dem Beispiel sind die ersten 4 Elemente dieser Split - Array10
,+]>+>
,3
,+>
(alle sind string).Als nächstes leite ich das in
ForEach-Object
(%
), um mich mit jedem Element zu befassen .Die Mitte ist ein bekannter PowerShell-Golfismus mit einer Wendung. Es handelt sich im Wesentlichen um einen DIY-Ternäroperator, in dem Sie ein Array mit 2 Elementen erstellen und es dann mit dem zu testenden Booleschen Ausdruck indizieren, wobei ein falsches Ergebnis Element 0 und ein wahres Ergebnis Element 1 ergibt.
In diesem Fall erstelle ich tatsächlich ein einzelnes Elementarray mit dem unären Komma
,
Operator " , da ich keine Ausgabe im wahren Fall möchte.Schauen wir uns zuerst den Indexer an, auch wenn er später ausgeführt wird.
Die Idee dabei ist, dass
$_
(das aktuelle Element) entweder eine gültige Zahl oder eine andere Zeichenfolge sein kann. Wenn es sich um eine Zahl handelt, möchte$n
ich den Wert dieser Zahl minus 1 (als Zahl, nicht als Zeichenfolge) darstellen. Wenn nicht, will ich$n
ich falsch sein.PowerShell versucht normalerweise, den Wert für die rechte Hand auf den Typ der linken Seite zu setzen, dies kann jedoch vom Vorgang abhängen.
"10"+5
Geben Sie zum Hinzufügen eine neue Zeichenfolge ein"105"
, während10+"5"
Sie eine Ganzzahl (15
) erhalten.Aber Strings kann nicht so statt subtrahiert werden kann Powershell den numerischen Wert automatisch mit einer Schnur auf der linken Seite der Subtraktion schließen, daher
"10"-5
gibt5
.Also, ich beginne mit
$_-1
, was mir die Nummer gibt, die ich möchte, wenn$_
es sich tatsächlich um eine Nummer handelt, aber wenn es nicht so ist, bekomme ich nichts. Oberflächlich betrachtet ist "nichts" falsch, aber das Problem ist, dass die Ausführung dieser Zuweisung abgebrochen wird, sodass$n
der vorherige Wert beibehalten wird. nicht was ich will!Wenn ich es in einen Unterausdruck einbinde, erhalte ich meinen falschen Wert, wenn es fehlschlägt:
$($_-1)
.Das alles wird zugewiesen
$n
und da diese Zuweisung selbst in Klammern eingeschlossen ist, der Wert, der zugewiesen wurde$n
auch an die Pipeline übergeben.Da ich es im Indexer verwende und ich möchte,
1
dass die Konvertierung erfolgreich war, verwende ich zwei booleschenot
Ausdrücke!!
, um diesen Wert in einen booleschen Wert zu konvertieren. Eine erfolgreiche Zahlenumwandlung endet als wahr, während das falsche Nichts uns so süß, süß gibt0
ermöglicht, das einzige Element in diesem gefälschten ternären Array zurückzugeben.Zurück zu diesem Array lautet das Element wie folgt:
$("$($_[0])"*$n*$_)
$(,$_[0]*$n+$_)
"$($_[0])"
- Dies ist ein ärgerlich langer Weg, um das erste Zeichen des aktuellen Elements zu erhalten (sagen wir mal+
von+[>+
), aber als Zeichenfolge und nicht als[char]
Objekt. Ich muss eine Zeichenfolge sein, da ich eine Zeichenfolge mit einer Zahl multiplizieren kann, um sie zu duplizieren, aber ich kann das nicht mit einem Zeichen tun.Tatsächlich konnte ich 4 Zeichen speichern, indem ich ein
[char]
Array anstelle eines Strings verwendete (indem,
ich ein anderes unäres Komma verwendete ), sodass ich die Anführungszeichen und den zusätzlichen Unterausdruck entfernen konnte. Ich kann ein Array multiplizieren, um seine Elemente zu duplizieren. Und da das gesamte Ergebnis dieser Iteration ohnehin ein Array ist und bearbeitet werden muss-join
, verursacht die Verwendung eines Arrays hier keine zusätzlichen Kosten.Dann multipliziere ich dieses
String-Array mit$n
, um es$n
mal zu duplizieren . Recall , die$n
sein könnte ,$null
oder es könnte der Wert der vorstehenden Ziffern minus eins sein.Dann
+$_
addiert das aktuelle Element auf das Ende der duplizierten ersten Zeichen dieses Elements. Deshalb$n
ist minus eins.Auf diese Weise
10+[>+
endet mit bis$n
gleich 9, dann wir 9 machen+
‚s und die zurück zum hinzufügen+[>+
Zeichenfolge für die Fahrt entlang der erforderlichen 10 sowie die anderen einzelnen Elemente zu erhalten.Das Element wird in einen Unterausdruck eingeschlossen
$()
, weil , wenn$n
ist$null
, der gesamte Ausdruck fehlschlägt, so dass die Anordnung zu schaffen ausfällt, so dass die Weitertaktungs nie ausgeführt wird , so$n
wird nie zugewiesen.Der Grund , warum ich diesen ternären Trick ist , weil eines seiner Besonderheiten: Im Gegensatz zu einem echten ternären Operator, die Ausdrücke, die die Elemente definieren Sie bekommen ausgewertet , ob sie „ausgewählt“ werden, und das erste was das betrifft.
Da muss ich das zuordnen und dann nutzen
$n
separate Iterationen , ist dies hilfreich. Der Wert des ternären Array-Elements wird mit dem Wert der vorherigen Iteration bewertet$n
, und der Indexer weist$n
die aktuelle Iteration neu zu.Also die
ForEach-Object
Schleifen geben also alles aus, was sie sollen (eine Reihe von Fehlern, die wir ignorieren), aber als Array von neuen Zeichenfolgen.Das Ganze wird also in Klammern eingeschlossen und dann mit unary eingeleitet
-join
, um die Ausgabezeichenfolge zu erhalten.quelle
QuadR , 17 Bytes
Probieren Sie es online!
Vielen Dank an Adám für die korrekte Version des Codes.
Wie es funktioniert:
quelle
'\d+.'⎕R{¯1((⍎↓)⍴↑)⍵.Match}
Proton , 50 Bytes
Probieren Sie es online!
quelle
Java 8, 148 Bytes
VerdammteJava-Regexes sind manchmal so nutzlos. Das letzte Mal war es einMangel, die Erfassungsgruppe"$1"
für irgendetwas zu verwenden, jetzt dies. Ich möchte3c
mitccc
oder000c
mitersetzenccc
als Einzeiler, aber leider hat Java keine Möglichkeit , dies zu tun , ohne eine Schleife. Ah, gut.Erläuterung:
Probieren Sie es hier aus.
quelle
Haskell , 84 Bytes
Probieren Sie es online!
Erläuterung:
span(`elem`['0'..'9'])s
Teilt die angegebene Zeichenfolges
in ein Präfix aus Ziffern und den Rest auf. Die Zuordnung des Ergebnisses zum Muster(n:m,x:r)
stellt sicher, dass das Ziffernpräfix nicht leer ist und bindet das Zeichen nach den Ziffern anx
und den Rest anr
.x<$[1..read$n:m]
Liest die Ziffernfolgen:m
als Zahl und wiederholt siex
so oft. Das Ergebnis wird mit der rekursiven Behandlung der verbleibenden Zeichenfolge verknüpftr
.quelle
R , 151 Bytes
Outgolfed von user2390246 ! Dies ist nun im Grunde ein Müllansatz im Vergleich zu diesem, aber ich werde ihn weiter verbessern.
Probieren Sie es online!
Gibt auch eine Reihe von Warnungen aus.
Als nächstes prüfen, ob die Verwendung von a
grep
effizienter ist alssubstr
quelle
JavaScript (ES6), 46 Byte
Ziemlich einfache Erklärung:
quelle
Ruby , 35 Bytes
Probieren Sie es online!
quelle
Untyped Lambda Calculus , 452 Bytes
Eingabe und Ausgabe bestehen aus rechts gefalteten Listen der Kirche, die codiert sind Zeichencodes, beispielsweise der Zeichencode einer Neuen - Zeile ist 10 , so dass die Kirche Codierung wäre
λf.λx.f(f(f(f(f(f(f(f(f(f x)))))))))
. Das Umwandeln von "ABCD" in eine Liste sieht so aus,λf.λx.f 65 (f 66 (f 67 (f 68 x)))
aber die Zahlen sind kirchencodiert.Wenn Sie eine codierte Zeichenfolge auf das Programm anwenden und sie vollständig reduzieren, erhalten Sie eine codierte Ausgabezeichenfolge mit der angewendeten RLE.
quelle
qλq
Notation auch? Das habe ich noch nie gesehen.Funky , 42 Bytes
Probieren Sie es online!
quelle
C ++,
239235 Bytes-4 Bytes dank Zacharý
quelle
g=(g?g:1)
zug+=!g
? Wenn das nicht funktioniert, können Sie die Klammern nicht entferneng?g:1
Dart, 78 Bytes (mit Regex), 102 Bytes (ohne Regex)
Mit Regex:
Ohne Regex:
Beides muss gerne aufgerufen werden
(<code here>)("input string")
.Regex ist ein Standard, aber der ohne Regex ist etwas ganz Besonderes.
Regex-less missbraucht optionale Parameter, um lokale Variablen in der Funktion "single return" zuzuweisen. Andernfalls müssen Sie einen Block erstellen und das Schlüsselwort return verwenden. Wenn die Codeeinheit zwischen 0 und 9 liegt, wird sie für jede Codeeinheit akkumuliert
n
und eine leere Zeichenfolge zurückgegeben. Andernfalls wird das Zeichen mit dem Wert von multipliziertn
(Sonderfall bei n == 0, in diesem Fall wird immer 1 Zeichen ausgegeben) undn
auf 0 gesetzt.(n=0*(c=n))+c
das Zeichencodeargument auf den Wert vonn
, multipliziertn
/c
mit 0 speichert 0 bisn
und addiert dannc
. Dies setzt unser zurück,n
ohne in einem Anweisungskontext zu sein.quelle
Python3, 96 Bytes
Ich habe es mit einer anderen Implementierung in Python versucht, aber ich kann /codegolf//a/146923/56846 nicht übertreffen :(
quelle