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.
fonte
wtaad
deve dar0 wtaad
como resultado evszzc
deve dar25 wtaad
como resultado.Respostas:
GolfScript - 87
O truque aqui é construir cada rotação simultaneamente. Como precisamos fazer um loop sobre cada ROT e depois com todos os caracteres, vamos fazer loop com cada caractere, dividir o alfabeto inteiro e depois compactá-lo. A partir daí, proceda conforme o esperado: conte a pontuação para cada ROT e escolha o mínimo.
Golfe extra:
Apenas um pouco de golfe:
fonte
Haskell -
192175Corrida
fonte
[1,1,1,1]
, e isso dará a mesma ordem. O mapeamento e a soma tornam-se osconcatMap
que podem ser escritos de forma sucinta usando uma compreensão da lista. Combinado com alguns outros truques, eu encurtou a 152 caracteres:main=interact(\s->snd$minimum[([1|x<-r,_<-fst$span(/=x)"etaoinshrdlcumwfgypbvkjxqz"],show(26-n)++' ':r)|n<-[0..25],r<-[[([x..'z']++['a'..])!!n|x<-s]]])
.GolfScript,
112108102100 caracteresNão estou feliz com a repetição com a decriptografia no final, mas meh.
Ungolfed (se isso faz algum sentido: P) e versão um pouco mais antiga:
fonte
echo
coloca uma nova linha por padrão, que o intérprete entende.JavaScript (205)
Eu acho que ainda pode ser jogado um pouco mais, então sugestões são bem-vindas!
Algumas notas para ajudar a entender a solução
m
,n
Eo
acompanhar a maior pontuação.u
ew
rastrear o resultado de caractere e valor, respectivamente para o atuali
(a+a)
ajuda a evitar transbordamentos ao contornar o passadoz
e é mais curto do que fazer%26
Prova: http://jsfiddle.net/J9ZyV/5/
fonte
indexOf
uma variável.C # + Linq -
273264Como uma função que pega a string de entrada e retorna a string decodificada e o deslocamento (conforme os requisitos):
Ungolfed com comentários:
Pouco driver de teste (lembre-se de compilar referências
System.Core
para o Linq):Dando:
fonte
Tuple<string,int> d
Tuple<int,string>f(string x){return Enumerable.Range(0,25).Select(n=>Tuple.Create(26-n,string.Concat(x.Select(c=>(char)((c-97+n)%26+97))))).OrderBy(t=>(t.Item2.Select(c=>"etaoinshrdlcumwfgypbvkjxqz".IndexOf(c))).Sum()).First();}
Range(0, 26)
, não25
.dg -
137130129128 bytesExemplos:
Código não destruído:
fonte
c - 97
e(0..26)
?dg
antes. Você poderia fornecer um link?J - 92 char
Um patinho feio, mas funciona. Produz o número e a sequência, em duas linhas.
Se você deseja que eles estejam na mesma linha, separados por espaço, isso aumenta apenas 93 caracteres , mas segue uma rota mais feia.
Uma explicação para
(/:'ctljapqhewvknfdsyigbmuoxrz')
: Neste verbo, operamos os valores das letras como A = 0, B = 1, C = 2, etc. Para codificar os valores das letras da sequênciaetaoinshrdlcumwfgypbvkjxqz
, o caminho mais curto é realmente levar a permutação de classificação para esta corda estranha. Isso ocorre porque A está no índice 4, B no índice 19, C em 0, D em 14 e assim por diante; portanto, a permutação de classificação é4 19 0 14 8 13 ...
quando você a classifica (/:
) e obtém exatamente os valores numéricos paraetaoin...
.Uso:
fonte
q, 97
.
fonte
APL - 70 caracteres
Exemplo:
Tenho certeza de que existem maneiras de compactar isso ainda mais e convido outros usuários da APL a encontrar soluções para isso.
fonte
Python 188
fonte
Perl: 256 caracteres (mais novas linhas para facilitar a leitura), incluindo a tabela de frequências:
O texto é fornecido da seguinte forma:
Retire 12 caracteres se desejar inserir os valores de ord (a) e o comprimento de @f
fonte
Olmo - 465
Não vai ganhar nenhum prêmio de golfe, mas cria uma página estática que exibe uma lista do formulário
[(rotation number, rotated string)]
enquanto você digita.Nota: ainda não está trabalhando aqui, mas você pode copiá-lo e colá-lo no editor oficial e executá-lo.
fonte
Python 2, 171
fonte