Problema:
Você deve criar um programa que faça o seguinte:
- pega uma grande sequência de texto em minúsculas e conta todas as ocorrências de cada letra.
- então você coloca as letras em ordem, da maior para a menor ocorrência.
- então você pega essa lista e a transforma em um codificador / decodificador para o texto.
- depois codifica o texto com essa cifra.
Dificíl de entender? Veja este exemplo:
Exemplo:
Entrada de texto:
Lorem ipsum dolor sente-se no meio, consectetur elip adipiscing. Nunc sed dui e nisi euismod pellentesque ac sed enim. Nullam auctor justo quis diam faucibus, eu fringilla é porttitor. Pellentesque vel pharetra nisl. O vestíbulo congela ultrices magna a fringilla. Quisque porttitor, risus suscipit pellentesque tristique, orci lorem accumsan nisi, scelerisque viverra turpis metus sit amet sapien. Fusce facilisis diam turpis, ne lobortis dui blandit ne. Vestibulum ac urna ut lacus commodo sollicitudin nec non velit. Nulla cursus urna sem, e tincidunt sem molestie vel. Nullam fringilla ante eu dolor bibendum, posuere iaculis nunc lacinia. Sed ac pretium est, vel scelerisque nisl. Phasellus lobortis dolor sodales sapien mollis hendrerit. Número inteiro temporário, viverra varius neque mattis in. et feugiat tortor tincidunt vel. Aenean dignissim eleifend faucibus. Morbi nec neque vel ante pulvinar mollis eu in ipsum.
Converter em minúsculas.
Contagem de caracteres (por letra. Espaços e pontuação ignorados):
[('a', 49), ('b', 11), ('c', 34), ('d', 22), ('e', 93), ('f', 9), ( 'g', 10), ('h', 3), ('i', 89), ('j', 1), ('k', 0), ('l', 61), ('m ', 31), (' n ', 56), (' o ', 37), (' p ', 20), (' q ', 12), (' r ', 47), (' s ', 71), ('t', 59), ('u', 65), ('v', 15), ('w', 0), ('x', 0), ('y', 0) , ('z', 0)]
Contagem de caracteres ordenada:
[('e', 93), ('i', 89), ('s', 71), ('u', 65), ('l', 61), ('t', 59), ( 'n', 56), ('a', 49), ('r', 47), ('o', 37), ('c', 34), ('m', 31), ('d ', 22), (' p ', 20), (' v ', 15), (' q ', 12), (' b ', 11), (' g ', 10), (' f ', 9), ('h', 3), ('j', 1), ('k', 0), ('w', 0), ('x', 0), ('y', 0) , ('z', 0)]
Em seguida, crie uma tabela de pesquisa usando as listas originais e classificadas:
abcdefghijklmnopqrstuvwxyz
||||||||||||||||||||||||||
eisultnarocmdpvqbgfhjkwxyz
Dicionário Python:
{'o': 'v', 'n': 'p', 'm': 'd', 'l': 'm', 'k': 'c', 'j': 'o', 'i': 'r', 'h': 'a', 'g': 'n', 'f': 't', 'e': 'l', 'd': 'u', 'c': 's', 'b': 'i', 'a': 'e', 'z': 'z', 'y': 'y', 'x': 'x', 'w': 'w', 'v': 'k', 'u': 'j', 't': 'h', 's': 'f', 'r': 'g', 'q': 'b', 'p': 'q'}
E agora codifique o texto original com esta tabela de pesquisa:
«Lvgld rqfjd uvmvg frh edlh, svpflshlhjg eurqrfsrpn lmrh. Njps gripe ujr eh prfr ljrfdvu qlmmlphlfbjl es gripe lprd. Njmmed ejshvg ojfhv bjrf ured tejsrijf, lj tgrpnrmme lfh qvghhrhvg. Plmmlphlfbjl klm qaeglhge prfm. Vlfhrijmjd svpnjl jmhgrslf denpe e tgrpnrmme. Qjrfbjl qvghhrhvg, grfjf fjfsrqrh qlmmlphlfbjl hgrfhrbjl, vgsr mvgld essjdfep prfr, fslmlgrfbjl krklgge hjgqrf dlhjf frh edlh feqrl. Fjfsl tesrmrfrf ured hjgqrf, pls mvivghrf ujr imepurh pls. Vlfhrijmjd es jgpe jh mesjf svddvuv fvmmrsrhjurp pls pvp klmrh. Njmme sjgfjf jgpe fld, eh hrpsrujph fld dvmlfhrl klm. Njmmed tgrpnrmme ephl lj uvmvg irilpujd, qvfjlgl resjmrf pjps mesrpre. Slu es qglhrjd lfh, klm fslmlgrfbjl prfm. Paeflmmjf mvivghrf uvmvg fvuemlf feqrlp dvmmrf alpuglgrh. Iphlnlg fslmlgrfbjl hldqvg hlmmjf, krklgge kegrjf plbjl dehhrf rp. Iphlnlg qvghe klfhrijmjd prfm, lh tljnreh hvghvg hrpsrujph klm. Alplep urnprffrd lmlrtlpu tejsrijf. Mvgir pls plbjl klm ephl qjmkrpeg dvmmrf lj rp rqfjd. '
Eu amo python!
Regras:
- Seu programa aceitará uma string e emitirá uma.
- Converta todas as entradas em minúsculas antes de fazer qualquer coisa
- Não me importo como você classifica a lista, mas conta apenas letras minúsculas
- Pontos de bônus (-30) por criar um decodificador (sem copiar a lista de decodificação), faça-o do zero
- Isto é código-golfe, então o código mais curto vence!
- Diverta-se!
Bonus points (-30) for making a decryptor (no copying the decryption list, do it from scratch
? ISSO É IMPOSSÍVEL! Você precisaria ter a chave (sua "lista de descriptografia", também conhecida como "tabela de pesquisa") para poder fazer isso. Apenas pegar um texto cifrado e esperar que alguém forneça um decodificador que o transforme novamente em texto sem formatação, sem o uso de nenhuma chave, é como se você estivesse nos pedindo para publicar uma pergunta no StackOverflow sem digitar nenhuma letra ou número. A teoria da informação já nos diz que você não pode obter informações do nada ... então sua cifra de substituição precisa dessa tabela de pesquisa (também conhecida como chave).Respostas:
GolfScript, 39 caracteres
Versão online para teste. Observe que a classificação não é definida se vários caracteres tiverem a mesma contagem na sequência de entrada.
Saída de exemplo
fonte
Bash / coreutils, 91 caracteres
Salve como
cipher.sh
, chmod + xe execute:fonte
Rubi,
1049291 caracteresGuardou muitos caracteres graças a @Chron
Versão Online aqui. A classificação de caracteres com a mesma contagem não está definida, conforme mencionado em outra resposta. Com a entrada "asdf", cada resposta tem outra saída até o momento.
Em outras palavras: todas as respostas têm o mesmo comportamento (portanto representam uma codificação decodificável) quando a entrada contém o alfabeto inteiro com cada letra tendo uma contagem exclusiva.
fonte
("a".."z").to_a
pode ser[*?a..?z]
,m.join
pode serm*''
edef f(s)...end
pode serf=->s{...}
Mathematica 171
Supondo que
t
é o texto Lorem ipsum.As regras de substituição geradas por
Thread…-> l
foram:fonte
K, 43
fonte
C # 386
Descomprimido.
fonte
e93i89s71u65l61t59n56a49r47o37c34m31d22p20v15q12b11g10f9h3j1k0w0x0y0z0
. E não chega nem perto do desafio.PHP, 151
(com configuração
short_open_tag = On
)Isso espera que o texto seja o primeiro argumento para o script. Igual a:
fonte
R, 137
Saída (com base no exemplo em questão):
fonte
Smalltalk, 138
entrada em s:
o decodificador é:
mas como (se entendi corretamente) não posso reutilizar "i" e "m", vou jogar sem ele. O código acima tem dois CRs adicionais inseridos para facilitar a leitura, que não foram contados na contagem de caracteres.
fonte
Clojure, 135
(Supondo que o texto de entrada esteja contido no var
s
)fonte
Python 2.7 (147)
Não é o código mais curto, mas como o Python ainda não está representado e como eu vejo "Eu amo o python!" na configuração do problema, aqui vou eu,
Espera que a sequência de entrada seja passada através da linha de comando. (o número de caracteres é reduzido para 122 se a sequência de entrada foi inserida magicamente na variável "s")
Ouput
fonte
Perl, 84
.
PS Foi uma piada, sobre decifrar? Ou devo reivindicar 30 bônus por provar que é impossível? É
aab
decifrado paraaab
oubba
? Oubabaca
, eracacaba
ouababcb
no original, ou embabaca
si, literalmente?fonte
C # - 393 bytes
A versão estendida da resposta de @ PauloHDSousa …
fonte