To jest odwrotność Let's do some „deciph4r4ng”
W tym wyzwaniu Twoim zadaniem jest zaszyfrowanie łańcucha. Na szczęście algorytm jest dość prosty: odczytywanie od lewej do prawej, każdy typowy znak pisania (zakres ASCII 32-126) musi być zastąpiony liczbą N (0-9), aby wskazać, że jest taki sam jak znak N + 1 pozycje przed nim. Wyjątkiem jest sytuacja, gdy znak nie pojawia się na poprzednich 10 pozycjach w oryginalnym ciągu. W takim przypadku powinieneś po prostu wydrukować znak ponownie. Skutecznie powinieneś być w stanie odwrócić operację od pierwotnego wyzwania.
Przykład
Łańcuch wejściowy "Programming"
zostałby zakodowany w następujący sposób:
Dlatego oczekiwany wynik to "Prog2am0in6"
.
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 ciąg nie może zawierać żadnej cyfry.
- Po zakodowaniu znaku można do niego odwoływać się kolejna cyfra. Na przykład
"alpaca"
należy zakodować jako"alp2c1"
. - 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 : aaaa
Output: a000
Input : banana
Output: ban111
Input : Hello World!
Output: Hel0o W2r5d!
Input : this is a test
Output: this 222a19e52
Input : golfing is good for you
Output: golfin5 3s24o0d4f3r3y3u
Input : Programming Puzzles & Code Golf
Output: Prog2am0in6 Puz0les7&1Cod74G4lf
Input : Replicants are like any other machine. They're either a benefit or a hazard.
Output: Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.
Odpowiedzi:
05AB1E ,
20 1918 bajtów-2 Dzięki Emigna
Wypróbuj online!
źródło
)¹vDyåiDykëy}?y¸ìT£
działa.õIvDyåiDykëy}?yìT£
18)Siatkówka ,
2423 bajtyWypróbuj online!
Dość prosta podstawienie wyrażenia regularnego. Dopasowujemy każdy znak i staramy się znaleźć jego kopię 0-9 znaków przed nim. Jeśli go znajdziemy, zastępujemy go liczbą znaków, które musieliśmy dopasować, aby dostać się do kopii.
Wyniki nie do końca pasują do przypadków testowych, ponieważ ta używa największej możliwej cyfry zamiast najmniejszej możliwej.
źródło
JavaScript (ES6),
745754 bajtówOszczędność 3 bajtów dzięki produktom ETH z genialnym
p=/./g
zamiastp={}
(zainspirowany Neilem)Przypadki testowe
Pokaż fragment kodu
źródło
s
zamiast niegop
?find
wersję przy użyciulastIndexOf
, co jest nieco zaskakujące, zważywszy, że jest 11 liter długo ....)s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-10?~i:c)
aby zaoszczędzić 3 bajty.Haskell ,
7266 bajtówDzięki Laikoni za grę w golfa 6 bajtów!
Wypróbuj online!
Funkcja
%
utrzymuje częściowo przetworzony ciąg w odwrotnej kolejności w drugim argumencie, dzięki czemu jest w stanie przeszukać pierwsze 10 elementów tego ciągu w poszukiwaniu wystąpień badanego znaku. Przesłanie składa się z nienazwanej funkcji,(%"")
która wywołuje poprzednią funkcję z pustym łańcuchem jako drugim argumentem.źródło
f(a:s)=f s++(last$[a]:[show n|(n,b)<-zip[0..9]s,b==a])
oszczędza dwa bajty.f(a:s)=f s++[last$a:[n|(n,b)<-zip['0'..'9']s,b==a]]
oszczędza jeszcze więcej.reverse
oszczędza jeszcze jeden bajt: Wypróbuj online!Python 2 , 64 bajty
Wypróbuj online!
źródło
~10
po prostu nie mogę użyć-11
?Perl 5 , 36 bajtów
35 bajtów kodu +
-p
flaga.Wypróbuj online!
Kilka wyjaśnień:
Celem jest zastąpienie znaku niecałkowitego (
\D
ale odpowiada odsyłaczowi wstecznemu\1
w moim wyrażeniu regularnym), który poprzedza mniej niż 10 znaków (.{0,9}
) i ten sam znak ((\D)
...\1
) długością.{0,9}
grupy (length$2
). Iredo
podczas gdy postacie zostaną zastąpione.źródło
.*
nie jest wymagany, każdy poprawny znak w zakresie zanim zastąpiona cyfra będzie w porządku.Python 2,
8984 bajtówWypróbuj online!
Iteruje przez ciąg w odwrotnej kolejności i buduje nowy ciąg z poprawnymi liczbami.
źródło
Japt , 18 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript,
10080 bajtówWypróbuj online!
źródło
05AB1E , 20 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 3,
125118 bajtówWypróbuj online!
źródło
C (tcc) , 113 bajtów
Ponieważ funkcja tworzy kopię łańcucha wejściowego, maksymalny rozmiar danych wejściowych wynosi 98 znaków (więcej niż wystarcza, aby zmieścić najdłuższy testowy tekst). Oczywiście można to zmienić na dowolną inną wartość.
Wypróbuj online!
Edytować
-15 bajtów. Dzięki Johan du Toit .
źródło
i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j,j=-1;}
Java 7,
102101 bajtówWypróbuj online!
-1 bajt dzięki Kevin Cruijssen . Zawsze lubię pretekst do korzystania z operatora.
źródło
--c>=0
? Możesz go zastąpić,c-->0
aby zapisać bajt.MATL,
3130 bajtówWypróbuj w MATL Online!
Wyjaśnienie
źródło
this is a test
dająthis 222a1te52
zamiastthis 222a19e52
. Drugit
nie jest konwertowany na9
.PHP, 104 bajtów
przyszłe rozwiązanie
Rozwiązania wsteczne
Wersje online
PHP, 111 bajtów
PHP, 112 bajtów
Wersja online
źródło
REXX,
124125 bajtówźródło
s<9
zamiasts<10
lubs<=9
. Dane wejściowethis is a test
dająthis 222a1te52
zamiastthis 222a19e52
. Drugit
nie jest konwertowany na9
. Wypróbuj onlineC (gcc) ,
117103 bajtówWypróbuj online!
103 bajty bez importu string.h, działa z ostrzeżeniem. Jeśli będzie to niezgodne z zasadami, pociągnę to
Ładny kod:
Edycje:
źródło
(i=strlen(s);s[--i];)
zamiast(i=strlen(s)-1;s[i];i--)