Es gibt die klassische Lauflängencodierung und -decodierung.
input output
a3b2c5 aaabbccccc
Und das ist ziemlich einfach und schon mal gemacht.
Die Herausforderung besteht darin, auch ein nicht standardmäßiges Verhalten zu berücksichtigen, wenn mehrere Zeichen vor der Lauflänge stehen (eine einzelne Ziffer von 0 bis 9). Auf jedes Zeichen vor der Lauflängenziffer (die letzte Ziffer vor einer Nichtziffer oder dem Ende der Zeichenfolge) wird dieser Wert einzeln angewendet und der Reihe nach ausgedruckt.
Einige Testeingaben und -ausgaben, einschließlich einiger Randfälle:
input output
ab3c5 aaabbbccccc
a0b3 bbb
13b1 111b
a13b1 aaa111b
a123b1 aaa111222b
aa2a1b1 aaaaab
- Einer Zeichenfolge (
[a-zA-Z0-9]+
) muss die Lauflänge length ([0-9]
) folgen. - Es müssen nur gültige Eingaben berücksichtigt werden (
([a-zA-Z0-9]+[0-9])*
)- ja, leere Zeichenfolge ist gültige Eingabe.
- Die Eingabe erfolgt über die Standardeingabe, die Ausgabe über die Standardausgabe
Dies ist Code Golf, die Anzahl der Bytes bestimmt den Gewinner.
Antworten:
Pip, 22 + 1 = 23 Bytes
Verwendet
-r
Flagge. Beachten Sie, dass Sie dazu entweder 1) eine EOF nach der Eingabe eingeben müssen (Strg-D unter Linux, Strg-Z unter Windows) oder 2) die Eingabe von einer anderen Stelle einleiten müssen.Erläuterung:
Das Ergebnis des Kartenvorgangs ist eine Liste von Listen. Standardmäßig werden Listen jedoch beim Drucken einfach miteinander verkettet, sodass keine manuelle Konvertierung in eine Zeichenfolge erforderlich ist.
Beispiel mit Eingabe
a13b1
:Pip hat grundlegende Regex-Unterstützung ab ... vor 2 Tagen . Großartiges Timing!
quelle
-r
Flagge. (Die Frage gibt an, dass die Eingabe von STDIN stammen muss.)q
anstatta
ohne zusätzliche Flaggen, aber es scheint ein Fehler zu sein , und es ist für die Eingabe zu fragen zweimal.Perl / Bash
5440 + 1 = 41 BytesEs ist im Grunde ein Regex innerhalb eines Regex. Und ein bisschen Magie.
Erläuterung
Der äußere reguläre Ausdruck
/(\D*\d*)(\d)/g
extrahiert jede lauflängencodierte Gruppe. Wir erfassen die zu wiederholenden Dinge$1
und die Anzahl der Wiederholungen$2
. Jetzt ersetzen wir jede solche Gruppe durch die Erweiterung dieser Gruppe. Dazu werten wir den Code"\$1=~s/./\$&x$2/egr"
zwei Mal (wie von der/ee
Fahne auf der äußeren Substitution).Die erste Auswertung interpoliert nur die Anzahl der Wiederholungen in den String - die anderen Variablen sind durch einen Backslash geschützt. Wenn
a14
wir also die Eingabe annehmen , hätten wir jetzt den Code$1=~s/./$&x4/egr
, der erneut ausgewertet wird.Dies wird die Ersetzung auf den Inhalt von
$1
(das Zeug zu wiederholena1
) anwenden . Die Ersetzung entspricht jedem Zeichen.
. Die$&
Variable enthält die gesamte Übereinstimmung, die wirx4
mal wiederholen . Wir tun dies/g
lobal für jede Übereinstimmung und/r
drehen den ersetzten String um, anstatt die$1
Variable (die schreibgeschützt ist) zu ändern . Das Ergebnis der inneren Substitution ist alsoaaaa1111
.Das
-p
Flag wendet die Ersetzung auf jede Eingabezeile an und druckt das Ergebnis aus.quelle
-p
Modifikator hinzufügen . Ich zähle 45 Bytes. Außerdem solltest du\D
stattdessen verwenden können[a-z]
, wodurch auch die Notwendigkeit entfällti
.CJam,
33 3127 BytesUghh, das Fehlen regulärer Ausdrücke macht das ziemlich lang ...
Wie es funktioniert
Wir durchlaufen alle Zeichen der Eingabezeichenfolge und verfolgen in jeder Iteration das zuletzt gefundene Zeichen (beginnend mit dem ersten leeren Zeichen). Dann prüfen wir, ob das aktuelle Zeichen nicht numerisch ist und das letzte Zeichen numerisch ist. Wenn ja, wiederholen wir jedes vorherige Zeichen (das noch nicht wiederholt wurde), die Anzahl mal.
(Ein bisschen veraltete Code-Erweiterung)
Probieren Sie es hier online aus
quelle
rs ,
4371 ZeichenNun, das drehte sich schnell. Dumme Zahlen ...
Probieren Sie es hier aus!
Originalversion (funktionierte nicht mit Eingaben wie
123
):Erläuterung
Die erste Zeile stellt Räume zwischen den Läufen mit Zahlen, zB Drehen
a313
ina3 13
.Die zweite Zeile erweitert kontinuierlich die komprimierten Kodierungen wie
aa5
zua5a5
.Die dritte Zeile konvertiert jede Instanz von
a5
inaaaaa
den Wiederholungsoperator .Die letzte Zeile entfernt die Leerzeichen.
quelle
a123b1
?Javascript ( ES6 ),
8683 BytesKommentiert:
quelle
alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(c+1).join(b)))
du nicht das Gleiche tun? Es ist nur 71 Byte lang.Array(6).join('12')
und es wird zurückkehren'1212121212'
.alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(-~c).join(b)))
(gleiche 71 Bytes lang, getestet auf es6fiddle.net/ia7gocwg )CJam,
2725 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Pyth,
333228 BytesProbieren Sie es online aus: Vorführ- oder Testgeschirr
Erläuterung
Ich erkläre den Code anhand der Beispieleingabe
aa1a23b2
. Hoffentlich ist dies ein bisschen einfacher zu befolgen als ohne.quelle
Rubin 73
Tests: http://ideone.com/L1fssb
quelle
JavaScript 112
quelle
Python 2.7, 98 Bytes
Dies führt lediglich eine einfache reguläre Suche nach Ziffern durch, auf die keine Ziffer folgt, und führt dann die Zeichenfolgenarithmetik für jede Gruppe durch und führt sie alle wieder zusammen.
quelle
raw_input
wirdinput
jedochprint
zu Klammern.Julia,
105999587 BytesDadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge als Eingabe annimmt und eine Zeichenfolge zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=s->...
.Hier werden zwei ineinander verschachtelte Array-Auffassungen verwendet. Das äußere Verständnis wirkt sich auf jede Übereinstimmung der Eingabezeichenfolge mit dem regulären Ausdruck aus
\D*\d*\d
. Das innere Verständnis wiederholt jedes Zeichen der Übereinstimmung entsprechend der nachfolgenden Ziffer. Die Elemente des inneren Arrays sind zu einer Zeichenfolge verbunden, sodass das äußere Array ein Array von Zeichenfolgen ist. Diese werden zusammengefügt und zurückgegeben.In Julia können Zeichenfolgen wie Zeichenfelder behandelt werden. Beachten Sie jedoch, dass für die
Char
undString
-Typen in Julia nicht dieselben Methoden definiert sind. Insbesondere gibt es keine Methode zur Wiederholung von^
for-Zeichen. Hierfür wird eine verschlungene Problemumgehung verwendet:chop()
.string()
.int('4')
nicht 4 zurückgegeben wird. Stattdessen wird der Codepunkt zurückgegeben, der in diesem Fall 52 ist. Somit können wir 48 subtrahieren, um die tatsächliche Ganzzahl zurückzuerhalten.string(b)
nachint(p[end]) - 48
.Beispiele:
quelle
Python 3,
148144136135 BytesDanke an Pietu1998 und mbomb007 für die Vorschläge.
Python 2,
161151147139138 BytesVielleicht war der heutige Tag nur ein langer Arbeitstag, aber ich kann für mein ganzes Leben nicht herausfinden, wie ich Golf spielen kann.
quelle
raw_
out, parenthes toprint
).len(d)>0
kann durch ersetzt werden,d
da eine leere Liste falsch und eine nicht leere Liste wahr ist.list(...)
kann direkt zum gehenfor
. Die eckigen Klammernw([...])
sind nicht erforderlich, da dies das einzige Argument ist. Sie können das Leerzeichen in entfernen) for
. Das sind alles Kleinigkeiten, die mir bisher eingefallen sind.list()
da Zeichenfolgen iterabel sind. Sie können verwendenw=r=''
. Wenn Sie bereit sind, es zu ändern, sehen Sie sich meine Lösung an. :)if c.isdigit()
kann werdenif'/'<c<':'
, wenn ich mich nicht irre.Java 7, 175 Bytes
Die Herausforderung ist schwieriger als es aussieht, imo ..
Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle