Verwandt mit: Machen Sie einen; # -Interpreter
In der oben verknüpften Herausforderung bestand die Aufgabe darin, einen Dolmetscher für die esoterische Sprache zu erstellen ;#
.
Die ;#
sprache
Die Sprache hat genau zwei Befehle: ;
und #
(alle anderen Zeichen werden vom Interpreter ignoriert):
;
: Erhöhen Sie den Akku
#
: Modulieren Sie den Akku um 127, drucken Sie das entsprechende ASCII-Zeichen und setzen Sie den Akku auf 0 zurück.
Herausforderung
Da ich faul bin, aber noch weitere Testfälle testen möchte, benötige ich ein Programm oder eine Funktion, die einfachen Text in ;#
Code umwandelt .
Eingang
Die Eingabe ist eine Zeichenfolge, die entweder als Argument oder über stdin verwendet wird. Es enthält nur druckbare ASCII-Zeichen und Zeilenumbrüche.
Ausgabe
Die Ausgabe ist das generierte ;#
Programm, indem Sie zu stdout zurückkehren oder es drucken. Solange das Programm gültig ist, darf es andere Zeichen als #
und enthalten, ;
da alle anderen Zeichen ignoriert werden.
Beispiele
Input: Hello, World!
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Input: ABC
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Input: ;#
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#
Bestenliste
quelle
;#
Ignoriert alle anderen Zeichen, so dass das generierte Programm weiterhin funktioniert.;
. Zweitens ist 127 richtig, wie in der verknüpften Frage angegeben, die die Angabe der Sprache; # enthält.Antworten:
; # + , 61 Bytes
Von Conor O'Brien überfordert
Probieren Sie es online!
Beachten Sie, dass die Eingabe ein nachfolgendes Null-Byte enthält.
quelle
; # + , 40 Bytes
Probieren Sie es online! Die Eingabe wird mit einem Null-Byte abgeschlossen.
Erläuterung
Der Code ist in zwei Teile unterteilt: Generierung und Iteration.
Generation
Dies setzt die Konstanten
;
und#
in den Speicher als solche:Iteration
quelle
#
@tuskiomi. Probieren Sie es online!Brainfuck ,
5954 BytesProbieren Sie es online!
quelle
Jelly ,
1087 BytesProbieren Sie es online!
-2 Bytes dank @Emigna
-1 Bytes dank @Dennis
quelle
O”;ẋ;€”#
stattdessen tun ?;€
werden kannp
.GS2 , 6 Bytes
Probieren Sie es online!
Reversible Hexdump (xxd)
Wie es funktioniert
quelle
■
= was zum Teufel?2
ist der Multiplikationsbefehl? GS2 ist komisch: P■
ist nur eine Map und GS2 implementiert Strings als Listen von ganzen Zahlen.2
ist XOR ...Taxi, 779 Bytes
Probieren Sie es online!
Ungolfed:
Erläuterung:
quelle
05AB1E , 8 Bytes
Probieren Sie es online!
Erläuterung
quelle
Brainfuck, 43 Bytes
Null Byte beendet das Programm.
Erläuterung
quelle
Python 3 , 39 Bytes
Probieren Sie es online!
quelle
for s in input():print(";"*ord(s)+"#")
ist ein Byte kürzer.> <> , 22 Bytes
Probieren Sie es online oder auf dem Fischspielplatz
Eingang ist STDIN, Ausgang ist STDOUT. In> <> sind Zeichen und ASCII-Codes dasselbe, also müssen wir nur ein Zeichen lesen, das Zeichen drucken
";"
und dekrementieren, bis es 0 ist, und dann drucken"#"
und schleifen, bis keine Eingabe mehr übrig ist.quelle
F #, 79 Bytes
Probieren Sie es online!
Erweitert
convert nimmt den eingegebenen String und gibt ein; # Programm aus
Verwendung
quelle
Python 2 - 36 Bytes
Probieren Sie es online!
quelle
PowerShell,
292725 ByteZiemlich einfach. Übernimmt die Eingabe als Befehlszeilenargument. Die Ausgabe ist ein gültiges # Programm, das den angeforderten Text druckt.
quelle
#
und solange;
alle anderen Zeichen ignoriert werden.«$args
ist genug.Brainfuck , 47 Bytes
Probieren Sie es online!
Siehe auch: Die Antwort von ovs , die einen ähnlichen Ansatz verfolgt, jedoch eine andere Methode zum Generieren von Konstanten und ein anderes Zellenlayout verwendet.
Erläuterung:
Diese Herausforderung passt ziemlich gut zur Brainfuck-Spezifikation, was bedeutet, dass die Lösung im Wesentlichen trivial ist. Brainfuck nimmt Eingaben als ASCII-Werte entgegen. Dies ist genau das, was # ausgeben muss.
Das Schema für das Transpilieren ist einfach: Generieren Sie den ASCII-Wert für
;
und#
drucken Sie;
gleich dem ASCII-Wert des eingegebenen Zeichens, drucken Sie#
und wiederholen Sie für jede Eingabe.quelle
Mathematica, 49 Bytes
Erläuterung
Konvertiert die Eingabezeichenfolge in eine Liste von Zeichencodes,
Map
s die FunktionStringRepeat[";",#]<>"#"&
über der Liste undStringJoin
s das Ergebnis mit der leeren Zeichenfolge.quelle
<>""
?StringJoin
ing (<>
) die leere Zeichenkette verkettet jede Zeichenkette.Aceto , 19 Bytes
Da es in Aceto einen Dolmetscher gibt , dachte ich, dass es auch auf diese Herausforderung eine Aceto-Antwort geben wird. Es passt genau in eine Hilbert-Kurve 2. Ordnung:
Zunächst lesen wir ein einzelnes Zeichen (
,
) und duplizieren und negieren es, um zu testen, ob es sich um eine neue Zeile handelt (d!
beim Lesen einer neuen Zeile wird normalerweise ein leeres Zeichen auf den Stapel geschrieben). Ich benutze dann einen meiner Meinung nach ziemlich cleveren Trick, um den Newline-Fall kompakt zu handhaben:`'\n
Wenn der Wert auf dem Stapel ist
True
(lesen wir eine neue Zeile), das Codemittel: Sie (`
) legte einen Zeichenliteral auf dem Stack ('
), die ein Newline ist:\n
.Wenn der Wert auf dem Stapel ist
False
(wir nicht eine neue Zeile gelesen haben), dass Code - Mittel: nicht (`
) lesen (ein Zeichenliteral'
). Das heißt, das nächste Zeichen wird als Befehl ausgeführt. Glücklicherweise wird der nächste Befehl durch einen Backslashn
übergangen ( damit er nicht ausgeführt wird), sodass keine neue Zeile ausgegeben wird (wasn
normalerweise der Fall ist).Der Rest des Codes ist unkompliziert. Wir konvertieren das Zeichen auf dem Stapel in die Ganzzahl seines Unicode-Codepunkts (
o
), drücken ein Semikolon (';
), multiplizieren die Zahl mit der Zeichenfolge (*
wie in Python),p
drucken das Ergebnis, drücken ein Literal ('
)#
,p
drucken es auch, und gehen Sie zurück zumO
rigin.Führen Sie mit aus,
-F
wenn Sie sofortige Ergebnisse sehen möchten (da Pufferung), aber es funktioniert auch ohne.quelle
Perl, 24 Bytes
Laufen Sie mit
perl -pe
.Alternative Lösung:
Laufen Sie mit
perl -nE
.quelle
Trost , 11 Bytes
Ja, neue Sprachen.
Erläuterung
quelle
Fourier , 19 Bytes
Probieren Sie es auf FourIDE!
Um ausgeführt zu werden, müssen Sie die Eingabezeichenfolge in Anführungszeichen setzen.
Erklärung Pseudocode
quelle
Befunge-98 (FBBI) ,
231710 Bytes-5 Bytes dank Jo King .
Probieren Sie es online!
quelle
JavaScript,
5554515048 BytesProbieren Sie es online aus
Alternativen
Wenn wir Eingaben als Array einzelner Zeichen annehmen können, können 5 Bytes gespeichert werden.
Wenn wir auch als Array ausgeben können, können 2 weitere Bytes gespeichert werden.
quelle
\n
sollte werden;;;;;;;;;;#
..
zu[^]
, was würde es noch ein Byte kürzer lassen alsmap/join
?join()
in Ihrer vorherigen Antwort war angesichts der Spezifikation für unnötig;#
, und Sie können auch deklarieren, dass die Eingabe für Ihre Funktion ein Array von Zeichen ist, obwohl der zweite Vorschlag etwas langwierig ist. So oder so, das bringt Sie auf maximal 48 Bytes.Eigentlich 11 Bytes
Probieren Sie es online!
Erläuterung:
quelle
APL (Dyalog) , 18 Bytes
Probieren Sie es online!
⎕UCS
In Unicode-Codepunkte konvertieren';'⍴¨⍨
Verwenden Sie jeden Codepunkt, um ein Semikolon umzuformen ( ⍴ = Rho ≈ R ; R eshape)#',¨⍨
füge einen Hash an jede Zeichenkette anquelle
Ruby,
2825 Bytes24 Bytes plus den
-n
Befehlszeilenschalter, um wiederholt zu arbeitenstdin
.3 Bytes gespart (und Ausgabe in Zeilenumbrüchen korrigiert!) Dank Handarbeit.
quelle
.ord
durch die Arbeit direkt mit Zeichencodes:$_.bytes{|b|$><<?;*b+?#}
. Es gibt einen Unterschied: Dieser codiert auch den Zeilenumbruch in der Eingabe. Ich bin mir nicht sicher, was der Fragesteller mit „Es enthält nur druckbare ASCII-Zeichen und Zeilenumbrüche“ zu sagen beabsichtigt, aber für mich klingt es so, als ob Zeilenumbrüche ebenfalls codiert werden sollten.bytes
. Ich habe OP nach neuen Zeilen oben gefragt und werde diese anschließend bearbeiten.PHP, 54 Bytes
Probieren Sie es online!
quelle
Alice , 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
PHP, 48 Bytes
quelle
jq, 30 Zeichen
(26 Zeichen Code + 4 Zeichen Befehlszeilenoptionen)
Probelauf:
Online-Test
quelle
Pyth, 10 Bytes
Versuch es!
quelle
Röda , 24 Bytes
Probieren Sie es online!
quelle