Introdução
O Enigma foi uma das primeiras máquinas de codificação de rotores eletromecânicos usados na Segunda Guerra Mundial. Isso significa que, depois que uma única letra é codificada, ele altera a chave da próxima letra. Isso foi considerado inquebrável pelos alemães, devido ao enorme espaço-chave. Até a força bruta era quase impossível. No entanto, houve um erro de design no Enigma. Criptografar uma carta nunca resultaria em si mesmo. Isso significa que a carta A
pode criptografar para todas as letras, exceto a letra A
.
Vamos dar um exemplo de uma mensagem codificada:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
Uma palavra alemã típica era WETTERBERICHT
, ou previsão do tempo, em inglês. Com o princípio acima, podemos determinar em quais locais a palavra poderia estar:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Isso não é possível, porque o I
arquivo não pode ser criptografado, então passamos para um local:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Isso também não é possível, então movemos outro lugar novamente:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Isso novamente não é possível. De fato, a primeira ocorrência possível de WETTERBERICHT
é:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
0123456789012345678901234567890123456789012345678901234567890123
^
13
Portanto, retornamos a posição indexada 0 da primeira ocorrência possível, que é 13 .
A tarefa
- Dada uma mensagem codificada e uma palavra, encontre o índice da primeira ocorrência possível .
- Suponha que apenas caracteres alfabéticos maiúsculos básicos serão usados (
ABCDEFGHIJKLMNOPQRSTUVWXYZ
). - Se nenhuma ocorrência for encontrada, você poderá gerar qualquer número inteiro, caractere ou nada negativo (por exemplo
-1
,X
). - A entrada pode ser aceita como argumento, em novas linhas, listas ou qualquer outra coisa.
- Isso é código-golfe , então a submissão com a menor quantidade de bytes ganha!
Casos de teste
Input: BHGEFXWFTIUPITHHLPETTTCLOEWOELM, WETTERBERICHT
Output: 13
Input: ABCDEFGHIJKL, HELLO
Output: 0
Input: EEEEEEEEEEEE, HELLO
Output: -1
Input: XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF, DEUTSCHLAND
Output: 11
Input: HKKH, JJJJJ
Output: -1
E
nunca resultaria em umE
. É disso que trata todo esse desafio.Respostas:
Pitão, 14 bytes
Não tenho certeza se isso está ok, mas se a entrada for impossível, nada será gravado em stdout e um erro de divisão zero será gravado em stderr. Aceita a entrada em 2 linhas, a segunda é cercada por aspas.
Explicação:
Experimente aqui!
fonte
JavaScript, 40
Usando
replace
, isso mapeia a entrada de texto sem formatação em uma expressão regular de forma/[^H][^E][^L][^L][^O]/
(por exemplo, para entrada de texto sem formataçãoHELLO
) e depois usasearch
para testar o primeiro índice da substring de texto cifrado que corresponde a essa expressão regular . Essa expressão regular significa "um padrão em que o primeiro caractere não éH
, o segundo caractere não éE
etc."$&
é uma sequência especial parareplace
saída que substitui o valor correspondido pelo primeiroreplace
argumento (nesse caso, cada caractere correspondido por/./
).fonte
$&
! Obrigado por ensinar meu algo hoje.$'
no processo de pesquisar esta resposta, que fornece" a parte da string que precede / segue a substring correspondente "Simulador de máquina de Turing - 15660 bytes (não competindo)
Não pode ter um desafio Enigma sem alterar o código da máquina.
Teste aqui
Breve visão geral:
fonte
SWI-Prolog, 115 bytes
Exemplo de uso:
a(`ABCDEFGHIJKL`,`HELLO`,R).
. Isso usa as seqüências de códigos de caracteres declaradas com backticks. A resposta é unificadaR
. Se nenhuma correspondência for encontrada, isso gerafalse.
.Explicação:
Experimente aqui
fonte
Ruby,
9179 bytesMaldito seja
Enumerator
! Por que eu tenho que converter de string para array em enumerador para array e desperdiçar bytes preciosos? > :(fonte
[*...]
como alternativa de golfe ao #to_a é um toque agradável.CJam,
1716 bytesExperimente aqui .
Agradecemos a @PeterTaylor por salvar um byte.
Explicação:
fonte
array block #
pode economizar um caractere:ll:A,ew{A.=:+!}#
ew
(fazer fatias), tudo o resto segue.MATL , 27 bytes
Exemplos
Explicação
fonte
Haskell, 72 bytes
Uso:
h 0 "DEUTSCHLAND" "XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF"
->11
.Abordagem recursiva simples: se a palavra
w
puder ser colocada no início da strings
, retorne o contador do índicei
e repita comi
incrementado e o final des
. Pare e retorne-1
se o comprimento des
for menor que o comprimento dew
.fonte
Python 2.7, 111 caracteres
Tenta todas as posições iniciais (a) e as verificações de qualquer uma das letras coincidem (usando a compreensão da lista). Ele retorna "None" ("NULL" do Python)) se nada for encontrado (o final do loop for e nada for retornado, o padrão é "None".
Suíte de teste:
fonte
def d(c,s): for a in range(len(c)): if a not in[a+(c+s)[a+i:].index(l)for i,l in enumerate(s)]:return a
Braquilog , 48 bytes
Esta é uma tradução direta da minha resposta do Prolog. O
brachylog_main/2
predicado gerado espera uma lista de duas cadeias de códigos de caracteres com a cadeia codificada primeiro como entrada e retorna o índice como saída, por exemplobrachylog_main([`ABCDEFGHIJKL`,`HELLO`],R).
.Explicação
fonte
Japt, 12 bytes (não competitivo)
Vou precisar de ajuda com este.
fonte
.search
? facepalmUàVr'."[^$&]
12.PHP - 155 bytes
Salve como
crack.php
e execute com os argumentos na linha de comando. Por exemplo:fonte
for($r=-1;$i<strlen($p=$argv[1])-$l=strlen($q=$argv[2]);$i++)if(levenshtein($q,substr($p,$i,$l),2,1,2)==$l&&$r=$i)break;echo"$r↵";
levenshtein
, mas provavelmente uma iteração direta dentro de uma iteração poderia fazê-lo em menos bytes.JavaScript,
129121118119 *118 bytesw
é a mensagem codificada,t
é a sequência de teste. Isso não usa expressões regulares, mas apenas compara letra por letra, deslocando a cadeia de teste (ou seja, "WETTERBERICHT") acrescentando espaço antes dela. Fácil e chato.* o caso de teste sem correspondência não funcionou, agora funciona
fonte
𝔼𝕊𝕄𝕚𝕟, 14 caracteres / 25 bytes
Try it here (Firefox only).
Parabéns a @apsillers pela ideia.
Explicação
fonte
TeaScript, 14 bytes
20Semelhante à solução JavaScript @aspillers inteligente .
Não concorrente, pois utiliza recursos criados após este concurso.
Explicação
fonte
$&
funciona no lugar de${l}
?Ruby,
4336 bytesedit: Interpolação de string dentro de interpolação de string dentro de um regex, caramba.
A abordagem lenta: traduz a palavra para um regex "negativo" - o
=~
operador faz o resto.Teste:
fonte
Python 3 , 79 bytes
Experimente online!
fonte
05AB1E , 14 bytes
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Jolf , 14 bytes
Experimente aqui!
fonte
Perl, 38 + 1 = 39 bytes
onde a entrada se parece:
Essa é a mesma ideia que a javascript.
fonte
Java, 136 caracteres
Solução baseada em Regex inspirada na versão JavaScript dos apsillers .
fonte
Brachylog (v2), 16 bytes
Experimente online!
O Brachylog geralmente é muito bom em falhar ao resolver algo que é impossível.
Este não é um daqueles momentos.
(recebe a entrada como uma lista
[message, word]
. O cabeçalho imprime tudo muito bem, mas a saída do predicado real é apenas um número, se for bem-sucedida)bʰ↙.Plᵐ≥₁∧Pz₁≠ᵐ∧
parece funcionar tão bem para a mesma contagem de bytes.fonte
C ++ (gcc) ,
160153150 bytesExperimente online!
fonte
goto
e sem todos os erros ...Perl 5 , 46 bytes
Usa a ideia de regex do @apsillers.
Experimente online!
fonte