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 ejest najczęściej używaną literą i zjest 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
nod0do25włącznie zastosuj ROT--ndo ciągu wejściowego. (Negatywne,nponieważ chcemy odwrócić szyfrowanie. ROT--njest 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.
ejest0,tjest1,ajest2itd. 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
z0 ie25 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.
wtaadpowinien dać0 wtaadjako wynik ivszzcpowinien dać25 wtaadjako wynik.