Opis
Przesunięcie Cezara jest bardzo prostym szyfrem monoalfabetycznym, w którym każda litera jest zastępowana kolejną literą w alfabecie. Przykład:
Hello world! -> IFMMP XPSME!
( IBSLR, EGUFV!
jest wynikiem rzeczywistego wyzwania, był to przykład przesunięcia o 1)
Jak widać, odstępy i interpunkcja pozostają nienaruszone. Aby jednak nie zgadywać wiadomości, wszystkie litery są pisane wielkimi literami. Przesuwając litery z powrotem, wiadomość została odszyfrowana, wygodna, ale także bardzo łatwa do odczytania przez inne osoby, które powinny nie wiedzieć, co oznacza wiadomość.
Pomożemy więc trochę Cezarowi, wykorzystując zaawansowaną formę jego szyfru: Samokierującą się zmianę Cezara !
Wyzwanie
Twoim zadaniem jest napisanie programu lub funkcji, która podając ciąg encipherowi, wyprowadza zaszyfrowany ciąg odpowiadający wejściu. Zaawansowana zmiana Cezara działa w następujący sposób:
1. Compute letter differences of all adjacent letters:
1.1. Letter difference is computed like this:
Position of 2nd letter in the alphabet
-Position of 1st letter in the alphabet
=======================================
Letter difference
1.2. Example input: Hello
H - e|e - l|l - l|l - o
7 - 5|5 - 12|12 - 12|12 - 15 Letter differences: 3; -7; 0; -3
=3| =-7| =0| =-3
2. Assign the letters continously a letter difference from the list,
starting at the second letter and inverting the differences:
2.1. 2nd letter: first difference, 3rd letter: second difference, etc.
2.2. The first letter is assigned a 1.
2.3. Example input: Hello with differences 3; -7; 0; -3
Letter || Value
=======||======
H || 1
E || -3
L || 7
L || 0
O || 3
3. Shift the letters by the value x they have been assigned:
3.1. In case of a positive x, the letter is shifted x letters to the right.
3.2. In case of a negative x, the letter is shifted |x| letters to the left.
3.3. In case of x = 0, the letter is not shifted.
3.4. If the shift would surpass the limits of the alphabet, it gets wrapped around
Example: Y + Shift of 2 --> A
3.5. Example input: See the table under 2.3.
|| || Shifted
Letter || Value || Letter
=======||=======||=========
H || 1 || I
E || -3 || B Program output:
L || 7 || S IBSLR
L || 0 || L
O || 3 || R
W tym procesie pomijane są spacje i inne specjalne symbole, takie jak interpunkcja. Gwarantujemy, że program otrzyma ciąg znaków zawierający tylko drukowalne znaki ASCII. Dane wyjściowe funkcji / programu muszą być pisane tylko wielkimi literami.
To jest golf golfowy , więc obowiązują standardowe luki i może wygrać najkrótsza odpowiedź w bajtach!
źródło
E
-3
jestZEN
, na przykład.Z
przesunięty o 1 to ...A
? (na marginesie, odpowiedź 05AB1E zmienia sięZ
wA
)RELIEF
iRELIES
oba, aby uzyskać ten sam wynikSRSFAG
?Odpowiedzi:
05AB1E ,
282724 bajtówWypróbuj online!
Wyjaśnienie
źródło
IBSLR, EGUFV!
zaHello, World!
, czy to prawda? Czy OP po prostu zepsuło ten przykład?Python 3 , 100 bajtów
Wypróbuj online!
b
śledzi kod ASCII ostatniej litery lub początkowo wynosi zero; formułac+c-(b or~-x)
oznacza, że litera z kodem ASCIIc
jest przesuwana przezc-b
ifb
jest niezerowe, ac-(c-1) == +1
jeślib
wynosi zero (dla pierwszej litery).b
nigdy nie zmieni się ponownie na zero, ponieważ ciąg znaków składa się z drukowanych znaków ASCII.Na koniec
64<c<91
sprawdza, czyc
jest to wielka litera ASCII i(…-65)%26+65
zawija wszystko z powrotem doA-Z
zakresu.ovs zapisał bajt. Dzięki!
źródło
05AB1E ,
323029 bajtówWypróbuj online!
źródło
ES6 (JavaScript), 138 bajtów:
http://jsbin.com/manurenasa/edit?console
źródło
MATL , 27 bajtów
Wypróbuj online!
Myślę, że jest to najkrótszy możliwy, ale istnieje wiele różnych odmian, ponieważ istnieje wiele możliwości ponownego użycia „zmiennych” (są 3
t
(duplikacja) i 2w
(zamiana) operacji,H
używany jest schowek i nawet wtedy jest jeszcze duplikat1Y2
...). Niestety nie udało mi się zapisać bajtów za pomocą automatycznegoM
schowka.Ponad połowa programu zajmuje się pisaniem wielkimi literami i ignorowaniem znaków niealfabetycznych - sam szyfr ma nie więcej niż 13 bajtów ( wypróbuj online! )
źródło
Perl,
9089Chociaż języki niekodowane są rzadko konkurencyjne, możemy zejść poniżej 100;)
Postanowiłem odholfować to:
@a = split//,<>;
Pobiera dane ze STDIN, przechowuje listę znaków (z nową linią!) W @a.say uc(++$a[0])
wypisuje pierwszą literę przesuniętą o 1. Okazuje się, że możesz zwiększyć literę w perlu, jeśli używasz przedrostka ++. To jest mutator ofc.2*ord($a[$_+1])-ord($a[$_])+!$_
Jesteśmy proszeni o przyjęcie znaku na x i dodanie różnicy + (x- (x-1)). Cóż, to 2x - (x-1). Jednak: Zmieniłem pierwszą literę! Dlatego muszę skorygować ten błąd,+!$_
który poprawi odjęcie o jeden za dużo na pozycji 0 (tylko przypadek! $ _ Nie jest undef). Następnieuc chr
otrzymujemy wielką literę z obliczonej wartości ASCII.map{ ... } $#a-2
-$#a
oznacza pozycję umożliwiającą dostęp do ostatniego elementu tablicy. Ponieważ dodaję jeden, chcę$#a-1
, ale ponieważ nowy wiersz z danych wejściowych wymaga zignorowania, to jest$#a-2
.Jest to połączone z pierwszą literą i gotowe :)
źródło
Perl 5
-F
,737774 bajtówWypróbuj online!
źródło
Hello, World!
powinno to skutkowaćIBSLR, EGUFV!
, nieIBSLR, XGUFV!
.PHP,
10698 bajtówdość paskudny ten ... jeśli po prostu
base_convert
nie był tak długi (lubctype_alpha
) ...ale mam go poniżej 100. jestem zadowolony.
Uruchom jako potok z
-nR
lub spróbuj online .źródło
JavaScript (Node.js) ,
86838781 bajtówWypróbuj online!
źródło