Aqui estão as letras do alfabeto inglês em ordem por frequência:
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
Ou seja, e
é a letra mais usada e z
é a menos comum. (Dados da Wikipedia .)
Seu desafio é pegar um texto rotulado como, por exemplo:
ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Este é o texto "esta revisão é uma revisão segura e segura" que é "criptografada" através do ROT-21 (metade de 42). Seu programa, usando a tabela de frequência acima, deve poder determinar quanto cada caractere foi rotacionado e o texto original.
(Se você não está familiarizado com o ROT-n, é essencialmente mudar cada caractere n
. Por exemplo, no ROT-2,a -> c, b -> d, ..., x -> z, y -> a, z -> b
,.)
Como você pergunta? O algoritmo (muito ingênuo) que você deve usar é:
- para cada
n
de0
que25
inclusive, aplicar podridão-n
para a cadeia de entrada. (Negativon
porque queremos reverter a criptografia. ROT--n
é equivalente a ROT-26-n
, se for mais fácil.) - converta cada sequência de entrada em um número adicionando as frequências relativas dos caracteres.
e
é0
,t
é1
,a
é2
, etc. Por exemplo, o número correspondente para a sequência"hello"
é 7 + 0 + 10 + 10 + 3 = 30. - encontre a string que tem o menor número correspondente.
- output essa string e seu correspondente
n
.
Regras:
- a entrada pode ser em qualquer lugar razoável (STDIN, argumentos da função, de um arquivo etc.), e também a saída (STDOUT, valor de retorno da função para um arquivo etc.)
- você pode usar um algoritmo diferente, desde que ele sempre produz resultados idênticos. Por exemplo, ter
z
0 ee
25 e escolher o número mais alto também é aceitável. - se duas seqüências tiverem pontuações idênticas, você poderá escolher a saída de uma (ou de ambas). Este é um caso extremo e você não precisa prestar contas.
- isso é código-golfe , então o código mais curto em bytes vencerá!
Casos de teste:
Entrada: ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Saída:21 thisisaverysecretmessagethatisverysecureandsafe
Entrada: pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom
Saída:8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
Entrada: ftueimeqzodkbfqpiuftdaffiqxhqeaufygefnqbqdrqofxkemrq
Saída:12 thiswasencryptedwithrottwelvesoitmustbeperfectlysafe
Entrada: jgtgkuvjghkpcnvguvecugvjcvaqwowuvfgetarv
Saída:2 hereisthefinaltestcasethatyoumustdecrypt
Caso você esteja se perguntando, aqui está um JSFiddle do código de teste JavaScript que eu escrevi, que descriptografou com êxito todos os casos de teste que joguei nele.
wtaad
deve dar0 wtaad
como resultado evszzc
deve dar25 wtaad
como resultado.