In dieser Aufgabe schreiben Sie ein Programm / eine Funktion, die ein normalisiertes Malbolge- Programm verwendet und das resultierende Malbolge- Programm ausgibt . (Dies ist ein geheimes Tool, das alle Malbolge-Programmierer verwenden!)
Eingang
Eine Datenstruktur, die (irgendwie) ein normalisiertes Malbolge-Programm darstellt.
Ausgabe
Eine Datenstruktur, die das resultierende Malbolge-Programm darstellt.
Beispiele
jpoo*pjoooop*ojoopoo*ojoooooppjoivvvo/i<ivivi<vvvvvvvvvvvvvoji
(=BA#9"=<;:3y7x54-21q/p-,+*)"!h%B0/.~P<<:(8&66#"!~}|{zyxwvugJ%
jjjj*<jjjj*<v
('&%#^"!~}{XE
jjjjjjjjjjjjjjjjjjjjjjj*<jjjjjjjjjjjjjjjjjjjjjjjj*<v
('&%$#"!~}|{zyxwvutsrqpnKmlkjihgfedcba`_^]\[ZYXWVT1|
Wie konvertiere ich?
Durchlaufen Sie das normalisierte Malbolge-Programm und führen Sie die folgenden Schritte für jedes Zeichen aus:
Ersetzen Sie die Zeichen in der Zeichenfolge
*jpovi</
durch das entsprechende Zeichen in'(>DQbcu
. (Das heißt, Karte*
zu'
,j
zu(
und so weiter.)Subtrahieren Sie dann die aktuelle Position des Programmzählers (dh die Anzahl der Zeichen vor dem aktuellen) vom ASCII-Code des Zeichens.
Wenn der resultierende ASCII-Code kleiner als 33 ist, erhöhen Sie ihn um 94 und wiederholen Sie den Vorgang, bis er mindestens 33 beträgt.
Hängen Sie das resultierende Zeichen an die Ausgabe an.
Regeln
- Dies ist ein Code-Golf- Wettbewerb; Die kürzeste Antwort gewinnt.
- Bitte keine Standardlücken .
- Die Standard-E / A-Methoden sind zulässig.
- Die Eingabe enthält nur die Zeichen
*jpovi</
.
*jpovi</
"?a: if ascii_code(temporary Malbolge representation) < 33: char := char + 94; goto a;
Antworten:
Gelee ,
2922 BytesProbieren Sie es online aus!
Eine monadische Verbindung, die eine Jelly-Zeichenfolge als Argument verwendet und eine Jelly-Zeichenfolge zurückgibt.
Vielen Dank an @JonathanAllan für das Speichern von 2 Bytes!
Erläuterung
quelle
..._J‘ịØṖḊ¤
spart ein Byte.Oị“%þV DCµ2® ‘_JịØṖḊ¤
Python 3 , 82 Bytes
Probieren Sie es online aus!
Vielen Dank an @Joel für das Ersetzen der hässlichen nicht druckbaren Zeichen im Bytestring durch druckbare.
Ich suche eine Mod-Kette zum Ersetzen
"*jpovi<".find(c)
ich , aber ich glaube nicht, dass es eine gibt, die kürzer ist, und eine nicht erschöpfende Brute-Force-Suche hat bisher nichts gefunden.82 Bytes
Probieren Sie es online aus!
quelle
b"de{#0ABT"["*jpovi<".find(c)]
wenn Sie ein Programm dafür haben.x%84%15%7
für die rechte Hälfte des Mappings durchsucht , aber ich denke, ich kann Code, den ich geschrieben habe, für eine weitere Herausforderung bei der Suche einschließlich*
und nach/
Begriffen recyceln .%
und*
(//
in Python 3 ist es wahrscheinlich nicht wert.) Tatsächlich hat nichts die ersten 6 von 7 Werten erreicht. Ich hoffte, dass dies funktionieren würde, da eine grobe Entropieschätzung besagt, dass wahrscheinlich genug Ausdrücke mit% 7` enden, aber es ist nah. Und vielleicht liefern diese Ketten Ausgaben, die bei weitem nicht gleichmäßig verteilt sind, zumal, sobald zwei Eingaben auf den gleichen Wert zusammenfallen, keine weiteren Operationen sie trennen können. Das Zeug, das ich versuche, ist immer noch viel zu dumm, um den größeren Ausdruck zu suchen, aber wenn Sie irgendwelche Ideen haben, versuchen Sie es.map(ord, "*jpovi<")
. Wenn die Ausgabe die Reihenfolge für die meisten Eingaben nicht beibehält (dhf(m)>=f(n)
wennm>=n
), werden einige sorgfältig ausgearbeitete Konstanten für%
und*
wahrscheinlich benötigt, und eine Brute-Force-Suche führt wahrscheinlich nicht zu einem positiven Ergebnis.Malbolge Unshackled (20-Trit-Rotationsvariante), 7.784e6 Bytes
Die Größe dieser Antwort überschreitet die maximale Größe des postbaren Programms (eh), sodass sich der Code in meinem GitHub-Repository befindet .
Wie führe ich das aus?
Dies könnte ein schwieriger Teil sein, da der naive Haskell-Dolmetscher ewig brauchen wird, um dies auszuführen. TIO hat einen anständigen Malbogle Unshackled-Interpreter, aber leider kann ich ihn nicht verwenden (Einschränkungen).
Das beste, das ich finden konnte, ist die Variante mit fester 20-Trit-Rotationsbreite, die sehr gut funktioniert und 0,5 Zeichen pro Sekunde konvertiert .
Um den Dolmetscher etwas schneller zu machen, habe ich alle Schecks von Matthias Lutters Malbolge Unshackled-Dolmetscher entfernt.
Meine modifizierte Version kann ungefähr 6,3% schneller laufen.
Es funktioniert!
quelle
Python 3 ,
8483 BytesProbieren Sie es online aus!
Dies ist hauptsächlich ein mathematisches Problem bei der Vereinfachung der Berechnung sowie beim Golfen, nachdem die Mathematik abgeschlossen wurde. Die ungolfed Version des Codes wird unten gezeigt.
Ungolfed, nicht rekursive Version
Probieren Sie es online aus!
quelle
JavaScript (Node.js) , 69 Byte
Probieren Sie es online aus!
Wie?
quelle
Perl 6 ,
65 5553 BytesProbieren Sie es online aus!
Verwendet den Mod 11-Trick aus Arnauds Antwort
quelle
05AB1E ,
32312322 Bytes-8 Bytes, die einen Port von NickKennedys Jelly-Antwort erstellen , also stellen Sie sicher, dass Sie ihn positiv bewerten !!
-1 Byte dank @Grimy.
Gibt als Liste von Zeichen aus.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Sehen Sie diese 05AB1E Spitze Mine (Abschnitt Wie große natürliche Zahlen zu komprimieren? Und Wie zu komprimieren integer Listen? ) Zu verstehen , warum
•4¡ˆ¶ü]₁η₃•
ist82767635194143615015
und•4¡ˆ¶ü]₁η₃•₃в
ist[1,36,30,85,0,67,66,8,49,7,0]
.quelle
•1ÃQWý₂Ýδ9•86в
->•4¡ˆ¶ü]₁η₃•₃в
Perl 5 (
-p
),53, 51 BytesSpeichern Sie 2 Bytes, indem Sie
de{#0ABT
statt verwenden,'(>DQbcu
damit61
nicht mehr benötigtTIO
Die erste Antwort war
TIO
quelle
Japt ,
2423 BytesPort of Nick's Jelly-Lösung
Versuch es
quelle
Retina 0,8,2 , 50 Bytes
Probieren Sie es online aus! Link enthält Testfälle. Erläuterung:
Führen Sie die Transliteration wie in der Frage beschrieben durch.
p
(unten beschrieben) undo
haben eine besondere Bedeutung für dieT
Übersetzung, daher müssen sie zitiert werden.Listen Sie jedes Zeichen in einer eigenen Zeile auf, gefolgt von einer Anzahl von Leerzeichen gemäß seinem Index, dh dem Programmzähler.
Dekrementieren Sie das letzte Zeichen in jeder Zeile wiederholt zyklisch und löschen Sie jedes Mal das vorhergehende Leerzeichen, bis alle Leerzeichen gelöscht wurden. Das
p
steht für druckbares ASCII, dh-~
wir möchten, dass das!
Mapping~
so zugeordnet wird, dass es zuerst transliteriert wird, und dann_
wird das Leerzeichen in der Übereinstimmung.¶
gelöscht, während die verbleibenden Zeichen jeweils um einen Zeichencode transkribiert werden.Verbinde alle Charaktere wieder miteinander.
quelle
Holzkohle , 23 Bytes
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Port of @ Arnauld's JavaScript-Antwort. Erläuterung:
quelle
C # (Visual C # Interactive Compiler) , 62 Byte
Probieren Sie es online aus!
Port von @Arnaulds JavaScript-Antwort. Eine, wenn die seltenen Fälle, in denen C # kürzer ist!
quelle
Haskell , 135 Bytes
Probieren Sie es online aus!
quelle