Escreva dois programas:
- Um que leia uma string e uma chave e codifique a string em uma cifra de cerca de trilho usando essa chave. - Da mesma forma, escreva um programa para a função reversa: decifrar uma cerca de trilho usando uma chave.
Para quem não sabe o que é a cifra da cerca de trilho, é basicamente um método de escrever texto sem formatação, de maneira a criar um padrão linear de maneira espiralada. Exemplo - quando "FOOBARBAZQUX" cercou o trilho usando a chave 3.
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
Lendo a espiral acima, linha por linha, o texto cifrado se torna "FAZOBRAQXOBU".
Leia mais em - Cifra de cerca de trilho - Wikipedia .
Código em qualquer idioma é bem-vindo.
A resposta mais curta em bytes vence.
code-golf
cryptography
cipher
ShuklaSannidhya
fonte
fonte
Respostas:
Python 133 bytes
Uso da amostra:
Nota: os resultados das contagens iguais de trilhos são diferentes dos do código que você forneceu, mas eles parecem estar corretos. Por exemplo, 6 trilhos:
corresponde a
AKUBJLTVCIMSWDHNRXEGOQYFPZ
, e nãoAKUTBLVJICMSWXRDNHQYEOGZFP
como o seu código produz.A idéia básica é que cada trilho possa ser encontrado diretamente, usando fatias de cadeia
[i::m]
, ondei
está o número do trilho (0
-indexado) em
é(num_rails - 1)*2
. Além disso, os trilhos internos precisam ser entrelaçados[m-i::m]
, conseguidos fechando e juntando os dois conjuntos de caracteres. Como o segundo deles pode ser potencialmente um caractere mais curto,ele é preenchido com um caractere que supostamente não aparece em lugar nenhum (, é convertido em uma lista e preenchido com uma string vazia._
) e, em seguida, esse caractere é retirado, se necessárioUma forma legível um pouco mais humana:
fonte
APL
5241Se a sequência de texto de entrada ie o número da chave n forem pré-inicializados, a solução poderá ser reduzida em 9 caracteres. A execução da solução nos exemplos fornecidos pelo primo fornece respostas idênticas:
Em uma reflexão mais detalhada, parece haver uma solução mais curta baseada em índice:
fonte
Python 2 , 124 + 179 = 303 bytes
Codificar:
Experimente online!
Decodificar:
Experimente online!
fonte
MATL, 70 bytes (total)
Experimente no MATL Online
Experimente vários casos de teste
Toma uma bandeira como terceira entrada,
F
para codificar a string,T
decifrá-la (obrigado a Kevin Cruijssen por essa ideia).Isso começou como uma resposta de Julia até que eu percebi que a digitação estrita atrapalhava demais, especialmente para decifração. Aqui está o código Julia que eu tinha para codificação (com suporte para v0.6 para TIO):
Julia 0,6 , 191 bytes
Experimente online!
Explicação:
A operação da cerca do trilho
pode ser visto como lendo r = 3 caracteres de entrada, depois lendo r-2 e prefixando e sufixando valores dummy (nulos), depois lendo r caracteres novamente etc., criando uma nova coluna sempre:
depois, inverta cada segunda coluna (já que a parte zag do ziguezague sobe em vez de para baixo, o que faz diferença quando r> 3), depois lê essa matriz ao longo das linhas e remove os caracteres fictícios.
A decifração não parecia ter padrões óbvios como esse, mas, ao pesquisar sobre isso, me deparei com este post , que me dizia que (a) esse era um algoritmo bem conhecido e (possivelmente?) Publicado para cifras ferroviárias e ( b) decifração era uma simples reutilização do mesmo método, fornecendo os índices da string e obtendo os índices desses índices após a codificação, e lendo o texto cifrado nesses locais.
Como a decifração precisa fazer as coisas trabalhando em índices, esse código também codifica, classificando os índices da string e, nesse caso, apenas indexando esses índices reorganizados.
fonte
Eu quero ser explicado neste código.
fonte
Java 10,
459451445439327 bytes-12 bytes graças a @ceilingcat .
-112 bytes combinando as duas funções com um sinalizador de modo adicional como entrada.
A função recebe uma terceira entrada
M
. Se étrue
isso, ele irá criptografar e, se for,false
ele decifrará.Experimente online.
Explicação:
fonte