In dieser Herausforderung besteht Ihre Aufgabe darin, eine Zeichenfolge zu entschlüsseln. Glücklicherweise ist der Algorithmus ziemlich einfach: Beim Lesen von links nach rechts muss jede gefundene Ziffer N (0 bis 9) durch das Zeichen ersetzt werden, das N + 1 Stellen davor ist.
Beispiel
Die Eingabezeichenfolge "Prog2am0in6"
würde folgendermaßen dekodiert:
Daher ist die erwartete Ausgabe "Programming"
.
Erläuterungen und Regeln
- Die Eingabezeichenfolge enthält ausschließlich ASCII-Zeichen im Bereich von 32 bis 126. Sie können davon ausgehen, dass es niemals leer sein wird.
- Die ursprünglich entschlüsselte Zeichenfolge enthält garantiert keine Ziffer.
- Sobald ein Zeichen dekodiert wurde, kann es wiederum durch eine nachfolgende Ziffer referenziert werden. Zum Beispiel
"alp2c1"
sollte als dekodiert werden"alpaca"
. - Referenzen werden niemals um die Zeichenfolge gewickelt: Es kann nur auf vorherige Zeichen verwiesen werden.
- Sie können entweder ein vollständiges Programm oder eine Funktion schreiben, die das Ergebnis entweder druckt oder ausgibt.
- Dies ist Codegolf, daher gewinnt die kürzeste Antwort in Bytes.
- Standardlücken sind verboten.
Testfälle
Input : abcd
Output: abcd
Input : a000
Output: aaaa
Input : ban111
Output: banana
Input : Hel0o W2r5d!
Output: Hello World!
Input : this 222a19e52
Output: this is a test
Input : golfin5 3s24o0d4f3r3y3u
Output: golfing is good for you
Input : Prog2am0in6 Puz0les7&1Cod74G4lf
Output: Programming Puzzles & Code Golf
Input : Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.
Output: Replicants are like any other machine. They're either a benefit or a hazard.
1bbab
eine gültige Eingabe (mit erwarteter Ausgabe vonabbab
)? Mit anderen Worten, können die Referenzen die Zeichenfolge umbrechen?1bbab
ist nicht gültig. Ich habe eine Klarstellung hinzugefügt.Antworten:
Gelee ,
97 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Java 7,
8180 BytesProbieren Sie es online!
Dank Anders Tornblad 1 Byte gespeichert . Das erste Zeichen kann keine Ziffer sein, daher muss es nicht überprüft werden, damit wir es vor dem Überprüfen unserer Beendigungsbedingung vorab inkrementieren können.
quelle
for(int i=0;++i<a.length;){
stattdessen ein Zeichen speichern.Haskell, 55 Bytes
Anwendungsbeispiel:
reverse.foldl(#)[] $ "Prog2am0in6 Puz0les7&1Cod74G4lf"
->"Programming Puzzles & Code Golf"
. Probieren Sie es online!Reduzieren Sie die Zeichenfolge zu einer umgekehrten Kopie von sich selbst, wobei die Zahlen durch die entsprechenden Zeichen ersetzt werden. "umkehren", weil wir auf diese Weise beim Indizieren der Zahlen einen einfachen Zugriff auf den bisherigen String haben. Mach es wieder rückgängig.
quelle
C 46 Bytes
Probieren Sie es online!
C
524948 BytesVielen Dank an @ l4m2 für das Speichern eines Bytes!
Bearbeitet die Eingabezeichenfolge direkt.
Probieren Sie es online!
Alternative 50-Byte-Version:
Rekursive Version, 48 Bytes:
quelle
05AB1E , 11 Bytes
Probieren Sie es online!
Erläuterung
quelle
JavaScript (ES6),
5953 Byte7 Bytes dank fɛnəˈtɛk eingespart.
quelle
o-m-1
kann durch ersetzt werdeno+~m
.f=
Teil enthalten. Dies sind also 54 Byte und nicht 52.Retina , 37 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
Erläuterung
Ersetzen Sie jede Ziffer d durch d
«
s, gefolgt von einer»
. Letzteres benötigen wir, um a) Positionen mit d = 0 und b) als Trennzeichen zwischen benachbarten Ziffern erkennen zu können.Passen Sie
+
die Regex in der ersten Zeile wiederholt ( ) von rechts nach links an (r
) und ersetzen Sie dann die am weitesten links stehende Übereinstimmung (1
) durch die Ersetzung in der zweiten Zeile.Der reguläre Ausdruck selbst stimmt mit einer unserer jetzt unären Ziffern überein und zählt die Anzahl von
«
s in Gruppe 2. Der Lookbehind vergleicht dann d Zeichen mit,(?<-2>.)*
bevor er das betreffende Zeichen in Gruppe 1 erfasst. Die Zeichenfolge von«
s und»
wird dann durch das erfasste Zeichen ersetzt .quelle
MATL ,
21191716 BytesProbieren Sie es bei MATL Online!
Erläuterung
quelle
$y
in der neuen Version!U
nur für Ziffern gearbeitet hätte. Leider'e'U
ergibt sichexp(1)
sonst hätte ich das4Y2
Zeug loswerden könnenJavaScript (ES6), 51 Byte
a
wird zum Speichern der ersetzten Ziffern verwendet, um mit Ziffern umzugehen, die sich auf andere Ziffern beziehen.quelle
Perl 5 , 34 Bytes
33 Byte Code +
-p
Flag.Probieren Sie es online!
s/\d/.../e
Ersetzen Sie die erste Ziffer durch den...
als Perl-Code ausgewerteten. (mit...
wobeisubstr$_,-$&-1+pos,1
in diesem Fall.substr$_,-$&-1+pos,1
gibt die Teilkette von$_
der Länge1
bei Index-$&-1+pos
, in dem$&
die Zahl ist nur angepasst, undpos
ist der Index des Beginns des Spiels. Wir müssen nur ,redo
wenn der Ersatz erfolgreich war , um jede Stelle zu ersetzen. (und das Ergebnis wird dank-p
flag implizit gedruckt ).Alter Ansatz, 47 Bytes:
44 Byte Code +
-F
Flag.Probieren Sie es online!
Eigentlich ganz einfach.
-F
flag teilt die Eingaben für jedes Zeichen in@F
.map{...}@F
iteriert durch@F
(dh jedes Zeichen der Eingabe). Wenn das Zeichen eine Ziffer (/\d/
) ist, ersetzen wir es durch das Zeichen am Index$i-$_-1
. Dies$i
ist die aktuelle Indexvariable (die wir pflegen, indem wir sie bei jedem angezeigten Zeichen erhöhen).quelle
JavaScript ES6,
6159 BytesVielen Dank an @Luke für das Golfen mit 8 Bytes
Probieren Sie es online!
quelle
x.split``
könnte auch sein[...x]
,[0-9]
könnte\d
zusammen sein und 6B rettenx=>[...x].map((p,i,a)=>+p+1?a[i-1-p]:p).join``
für 46 Bytesx=>[...x].map((p,i,a)=>a[i]=1+p>9?a[i-1-p]:p).join``
05AB1E ,
2717 BytesProbieren Sie es online!
quelle
CJam, 13 Bytes
Online-Demo.
Diese Lösung verwendet den in CJam integrierten Operator "copy n- th item on the stack"
$
, um die Decodierung zu implementieren. Es beginnt damit, die Eingabe (mitq
) zu lesen und dann die Zeichen aus der Eingabezeichenfolge in einer Schleife auf dem Stapel (mit{}/
) abzulegen . Innerhalb des Schleifenkörpers dupliziert es jedoch auch jedes Zeichen, nachdem es auf den Stapel (mit_
) gelegt wurde, und prüft, ob es sich um eine Ziffer handelt, indem es seine Position#
in der Zeichenfolge nachschaut"0123456789"
, die zweckmäßigerweise als dargestellt wirdA,s
.Das Ergebnis dieser Suche ist entweder der numerische Wert der Ziffer oder, falls das Zeichen keine Ziffer ist, -1. Der
)
Operator erhöht diesen Wert dann um eins und$
ersetzt ihn durch den aktuellen Zeichenwert an so vielen Stellen unter dem oberen Rand des Stapels. Zum Schluss wird\;
nur die Kopie des aktuellen Eingabezeichens_
vom Stapel entfernt, da es nicht mehr benötigt wird.quelle
Befunge-98 ,
4543 BytesProbieren Sie es online!
Die Idee:
Ich konnte diese Version nicht kürzer bekommen, aber diese ist 44 Bytes:
Ich dachte, ich teile es wegen des netten Tricks mit
s
- aber das Speichern des Zählers auf dem Stapel führt zu dieser 1-Zeichen-Verbesserungquelle
Python 2 , 59 Bytes
Probieren Sie es online!
quelle
Python 2,
7571 BytesProbieren Sie es online!
Bearbeiten: Korrigiert für ASCII-Werte zwischen 32 und 47 ; Behoben für Doppeldecodierung (zB "alp2c1" bis "alpaca")
quelle
'Prog2am0in6 Puz0les7&1Cod74G4lf'
Ihre ProgrammabzügeProgramming Puzzles &7Code1Golf
! Ich habe versucht, mit beiden TIO-Links zu teilen!PHP 7.1
6759 BytesÜbernimmt die Eingabe von STDIN; Laufen Sie als Pipe mit
-nR
oder probieren Sie es online aus ._&$c=$s[$i++]
Durchschleifen eines Strings (_&$c
führt zu etwas, was nicht"0"
der Fall ist; das einzige Zeichen, das die Schleife unterbrechen kann, ist der leere String = Ende der Eingabe)$c^"0"
Schalten Sie die Bits 5 und 6 im ASCII-Code um<"\n"
überprüfe ob das Ergebnis <chr (10) istDanke @Christoph für das Sparen von 12%
quelle
$s=$argn
...?)for(;_&$c=$argn[$i++];)$t.=($c^"0")<"\n"?$t[~+$c]:$c;echo$t;
Vim Makro / Tastenanschläge, 49 Bytes
^M
Stellen Sie das Rückgabezeichen dar (0x0A, 1 Byte).Erläuterung
quelle
APL (Dyalog Classic) ,
2523 Bytes-2 Bytes dank @FrownyFrog
Probieren Sie es online!
Verwendet
⎕io←1
(
⍵
unten steht für einen Zwischenwert in der Bewertung)⎕d
ist die Zeichenfolge'0123456789'
⎕d⍳⍵
findet die (in diesem Fall auf 1 basierenden) Indizes der⍵
Zeichen in⎕d
; für eine Nicht-Ziffer ist der Index 1111|⍵
ist modulo - die 11er werden zu 0er≢⍵
ist die Länge von⍵
⍳≢⍵
ist1 2 ...
bis≢⍵
so,
(⍳≢⍵)-11|⎕d⍳⍵
gibt uns einen Vektor i der Indizes , wo wir die sich ergebenden Zeichen zu bekommen aussehen sollte; Einige dieser Indizes können jedoch auf andere (kleinere) Indizes umgeleitet werden. Um den transitiven Abschluss (dh die effektiven Indizes) zu berechnen, indizieren wir den Vektor in sich selbst (⊂⌷⊢
einen Zug, der(⊂i)⌷i
oder entsprichti[i]
) und wiederholen diesen Vorgang, bis er sich stabilisiert (⍣≡
wird als Festkommaoperator bezeichnet ).Zum Schluss indexieren wir die ursprüngliche Zeichenfolge:
(...)⊃¨⊂
quelle
Python 2 ,
8380 BytesProbieren Sie es online!
quelle
Japt , 24 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Ruby,
5646 BytesProbieren Sie es online!
quelle
Python 2 , 58 Bytes
Dies ist im Wesentlichen ein Port meiner Jelly-Antwort sowie die Ziffernüberprüfung aus der Python-Antwort von @ xnor.
Probieren Sie es online!
quelle
Röda , 51 Bytes
Probieren Sie es online!
quelle
JavaScript ES6, 54 Byte
quelle
f=
.> <> (Fisch), 108 Bytes (= 9 x 12 Raster)
Versuchen Sie es hier , um die Fische herumschwimmen zu sehen.
quelle
8086 Maschinencode, 35 Bytes
quelle
ok, 39 bytes
Probieren Sie es online!
quelle
Japt v2.0a0, 16 Bytes
Versuch es
Erläuterung
quelle
J , 20 Bytes
Probieren Sie es online aus
Dank für die Inspiration.
22 Bytes
Dies ist ein Port der Jelly-Antwort.
In beiden Lösungen interpretiert die von TIO verwendete Version eine einzelne
.
als die Zahl 0, sodass der letzte Test fehlschlägt. Ältere Versionen (≤7) scheinen korrekt zu funktionieren.Probieren Sie es online!
quelle