Oto litery alfabetu angielskiego w kolejności według częstotliwości:
e t a o i n s h r d l c u m w f g y p b v k j x q z
Oznacza to, że e
jest najczęściej używaną literą i z
jest najmniej powszechna. (Dane z Wikipedii .)
Twoim wyzwaniem jest pobranie tekstu ROT-n'd, takiego jak:
ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Jest to tekst „tenissecretmessagetatisverysecureandsafe”, który jest „szyfrowany” przez ROT-21 (połowa z 42). Twój program, korzystając z powyższej tabeli częstotliwości, powinien być w stanie określić, o ile każdy znak został obrócony i oryginalny tekst.
(Jeśli nie znasz ROT-n, zasadniczo przesuwa on każdy znak o n
. Na przykład w ROT-2,. a -> c, b -> d, ..., x -> z, y -> a, z -> b
)
Jak pytasz (Bardzo naiwnym) algorytmem, którego musisz użyć, jest:
- dla każdego
n
od0
do25
włącznie zastosuj ROT--n
do ciągu wejściowego. (Negatywne,n
ponieważ chcemy odwrócić szyfrowanie. ROT--n
jest równoważne z ROT-26-n
, jeśli jest to łatwiejsze). - przekonwertować każdy ciąg wejściowy na liczbę, dodając względne częstotliwości znaków.
e
jest0
,t
jest1
,a
jest2
itd. Na przykład odpowiednia liczba dla łańcucha"hello"
to 7 + 0 + 10 + 10 + 3 = 30. - znajdź ciąg, który ma najniższą odpowiadającą mu liczbę.
- wypisuje ten ciąg i odpowiadający mu ciąg
n
.
Zasady:
- dane wejściowe mogą być w dowolnym miejscu uzasadnione (STDIN, argumenty funkcji, z pliku itp.), a zatem mogą generować (STDOUT, wartość zwracana funkcji, do pliku itp.)
- możesz użyć innego algorytmu, o ile zawsze daje on identyczne wyniki. Na przykład posiadanie
z
0 ie
25 i wybranie najwyższej liczby również jest w porządku. - jeśli dwa ciągi mają identyczne wyniki, możesz wybrać wyjście jednego (lub obu) z nich. To jest przypadek skrajny i nie musisz tego rozliczać.
- to jest code-golf , więc wygra najkrótszy kod w bajtach!
Przypadki testowe:
Wejście: ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Wyjście:21 thisisaverysecretmessagethatisverysecureandsafe
Wejście: pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom
Wyjście:8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
Wejście: ftueimeqzodkbfqpiuftdaffiqxhqeaufygefnqbqdrqofxkemrq
Wyjście:12 thiswasencryptedwithrottwelvesoitmustbeperfectlysafe
Wejście: jgtgkuvjghkpcnvguvecugvjcvaqwowuvfgetarv
Wyjście:2 hereisthefinaltestcasethatyoumustdecrypt
Jeśli się zastanawiasz, oto JSFiddle kodu testowego JavaScript, który napisałem, który z powodzeniem odszyfrował wszystkie testowane przeze mnie przypadki testowe.
wtaad
powinien dać0 wtaad
jako wynik ivszzc
powinien dać25 wtaad
jako wynik.