Twoje zadanie: napisz program / funkcję, która otrzyma ciąg zawierający tylko znaki ASCII, wyprowadza / zwraca ciąg w odwrotnej kolejności.
Przykład:
1) Wejście
Hello, World!
2) Wpisz unikatowe znaki na wejściu. (Ciąg wejściowy oddzielony potokami ( |
) dla czytelności)
H|e|l|l|o|,| |W|o|r|l|d|!
1 2 3 4 5 6 7 8 9 10
3) W przypadku zduplikowanych znaków znajdź pierwsze wystąpienie tego znaku i ponumeruj zduplikowany znak o takim samym numerze jak pierwszy.
H|e|l|l|o|,| |W|o|r|l|d|!
1 2 3 3 4 5 6 7 4 8 3 9 10
4) Odwróć ciąg, ale nie cyfry.
!|d|l|r|o|W| |,|o|l|l|e|H
1 2 3 3 4 5 6 7 4 8 3 9 10
5) Usuń znaki powyżej powtarzających się liczb. (Usunięte znaki reprezentowane gwiazdką).
!|d|l|*|o|W| |,|*|l|*|e|H
1 2 3 3 4 5 6 7 4 8 3 9 10
6) Zastąp usunięte znaki znakiem, który pojawia się przy pierwszym wystąpieniu liczby, nad którą usunięto znak.
!|d|l|l|o|W| |,|o|l|l|e|H
1 2 3 3 4 5 6 7 4 8 3 9 10
7) Wyjście
!dlloW ,olleH
Przypadki testowe:
Input -> Output
"Hello, World!" -> "!dlloW ,olleH"
"18464399" -> "99343488"
"Code Golf" -> "floG eloC"
"abcdefgABCDEFG" -> "GFEDCBAgfedcba"
"Mmm, marshmallows" -> "swwllwmhsrwm mms"
"15147" -> "74751"
Odpowiedzi:
Pyth , 1 bajt
Sprawdź wszystkie przypadki testowe.
Pyth ma wspaniałe wbudowane :-)
Pyth ,
87 bajtówSprawdź wszystkie przypadki testowe.
Jak to działa
Jest to bardziej interesujące podejście niewbudowane.
źródło
Python 2 ,
4641 bajtów-5 bajtów dzięki Artyerowi
Wypróbuj online!
źródło
lambda x:''.join(x[~x.find(n)]for n in x)
zamiast cofania, a następnie indeksowaniaGalaretka , 5 bajtów
Wypróbuj online!
źródło
CJam , 7 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
y
pracowała.y
pracowała. : PMATL , 6 bajtów
Wypróbuj online!
źródło
05AB1E , 2 bajty
Wypróbuj online!
Wyjaśnienie:
źródło
Alice , 17 bajtów
Wypróbuj online!
Wyjaśnienie
Jest to zwykły szablon dla kodu liniowego w trybie porządkowym. Jeśli to rozwiążemy, rzeczywisty program stanie się po prostu:
Pomysł tutaj jest podobny do mojej odpowiedzi CJam . Ponieważ Alice nie ma łatwego sposobu indeksowania na ciągi liczb całkowitych, najłatwiej jest powtórzyć to zachowanie za pomocą transliteracji (
y
w Alice). Jednak semantyka transliteracji Alicji jest znacznie bardziej ogólna niż CJama, co oznacza, że Alice nie ignoruje tylko powtarzających się mapowań. Na przykład, jeśli chcemy po prostu dokonać transliteracjiMmm, marshmallows
do jej odwrotnej strony, reprezentuje to następującą listę odwzorowań:Należy pamiętać, że mamy na przykład
m -> w
,m -> o
,m -> a
im -> a
. CJam po prostu odrzuciłby wszystkie oprócz pierwszego mapowania, ale Alice zamiast tego je zmieniała. Tak więc pierwszym
zostanie zmapowanyw
, drugi doo
, piąty ponownie dow
itd. W tym przypadku nie jest pomocne, ponieważ w ogóle jeśli wykonujemyy
naAAB
(dla niektórych ciągówA
iB
) jak my w CJam, będziemy zawsze po prostuB
w Alice.Jak więc obliczyć mapowanie, które działa
y
(tj. W jaki sposób ręcznie odrzucamy powtarzane mapowania)? Oczywiście przy użyciu innej transliteracji. :)Źródłem pożądanego mapowania musi być nub wejścia (tj. Wejście deduplikowane). Jeśli zastosujemy powyższe mapowanie do nub, każda postać pojawi się tylko raz, więc wykorzystujemy tylko pierwsze z każdego z powtarzanych mapowań. Zatem transliterując nub z wejściem i jego odwrotnością, skutecznie po prostu odrzucamy zduplikowane odwzorowania. Następnie możemy użyć nub i tego nowego wyniku jako mapowania oryginalnego wejścia. Jestem pewien, że to miało sens dla kogoś ...
Więc kod:
źródło
Pyke , 7 bajtów
Wypróbuj tutaj!
źródło
Perl 5 , 23 + 1 (
-p
) = 24 bajtyWypróbuj online!
Dzięki wpisowi Alicji @ MartinEndera za pomysł transliteracji
źródło
JavaScript ES6 50 bajtów
3 bajty zapisane dzięki Justin Mariner
Sprawdź to:
źródło
R ,
6865 bajtówSprawdź przypadki testowe!
Porty Metoda Erika 05AB1E dla 3 bajtów mniej. To nie był pierwszy, ale pierwszy.
stara wersja:
Sprawdź wszystkie przypadki testowe - drukuje wektor z danymi wejściowymi jako nazwami i danymi wyjściowymi w cudzysłowach poniżej.
Dość naiwna implementacja, ale nie sądzę, że będzie ona krótsza w R (i cieszę się, że się mylę). Zasadniczo jest to port R odpowiedzi pytona Rod, ale został opracowany niezależnie.
Wyjaśnienie bez golfa:
źródło
C (gcc) , 98 bajtów
Wypróbuj online!
Argument musi być ciągiem modyfikowalnym; ciąg jest modyfikowany w miejscu.
źródło
Röda , 27 bajtów
Wypróbuj online!
To pobiera listę znaków jako dane wejściowe i zwraca strumień znaków.
Przy użyciu typu danych ciągu (40 bajtów):
Wypróbuj online!
źródło
Python ,
191128 bajtówWypróbuj online
źródło
Java 10,
1009997 bajtówPort odpowiedzi C @ LeakyNun . Wątpię, że można to zrobić krócej bez robienia czegoś podobnego w Javie.
-1 bajt dzięki @ceilingcat .
Wprowadź jako
char[]
(tablica znaków) i modyfikuje to wejście zamiast zwracać nowe, aby zapisać bajty.Wypróbuj tutaj.
źródło