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
nde0que25inclusive, aplicar podridão-npara a cadeia de entrada. (Negativonporque 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
z0 ee25 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.
wtaaddeve dar0 wtaadcomo resultado evszzcdeve dar25 wtaadcomo resultado.