Biorąc pod uwagę ciąg, musisz przenieść każdą literę (zaczynając od pierwszej litery) o jej pozycję w alfabecie. Jeśli dojdziesz do końca sznurka, musisz się owinąć. Nie-litery nie muszą być przenoszone.
Przykład:
Dog
D
jest czwartą literą alfabetu, więc przesuwamy ją o cztery miejsca w prawo. Po zawinięciu zmienia to ciąg na oDg
. o
jest 15. literą (15 mod 3) = 0, więc się nie porusza. g
jest siódmą literą - (7 mod 3) = 1, więc ciąg staje się goD
.
hi*bye
h
jest ósmą literą, przesuń ją o 8 miejsc -hi*bye
=>i*hbye
i
jest 9 literą, przesuń ją o 9 miejsc -i*hbye
=>*hbiye
b
to druga litera, przesuń ją o 2 miejsca -*hbiye
=>*hiybe
y
jest 25. literą, przesuń ją o 25 miejsc -*hiybe
=>*hibye
e
jest piątą literą, przesuń ją o 5 miejsc -*hibye
=>*hibey
Nie-litery nie muszą być przenoszone, ale wciąż zajmują miejsce.
cat
=>tca
F.U.N
=>.F.NU
mississippi
=>msiisppssii
Odpowiedzi:
CJam,
444240 bajtówDane wyjściowe zawierają końcowe podawanie wiersza.
Sprawdź to tutaj.
Wyjaśnienie
Zamiast przesuwać litery po sznurku, wielokrotnie usuwam literę, odpowiednio obracam sznurek, a następnie wkładam ponownie literę. Jest jeden haczyk: musimy odróżnić początek łańcucha od końca łańcucha (czego nie możemy po zwykłym obrocie). Dlatego wstawiamy wysuw linii na końcu jako zabezpieczenie (litera przed wysuwem linii jest końcem ciągu, litera po nim jest początkiem). Dodatkową zaletą jest to, że automatycznie przywraca końcowy ciąg znaków do prawidłowego obrotu, w którym linia faktycznie znajduje się na końcu ciągu.
Aby zobaczyć, dlaczego kończy się to na właściwej pozycji, rozważ ostatnią iterację
hi*bye
przykładu. Po przetworzeniue
wyliczony ciąg znajduje się w tej pozycji:Najpierw podzieliliśmy się wokół linii i konkatenowaliśmy części w odwrotnej kolejności:
Kanał będzie teraz na początku lub na końcu tego ciągu. Ale ponieważ linefeed jest tylko osłoną, która oznacza koniec łańcucha, oznacza to, że znaki są w odpowiedniej kolejności. Teraz linia nie jest literą, więc tablica nie jest w ogóle obracana. Tak więc, gdy dodamy linię, idzie ona tam, gdzie należy i wszystko jest w kolejności, w jakiej szukamy:
Niektóre dodatkowe wyniki, jeśli ktoś chce porównać dłuższe przypadki testowe:
Podoba mi się ten ostatni. :)
źródło
Rubin 125
130 132 139bajtówDemo online z testami: http://ideone.com/GYJm2u
Pierwsza (wersja bez golfa): http://ideone.com/gTNvWY
Edycja: Wielkie podziękowania dla manatwork za jego sugestie!
Edycja 2 : naprawiono liczbę znaków (początkowo liczyłem zakończenia linii CRLF).
źródło
c.upcase.ord-64
→c.ord%32
.a.join
??? Kim jesteś i co zrobiłeś z w0lf? Z pewnością napisałby to jakoa*''
.while ... end
że mam w swoim kodzie, że zapomniałem to zrobić. Dzięki za zauważenie!while ... end
w(...)while ...
?Python 3,
278275273270260258249248243238 bajtówNaprawdę powinienem lepiej zagrać w golfa, ale oto moje rozwiązanie, z podziękowaniami dla katenkyo za jego pomoc w logice oraz Cyoce i Mego za ich pomoc w grze w golfa.
Edycja: W końcu sprowadziłem to do jednego zestawienia porównawczego. ZABIEGAĆ! (I tak, mógłbym to przenieść
z=-z
naa,m=m,a
kawałki, ale to nie oszczędza bajtów i zamazało kod bardziej, niż uważałem za konieczne)Edycja: liczba bajtów była wyłączona.
Nie golfowany:
źródło
p[j][0]
można zmniejszyć poprzez ustawienieJ=p[j];
na początku, a następnie zastąpienie wystąpieńp[j][0]
zP[0]
p
bezpośrednio, a nie zmienną, która jąp[j]
przypisała. Ponadto, jeśli spojrzysz na moją historię zmian, miałem zmiennąk = p[j][0]
doa<=k<=m
porównań, ale okazało się, że usuwaniek
było lepsze, ponieważ zapisałem więcej bajtów na wcięciach z dodatkowej linii do ustawieniak
niż zapisałem przy użyciuk
.