Cel
To proste wyzwanie. Twoim celem jest rozszyfrowanie łańcucha poprzez zamianę każdej litery na następną literę tej samej sprawy, pozostawiając znaki inne niż litery bez zmian.
Wyjaśnienie krok po kroku
Pierwsza postać to
E
. Następna litera szukamy dużymi literami: toC
. Zamieniamy te postacie, co prowadzi doCdoE!
.Przechodzimy do następnej postaci: jest to
d
. Następnej litery szukamy małymi literami: too
. Zamieniamy te postacie, co prowadzi doCodE!
.Przechodzimy do następnej postaci:
d
właśnie tu się przeprowadziliśmy. Ignorujemy to, ponieważ zostało już przetworzone.Przechodzimy do następnej postaci: tę
E
właśnie przeniesiono tutaj w kroku # 1. Ignorujemy to, ponieważ zostało już przetworzone.Przechodzimy do następnej postaci: jest to
!
. Ignorujemy to, ponieważ to nie jest list.
Zasady
Możesz założyć, że łańcuch wejściowy składa się wyłącznie z drukowalnych znaków ASCII, w zakresie od 32 do 126.
Możesz napisać pełny program lub funkcję, która albo wydrukuje, albo zwróci wynik.
Jeśli ciąg wejściowy zawiera nieparzystą liczbę liter, ostatniej pozostałej litery nie można zamienić na inną i powinien pozostać na miejscu, bez względu na wielkość liter. Ta sama logika ma zastosowanie, jeśli ciąg zawiera parzystą liczbę liter, ale nieparzystą liczbę wielkich liter i nieparzystą liczbę małych liter.
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach. Standardowe luki są zabronione.
Przypadki testowe
Input : lLEhW OroLd!
Output: hELlO WorLd!
Input : rpGOZmaimgn uplRzse naC DEoO LdGf
Output: prOGRamming puzZles anD COdE GoLf
Input : eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
Output: tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
Input : NraWgCi: Nsas-eNEiTIsev rNsiTG!!
Output: WarNiNg: Case-sENsITive sTriNG!!
Niezbyt przypadkowe przypadki testowe:
Input : (^_^)
Output: (^_^)
Input : AWCTY HUOS RETP
Output: WATCH YOUR STEP
Input : hwn oeesd acsp nawyya
Output: who needs caps anyway
Input : SpMycaeIesKyBorekn
Output: MySpaceKeyIsBroken
Input : D's mroyr, Ivam. I'e faardi I act'n od htta.
Output: I'm sorry, Dave. I'm afraid I can't do that.
Odpowiedzi:
Galaretka ,
21201918 bajtówWypróbuj online!
Jak to działa
źródło
Siatkówka , 53 bajty
Niezbyt sprytne, ale czyste i dość czytelne rozwiązanie
Wypróbuj online!
źródło
MATL , 22 bajty
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Jak to działa
źródło
Narzędzia Bash + Unix,
7762575654 bajtówWejście w standardowe wejście. Wyjście w standardowym wyjściu.
(W tej ostatniej wersji zdarza się, że napisano również o Stderr, ale wydaje się, że zgoda PPCG jest w porządku - stderr jest po prostu ignorowany. )
Edycja 1: Dzięki @Dennis za 15 bajtów! Ulepszenia: (a) Pobieranie danych wejściowych za pośrednictwem standardowego wejścia; (b) połączenie 2 skryptów sed w jeden; i (c) zastąpienie tr podstawieniem przez rozszerzenie parametru bash; (b) i (c) zniknęły w Edycji 2.
Edycja 2: Krótszy o 5 dodatkowych bajtów. Użyłem wywołania funkcji do zastąpienia zarówno (b), jak i (c) w Edycji 1.
Edycja 3: przekazano jeszcze jeden bajt] jako część argumentów funkcji.
Edycja 4: Zamieniono dwa wywołania funkcji na wywołania samego programu, gdy nie ma on żadnych argumentów.
Wyjście testowe i próbka:
źródło
ES6,
18595 bajtówRozwiązanie znacznie skrócone za pomocą @Neil, @Arnauld i @ edc65
Wyjaśnienie
źródło
/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
[o[b],o[j]]=[c,o[b]]
może byćo[o[j]=o[b],b]=c
Python , 82 bajty
Wypróbuj online!
źródło
QBasic, 229 bajtów
Strategia
Zapętlamy ciąg wejściowy. Kiedy napotykamy wielką literę, przechowujemy ją i jej pozycję. Za drugim razem, gdy napotykamy wielką literę, używamy przechowywanych wartości, aby zamienić ją na poprzednią. To samo dotyczy małych liter.
(
MID$(strng$, index, length) = replacement$
Właśnie miałem opublikować dłuższą wersję, która używała tablicy, ponieważ myślałem, że ciągi QBasic są niezmienne. Potem natknąłem się na fakt, że działa dobrze. Żyj i ucz się.)Ungolfed + skomentował
źródło
C ++ 11 (GCC),
154149 bajtówźródło
#include<string>
przełączyć się na C ++ 14 i zadeklarować ogólną lambda[](auto s)
i założyć,s
że jeststd::string
. Deklaracja[](auto&s)
pozwala także uniknąć zwracania ciągu, ponieważ dopuszcza się modyfikowanie argumentów wejściowych, aby służyły jako dane wyjściowe.Qbasic,
436408 bajtówOszczędność jednego bajtu dzięki DLosc. Zaoszczędziłem kilka innych, zmieniając obsługę znaków nieliterowych.
Zasadniczo składa się z trzech części:
Bardziej szczegółowe wyjaśnienie (zauważ, że jest to wcześniejsza wersja kodu, ale zasada nadal obowiązuje):
źródło
PHP,
1089383 bajtyPoprzednia wersja (93 bajty)
Dzięki @ user59178 za przypomnienie, że
preg_replace()
mogę traktować tablice ciągów jako argumenty.Oryginalna odpowiedź (108 bajtów)
Kod jest zawinięty tutaj, aby zmieścił się w dostępnej przestrzeni.
Można go wykonać z wiersza poleceń:
1-bajtowa krótsza wersja jest możliwa na PHP 7, ściskając przypisanie
$f
wewnątrz pierwszego wywołania:Oba rozwiązania, przypadki testowe i wersje bez golfa, można znaleźć na Github .
źródło
preg_replace
możesz wziąć szereg zamienników, aby to zrobić, więc potrzebujesz tylko jednego połączenia. Ponadto jest krótszy w użyciu<?=
niżecho
. Dzięki nim łatwo jest uzyskać odpowiedź do 93 bajtów.preg_replace()
. Zapomniałem o tym. Nie lubię<?=
(moim zdaniem<?
nie jest częścią języka, jest to tylko znacznik) i lubię pisać krótkie programy jednowierszowe, które można uruchamiać z poziomu wiersza poleceńphp -r
. Ale do celów gry w golfa znów masz rację. Za pomocą mogę zapisać 1 bajt<?=
.Mathematica, 96 bajtów
Port odpowiedzi Retina Leo , która używa wyrażeń regularnych.
źródło
Python 2 , 124 bajty
Nie tak krótkie jak moje rozwiązanie oparte na wyrażeniach regularnych , ale myślę, że wciąż jest interesujące.
Wypróbuj online!
źródło
Fasola , 83 bajty
Hexdump:
Odpowiednik JavaScript:
Wyjaśnienie:
Niejawnie przyjmuje pierwszy wiersz danych wejściowych jako niesformatowany jako
a
(ponieważ znaki nowej linii nie mogą być częścią zaszyfrowanego łańcucha) i domyślnie wyprowadza nieszyfrowany ciąg przez sekwencyjne zastępowanie wielkich i następnie małych liter.Wypróbuj wersję demo tutaj.
Wypróbuj pakiet testowy tutaj.
źródło
Ruby, 81 bajtów
źródło
JavaScript (ES6), 80 bajtów
Na podstawie odpowiedzi Leo's Retina .
Działa to, ponieważ jedynymi dużymi znakami w kodzie
.replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')
sąA
iZ
, które służą do opisu zakresów znaków. Właśnie tego potrzebujemy przekształcić na małe litery, aby przetworzyć drugie przejście.Przypadki testowe
Pokaż fragment kodu
źródło
ES6 155–195 bajtów
Wiem, że jest już lepsza odpowiedź, ale chciałem spróbować bez wyrażenia regularnego. Ten działa również na interpunkcji, ale wydaje się, że to narusza
(^_^)
test. W takim przypadku mam innąc()
funkcję, podaną poniżej.Wyjaśnienie
źródło
Perl 6 , 56 bajtów
Bierze zmienną łańcuchową jako argument i modyfikuje ją w miejscu, aby po wywołaniu lambda zmienna zawierała wynik.
Dłuższy niż w Perlu, ponieważ:
<[A..Z]>
zamiast[A-Z]
.EVAL
, które pozwoliłoby na większą elastyczność, wymaga nieprzyjaznej golfowi pragmyuse MONKEY-SEE-NO-EVAL;
.Po stronie plus do tablicy w
@
zmiennej można odwoływać się bezpośrednio w wyrażeniu regularnym i jest ona traktowana jako alternatywa.Perl 6 , 65 bajtów
Wersja funkcjonalna (zwraca wynik jako wartość zwracaną lambda).
źródło
R, 343 bajtów
Strasznie niezdarne rozwiązanie R:
źródło
Python 2, 181 bajtów
Znacznie dłużej niż powinno, ale i tak:
To najpierw tworzy dwie listy: jeden z indeksów wielkich liter i jeden dla małych liter. Każda z tych list jest zapętlona w parach indeksów, a znaki w tych indeksach są zamieniane.
Jutro zagram w golfa
, ale teraz czas na sen.źródło
Pip , 28 bajtów
Pobiera dane wejściowe jako argument wiersza polecenia. Wypróbuj online!
Wyjaśnienie
Jest to rozwiązanie wyrażenia regularnego, wykorzystujące wbudowane zmienne wyrażenia regularnego
XL
(małe litery`[a-z]`
) iXU
(wielkie litery`[A-Z]`
).Gdy drugim argumentem
R
jest lista, zamiany są wykonywane szeregowo; tak więc zamiana małych liter i zamiana wielkich liter nie kolidują ze sobą.źródło
Perl 5 , 48 + 1 (-p) = 49 bajtów
Wypróbuj online!
źródło
AWK ,
121129 bajtówWypróbuj online! Uwaga: Link ma 8 dodatkowych bajtów, aby umożliwić wejście wielowierszowe
Użycie jest dość typowe, ale wymaga wersji,
AWK
która akceptuje pusty ciąg znaków jako separator pól (większość wersji,gawk
ale jestem prawie pewien, że oryginał sięAWK
nie powiedzie :()Jest to bardzo proste, ponieważ po prostu iteruje każdą postać i sprawdza, czy wcześniej znalazła jedną z takich spraw. Jeśli tak, zamienia znaki i resetuje zaznaczony indeks. Po stronie uczenia się nigdy wcześniej nie użyłem instrukcji przypisania w instrukcji przypisania
AWK
. Z jakiegoś powodu nigdy się nie pojawiło. :)Mogę być w stanie ogolić kilka bajtów, mówiąc o przypisaniu OFS i FS poza
BEGIN
blok za pomocą przypisania z wiersza poleceń lub podobnego, ale w ten sposób jest „czystszy”.Dodanie linku TIO pokazało mi, że mam błąd transkrypcji, który wymagał naprawy 8 bajtów :( (Pominąłem
0*(U=a):
)źródło
C (gcc) ,
212206 bajtówWypróbuj online!
źródło
Stax , 18 bajtów
Uruchom i debuguj
Ogólne podejście opiera się na wyrażeniach regularnych.
[a-z].*?[a-z]
.źródło
R ,
223163 bajty148 bajtówEDYCJA: -60 bajtów poprzez implementację pętli for
EDYCJA: -15 bajtów od Giuseppe
Wypróbuj online!
Działa poprzez testowanie, czy znak jest małą lub wielką literą, umieszcza je w macierzy, odwraca macierz, aby wyodrębnić wartości w formacie zamienionym. Następnie wyślij za pomocą
cat
. Wypróbuj go online,scan(,'')
gdy kod ma więcej niż jedną linię, stąd średniki w całym wierszu kodu.źródło
x
małostkowy jest mądry nieco, ale pozbycie sięm=matrix
było 4 bajtów, jak również.scan(,'')
problemem? I redukując „LLEhW OroLd!” w TIO nascan(,'')
lub w inny sposób, aby uzyskać wkład?Java 7, 117 bajtów
EDYCJA: Właśnie zauważyłem, że mam podobną odpowiedź jak odpowiedź Retina @Leo , mimo że myślałem o tym niezależnie.
Nie golfowany:
Kod testowy:
Wypróbuj tutaj.
Wynik:
źródło