W tym wyzwaniu Twoim zadaniem jest rozszyfrowanie łańcucha. Na szczęście algorytm jest dość prosty: czytając od lewej do prawej, każda napotkana cyfra N (od 0 do 9) musi zostać zastąpiona znakiem, który przed nią ma pozycje N + 1 .
Przykład
Łańcuch wejściowy "Prog2am0in6"
zostałby zdekodowany w ten sposób:
Dlatego oczekiwany wynik to "Programming"
.
Wyjaśnienia i zasady
- Łańcuch wejściowy będzie zawierał wyłącznie znaki ASCII w zakresie od 32 do 126. Możesz założyć, że nigdy nie będzie pusty.
- Oryginalny rozszyfrowany ciąg znaków nie może zawierać żadnej cyfry.
- Po zdekodowaniu znaku może on z kolei być oznaczony kolejną cyfrą. Na przykład
"alp2c1"
powinien zostać zdekodowany jako"alpaca"
. - Odnośniki nigdy nie będą owijać się wokół łańcucha: można odwoływać się tylko do poprzednich znaków.
- Możesz napisać pełny program lub funkcję, która wydrukuje lub wyświetli wynik.
- To jest kod golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
- Standardowe luki są zabronione.
Przypadki testowe
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
byłby prawidłowy wkład (z oczekiwanym wynikiemabbab
)? Innymi słowy, czy referencje mogą owijać się wokół łańcucha?1bbab
nie jest poprawny. Dodałem wyjaśnienie na ten temat.Odpowiedzi:
Galaretka ,
97 bajtówWypróbuj online!
Jak to działa
źródło
Java 7,
8180 bajtówWypróbuj online!
Zaoszczędzono 1 bajt dzięki Andersowi Tornbladowi . Pierwszy znak nie może być cyfrą, więc nie trzeba go sprawdzać, co oznacza, że możemy zwiększyć wartość przed sprawdzeniem naszego warunku zakończenia.
źródło
for(int i=0;++i<a.length;){
zamiast tego oszczędzać jeden znak.Haskell, 55 bajtów
Przykład użycia:
reverse.foldl(#)[] $ "Prog2am0in6 Puz0les7&1Cod74G4lf"
->"Programming Puzzles & Code Golf"
. Wypróbuj online!Zredukuj ciąg znaków do jego odwrotnej kopii, zastępując liczby odpowiednimi znakami. „rewers”, ponieważ w ten sposób mamy do tej pory łatwy dostęp do ciągu podczas indeksowania liczb. Odwróć to jeszcze raz.
źródło
C, 46 bajtów
Wypróbuj online!
C,
524948 bajtówDzięki @ l4m2 za uratowanie bajtu!
Edytuje bezpośrednio łańcuch wejściowy.
Wypróbuj online!
Alternatywna 50-bajtowa wersja:
Wersja rekurencyjna, 48 bajtów:
źródło
05AB1E , 11 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6),
5953 bajtówZaoszczędzono 7 bajtów dzięki fəˈnɛtɪk.
źródło
o-m-1
można zastąpićo+~m
.f=
część, więc jest to 54 bajty, a nie 52.Siatkówka , 37 bajtów
Liczba bajtów zakłada kodowanie ISO 8859-1.
Wypróbuj online!
Wyjaśnienie
Zastąpić każdą cyfrę d o d
«
s, a następnie przez jeden»
. Potrzebujemy tych ostatnich a), aby móc rozpoznać pozycje, w których d = 0 ib) jako separator między sąsiednimi cyframi.Wielokrotnie (
+
) dopasuj wyrażenie regularne w pierwszym wierszu od prawej do lewej (r
), a następnie zamień dopasowanie najbardziej lewe (1
) z podstawieniem w drugim wierszu.Wyrażenie regularne dopasowuje jedną z naszych obecnie jednoargumentowych cyfr i liczy liczbę
«
s w grupie 2. Lookbehind następnie dopasowuje znaki d(?<-2>.)*
przed przechwyceniem przywoływanego znaku w grupie 1. Ciąg«
s, a»
następnie zastępowany jest znakiem przechwyconym .źródło
MATL ,
21191716 bajtówWypróbuj w MATL Online!
Wyjaśnienie
źródło
$y
w nowej wersji!U
działało tylko dla cyfr. Niestety'e'U
dajeexp(1)
inaczej mógłbym pozbyć się4Y2
rzeczyJavaScript (ES6), 51 bajtów
a
służy do przechowywania zastąpionych cyfr w celu radzenia sobie z cyframi odnoszącymi się do innych cyfr.źródło
Perl 5 , 34 bajtów
33 bajty kodu +
-p
flaga.Wypróbuj online!
s/\d/.../e
zamień pierwszą cyfrę...
zgodnie z kodem Perla. (przy...
czymsubstr$_,-$&-1+pos,1
w tym przypadku.substr$_,-$&-1+pos,1
zwraca podciąg$_
długości1
w indeksie-$&-1+pos
, gdzie$&
jest numer tylko dopasowane, apos
jest indeksem początku meczu. Musimy tylkoredo
jeśli zastąpi się powiodła, aby zastąpić każdą cyfrę. (a wynik jest domyślnie wydrukowany dzięki-p
fladze).Stare podejście, 47 bajtów:
44 bajty kodu +
-F
flaga.Wypróbuj online!
Właściwie całkiem prosto.
-F
Flaga dzieli dane wejściowe każdego znaku na@F
.map{...}@F
iteruje przez@F
(tj. każdy znak wejścia). Jeśli znak jest cyfrą (/\d/
), wówczas zastępujemy go znakiem w indeksie$i-$_-1
. Jest$i
to bieżąca zmienna indeksu (którą zachowujemy, zwiększając każdy widziany znak).źródło
JavaScript ES6,
6159 bajtówDzięki @Luke za grę w golfa z 8 bajtów
Wypróbuj online!
źródło
x.split``
może też być[...x]
,[0-9]
może być\d
, razem oszczędzając 6Bx=>[...x].map((p,i,a)=>+p+1?a[i-1-p]:p).join``
dla 46 bajtówx=>[...x].map((p,i,a)=>a[i]=1+p>9?a[i-1-p]:p).join``
05AB1E ,
2717 bajtówWypróbuj online!
źródło
CJam, 13 bajtów
Demo online.
To rozwiązanie wykorzystuje wbudowany w CJam operator „kopiuj n- ty element na stosie”
$
do implementacji dekodowania. Zaczyna się od odczytu danych wejściowych (za pomocąq
), a następnie zapętlenia znaków z ciągu wejściowego i zrzucenia ich na stos (za pomocą{}/
). Jednak wewnątrz korpusu pętli kopiuje również każdy znak po umieszczeniu go na stosie (z_
) i sprawdza, czy jest to cyfra, patrząc na jego pozycję za#
pomocą ciągu"0123456789"
, dogodnie reprezentowanego jakoA,s
.Wynikiem tego wyszukiwania jest albo wartość liczbowa cyfry, albo, jeśli znak nie jest cyfrą, -1. Następnie
)
operator zwiększa tę wartość o jeden i$
zastępuje ją znakiem prądu w wielu pozycjach poniżej górnej części stosu. Wreszcie,\;
po prostu usuwa_
ze stosu kopię bieżącego znaku wejściowego , ponieważ nie jest już potrzebny.źródło
Befunge-98 ,
4543 bajtówWypróbuj online!
Pomysł:
Nie byłem w stanie skrócić tej wersji, ale ta ma 44 bajty:
Pomyślałem, że podzielę się tym ze względu na zgrabną sztuczkę
s
- ale przechowywanie licznika na stosie prowadzi do poprawy o 1 znakźródło
Python 2 , 59 bajtów
Wypróbuj online!
źródło
Python 2,
7571 bajtówWypróbuj online!
Edycja: Naprawiono dla wartości ascii między 32-47 ; Naprawiono podwójne dekodowanie (np. „Alp2c1” do „alpaca”)
źródło
'Prog2am0in6 Puz0les7&1Cod74G4lf'
twojego programu drukujeProgramming Puzzles &7Code1Golf
! Próbowałem z obu linków TIO udostępnionych!PHP 7,1
6759 bajtówPobiera dane wejściowe z STDIN; uruchom jako potok z
-nR
lub spróbuj online ._&$c=$s[$i++]
zapętlić ciąg (_&$c
spowoduje coś, co nie jest"0"
; więc jedynym znakiem, który może przerwać pętlę, jest pusty ciąg = koniec wejścia)$c^"0"
przełączaj bity 5 i 6 w kodzie ascii<"\n"
sprawdź, czy wynik to <chr (10)Dzięki @Christoph za oszczędność 12%
źródło
$s=$argn
...?)for(;_&$c=$argn[$i++];)$t.=($c^"0")<"\n"?$t[~+$c]:$c;echo$t;
Makro / klawisze Vima, 49 bajtów
^M
reprezentują znak powrotu (0x0A, 1 bajt).Wyjaśnienie
źródło
APL (Dyalog Classic) ,
2523 bajtów-2 bajty dzięki @FrownyFrog
Wypróbuj online!
wykorzystuje
⎕io←1
(
⍵
poniżej oznacza wartość pośrednią w ocenie)⎕d
jest ciąg'0123456789'
⎕d⍳⍵
znajduje (w tym przypadku w oparciu o 1) indeksy⍵
znaków⎕d
; dla wartości niezerowych indeks wynosi 1111|⍵
jest modulo - 11 to 0≢⍵
jest długością⍵
⍳≢⍵
jest1 2 ...
do≢⍵
więc
(⍳≢⍵)-11|⎕d⍳⍵
daje nam wektor i indeksów, w których powinniśmy szukać, aby uzyskać wynikowe znaki; jednak niektóre z tych indeksów mogą przekierowywać na jeszcze inne (mniejsze) indeksy. Aby obliczyć zamknięcie przechodnie (tj. Indeksy efektywne), indeksujemy wektor do siebie (⊂⌷⊢
pociąg równoważny(⊂i)⌷i
lubi[i]
) i powtarzamy go, aż się ustabilizuje (⍣≡
jest znany jako operator punktu stałego ).na koniec indeksujemy do oryginalnego ciągu:
(...)⊃¨⊂
źródło
Python 2 ,
8380 bajtówWypróbuj online!
źródło
Japt , 24 bajty
Wypróbuj online!
Wyjaśnienie:
źródło
Rubin,
5646 bajtówWypróbuj online!
źródło
Python 2 , 58 bajtów
Jest to w zasadzie port mojej odpowiedzi Jelly, a także cyfry z odpowiedzi Python @ xnor.
Wypróbuj online!
źródło
Röda , 51 bajtów
Wypróbuj online!
źródło
JavaScript ES6, 54 bajty
źródło
f=
.> <> (Ryba), 108 bajtów (= siatka 9 x 12)
Spróbuj tutaj, aby zobaczyć pływające ryby.
źródło
Kod maszynowy 8086, 35 bajtów
źródło
ok, 39 bajtów
Wypróbuj online!
źródło
Japt v2.0a0, 16 bajtów
Spróbuj
Wyjaśnienie
źródło
J , 20 bajtów
Wypróbuj online
Podziękowania dla ngn za inspirację.
22 bajty
To jest port odpowiedzi Jelly.
W obu rozwiązaniach wersja używana przez TIO interpretuje pojedynczy
.
jako liczbę 0, więc ostatni test kończy się niepowodzeniem. Starsze wersje (≤7) wydają się działać poprawnie.Wypróbuj online!
źródło