Schreiben Sie den kürzesten Code in der Sprache Ihrer Wahl, um die Lauflängendekodierung der angegebenen Zeichenfolge durchzuführen.
Die Zeichenfolge wird als Eingabe für stdin im Formular bereitgestellt
CNCNCNCNCNCNCNCN
wobei jedes C
beliebige druckbare ASCII-Zeichen sein kann und jedes N
eine Ziffer 1
bis 9
(einschließlich) ist.
Beispieleingabe:
:144,1'1
Entsprechende Ausgabe:
:4444,'
Shakespeare-Programmiersprache , 406 Bytes
Ungolfed-Version:
Ich verwende den Python-SPL-Compiler von drsam94 , der einige Fehler aufweist (weshalb ich ihn beispielsweise
Open your mind
anstelleOpen thy mind
der Golfversion verwende).Um dieses Programm auszuführen, verwenden Sie:
Wie es funktioniert
SPL ist eine esoterische Programmiersprache, mit der Programme wie Shakespeare-Stücke aussehen. Dabei werden Zeichen als Variablen verwendet, und die Verarbeitung wird ausgeführt, indem die Zeichen Dinge zueinander sagen.
Dies ist der Titel des Stücks; es wird vom Compiler ignoriert.
Hier deklarieren wir die im Rest des Programms verwendeten Variablen. Alles zwischen
,
und.
wird vom Compiler ignoriert. In diesem Fall deklarieren wirRomeo
, um das zu dekodierende Zeichen zu speichern, undJuliet
, um die Lauflänge des Zeichens zu speichern.Hier deklarieren wir die erste und einzige Handlung im Programm. Acts und Szenen sind wie Labels. Sie können jederzeit mit
let us return to scene II
oder einer Variante davon angesprungen werden . Wir verwenden nur einen Akt, weil er für unsere Bedürfnisse ausreicht. Auch hier wird alles zwischen:
und.
vom Compiler ignoriert.Hier deklarieren wir die erste Szene. Szenen sind in römischen Ziffern nummeriert: die erste ist
Scene I
, die zweiteScene II
und so weiter.Dies ist eine Regie; Darin teilen wir den Variablen
Romeo
undJuliet
mit, dass sie die "Bühne" betreten sollen. Es können nur zwei Variablen gleichzeitig auf der "Bühne" sein. Die Stufe wird verwendet, damit der Compiler herausfinden kann, welche Variable welche adressiert, wenn sie sprechen. Da wir nur zwei Variablen haben, bleiben Romeo und Julia für die Dauer des Programms auf der Bühne.Eine weitere Szenendeklaration. Szene II wird angesprungen, um eine andere Lauflänge zu dekodieren.
Diese Form der Erklärung bedeutet, dass Julia anfängt zu sprechen. Alles bis zur nächsten
Romeo:
, Regieanweisung oder Szenen- / Handlungserklärung wird eine Linie sein, die von Julia gesprochen wird, und so wird sich "ich" auf Julia, "du" / "du" auf Romeo usw. beziehen.Dieser Befehl speichert den Ordnungswert eines einzelnen Zeichens aus STDIN in
Romeo
.In der SPL werden Substantive entweder zu 1 oder -1 übersetzt, je nachdem, ob sie positiv oder negativ sind. In diesem Fall
my mother
bedeutet dies 1. Adjektive (positiv oder negativ) multiplizieren ihr Substantiv mit 2.Das ist eine Frage;
my mother
Darin fragt Julia, ob (AKA 1) "lustiger" ist als Romeo. Vergleichswerte übersetzen entweder nachless than
(wenn sie negativ sind, wieworse
) odergreater than
(wenn sie positiv sind, wiejollier
) übersetzt. Daher läuft diese Frage aufIs 1 greater than you?
.Der Grund, warum wir diese Frage stellen, besteht darin, das Ende der Eingabe zu erkennen. Da der Wert von
EOF
von Plattform zu Plattform unterschiedlich ist, normalerweise aber unter 1 liegt, wird er von uns zur Erkennung verwendet.Wird die vorhergehende Frage zu ausgewertet
true
, springen wir zu Szene IV, was einfach das Ende des Programms ist. Kurz gesagt, wenn wir eine EOF feststellen, beenden wir das Programm.Es ist jetzt Romeos Linie: "Ich" und "Du" beziehen sich auf Romeo bzw. Julia.
Diese Anweisung setzt den Ordnungswert eines einzelnen Zeichens aus STDIN in Juliet. Dies ist in diesem Fall die Lauflänge des in gespeicherten Zeichens
Romeo
.Dies ist zu lang, um es im Detail zu besprechen, aber vertraue mir einfach, dass es übersetzt wird
Juliet -= 48
. Wir tun dies, weil Juliet den ASCII-Wert einer Ziffer enthält, undord('0') == 48
; Beim Subtrahieren von 48 übersetzen wir den ASCII-Wert einer Zahl in die Zahl selbst.Eine weitere Szenendeklaration. Dieser ist für die Schleife, in der wir wiederholt den Zeichenwert von
Romeo
,Juliet
times .Diese Aussage veranlasst Romeo, seinen Wert als Zeichen auszudrucken. Das heißt, der zuvor in Romeo gespeicherte Zeichenwert wird jetzt ausgegeben.
Ein Schwein ist ein negatives Substantiv
a hog
. daher wird diese Aussage zu ausgewertetJuliet -= 1
.Romeo fragt hier, ob Juliet "so faul wie" oder gleich 0 ist.
Wenn Julias Wert 0 ist, kehren wir zu Szene II zurück, um die Lauflänge eines anderen Charakters zu dekodieren.
Ansonsten kehren wir zu Szene III zurück, um Romeos Charakter erneut auszugeben.
Diese endgültige Szenendeklaration ist nur eine Markierung für das Ende des Programms. Die
[Exeunt]
Regieanweisung ist erforderlich, damit der Compiler die endgültige Szene generiert.quelle
GolfScript, 10 Zeichen
quelle
Perl, 27 Zeichen
quelle
print<>=~s/(.)(.)/$1x$2/ger
. Ich bin mir auch ziemlich sicher$1x$2
, dass Sie das gemeint haben und nicht umgekehrt./r
ist in Perlop dokumentiert und wurde in v5.14.0-p
Flagge benutzen, lassen Sie fallenprint
und die<>
Antwort wird einfach:s/(.)(.)/$1x$2/ge
-> 17 Zeichen +1 für-p
-> 18 .R 67
quelle
rep
dass dastimes
Argument automatisch von Zeichen in ganze Zahlen umgewandelt wird. Brillant.Python 3, 52
Mit Python 3 kann ich die Ansätze meiner beiden Python2-Lösungen zusammenführen.
quelle
raw_input
entspricht Python 3input
. Die erste Zeile muss bis zums=input()
s=input() while s:a,b,*s=s;print(a*int(b),end='')
APL (22)
Erläuterung:
T←⍞
: Eingabe speichern inT
T⊂⍨~⎕D∊⍨T
: Teilen SieT
die Zeichen auf, die keine Ziffern sind↑
:2
verwandle es in eineN/2
Matrix{⍺/⍨⍎⍵}/
: in jeder Zeile der Matrix (/
) repliziere (/
) das erste Zeichen (⍺
) mit dem eval (⍎
) des zweiten Zeichens (⍵
),/
: verketten die Ausgabe jeder Zeilequelle
Ruby, 30 Bytes
27 Bytes Code + 3 Bytes, um es mit dem
-p
Flag auszuführen :quelle
8086 Assembly,
10698 ZeichenWenn sich die Zahlen vor den Zeichen im Eingabestream befänden, könnten zwei Zeilen (18 Zeichen) davon entfernt werden.
quelle
dq 21cdc38821cd08b4 d888ed30c188482c e8ebfce210cd14b4
53 Zeichen? Ich sehe nicht, wo es nicht Großbuchstaben oder eof behandelt, obwohl ...GNU SED, 122 + 2 (-r)
Muss mit dem
-r
Flag ausgeführtwerden.
\v
Kann durch Ersetzen mit dem nicht druckbaren0x0B
und\a
mit auf 110 + 2 reduziert werden0x07
quelle
\2.{9}
ist eine tolle Idee) großartig!C 65 Zeichen
Ruft die Eingabe als Parameter ab.
quelle
error: first parameter of 'main' (argument count) must be of type 'int'
. Gibt es eine Befehlszeilenoption?Perl,
1918 ZeichenDie Regeln zum Zählen von Schaltern in der Befehlszeile finden Sie hier .
quelle
Viertens 45 Zeichen
Getestet mit pforth unter OS X.
quelle
Python,
6362 Zeichenquelle
iter
da ... Ich denke ich werde es selbst benutzen!Windows PowerShell, 55 Zeichen
Ich habe das Gefühl, dass man mehr Golf spielen kann, insbesondere mit den Casts von char bis string und int, aber ich habe nicht die Zeit, weiter daran zu arbeiten.
quelle
C, 68 Zeichen
Die Antwort von @ ugoren in C ist etwas kürzer, aber diese Antwort erfüllt die Anforderung, dass "die Zeichenfolge als Eingabe für stdin geliefert wird ".
quelle
main(c,n){ ... }
Diese werden beim Ausführen des Programms standardmäßig mit 1 übergeben.int
Argument ausnutzen , aber Compiler, die ich benutze, beschweren sich,error: second parameter of 'main' (argument array) must be of type 'char **'
damit ich nicht durchkommen kannmain(c,n)
. Ich muss verwendenmain(int c,char **n)
. Könnte eine Plattform oder eine GCC-Sache sein.n;main(c)
aber nichtmain(n,c)
- gut genug! :)Haskell,
5856 ZeichenMein erster wirklicher Versuch, etwas Golf zu spielen, also gibt es hier wahrscheinlich einige Verbesserungen.
quelle
read[y]
speichert zwei Zeichenreplicate x y
mit[1..x]>>[y]
. Somit kann Ihre zweite Zeile durch ersetzt werdenf(x:y:s)=(['1'..y]>>[x])++f s
, was sie auf 53 Bytes reduziert.Japt
-P
, 8 BytesEingabe als Array von Zeichen, Ausgabe als String.
Versuch es
quelle
ò crÏ°îX
wenn du es zu gruselig findest!Malbolge Unshackled (20-Trit-Rotationsvariante), 4.494e6 Bytes
Die Größe dieser Antwort überschreitet die maximale postbare Programmgröße (eh), sodass sich der Code in meinem GitHub-Repository befindet .
Wie führe ich das aus?
Dies könnte ein schwieriger Teil sein, da naive Haskell-Interpreter eine Ewigkeit brauchen, um dies auszuführen. TIO hat einen anständigen Malbogle Unshackled-Interpreter, aber leider kann ich ihn nicht verwenden (Einschränkungen).
Das beste, was ich finden konnte, ist die Variante mit fester Rotationsbreite von 20 Trit, die mit einer Dekomprimierung von 360 Bytes pro Stunde eine sehr gute Leistung erbringt .
Um den Dolmetscher ein bisschen schneller zu machen, habe ich alle Checks von Matthias Lutters Malbolge Unshackled-Dolmetscher entfernt.
Meine modifizierte Version kann ungefähr 6,3% schneller laufen.
Es funktioniert!
quelle
05AB1E ,
65 Bytes-1 Byte dank @Grimy .
Ausgabe als Liste von Zeichen.
Probieren Sie es online aus.
Alte 6- Byte- Antwort ohne integrierte Lauflängendecodierung:
Probieren Sie es online aus.
Erläuterung:
quelle
2ι`ÅΓ
ist 5 Bytes. Wäre traurig, wenn das integrierte RLE keine RLE-Herausforderung gewinnen würde.Python,
787266 charquelle
GolfScript (10 Zeichen)
quelle
J - 24
In diesem Beitrag geht es darum, das Infix-Adverb zu verwenden.
quelle
Befunge, 49 Zeichen
quelle
K, 35
quelle
,/{(. y)#x}.'0N 2#
für 18 Bytes .Python 2, 58
Dies ist inspiriert von Darren Stones Python-Lösung - Missbrauch von Iteratoren!
Dies ist meine ursprüngliche Lösung (60 Zeichen)
Ein anderer Ansatz ist 3 Zeichen länger:
quelle
Java: 285 Zeichen
quelle
Befunge-98, 22 Zeichen
quelle
Leerzeichen, 135
(Ersetzen Sie S, T, L durch Leerzeichen, Tabulatorzeichen und Zeilenvorschubzeichen.)
Probieren Sie es online [hier] .
Erläuterung:
quelle
Clojure (107)
Dies fühlt sich außergewöhnlich lang an, um Clojure zu sein. Wenn jemand es besser machen kann, poste es bitte.
quelle