Criptografia de cifra Pigpen
Sua missão é simples: escrever um programa que receba texto como entrada e produza uma representação ASCII na Cifra Pigpen .
Entrada
Caracteres somente ASCII (sem Unicode). Você deve poder manipular pelo menos 16384 caracteres e 256 linhas.
Resultado
- Substitua todos os caracteres que não são novas linhas ou em
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ouabcdefghijklmnopqrstuvwxyz
com espaços. - Sem distinção entre maiúsculas e minúsculas, substitua cada letra pelo formato criptografado (consulte a próxima seção), inserindo um espaço à direita em cada uma das três linhas após cada uma. Cada caractere codificado é um bloco 3 * 3 da arte ASCII. Substitua espaços por 3 * 3 blocos de espaços.
- Todos os caracteres devem estar nas mesmas três linhas (chame essas três linhas de linha de pigpen), a menos que exista uma nova linha, que inicie uma nova linha de pigpen. Deixe uma linha normal em branco entre as linhas do pigpen.
The Cipher
| | | |
.| |.| |.
--+ for J +-+ for K +-- for L
--+ +-+ +--
.| |.| |.
--+ for M +-+ for N +-- for O
--+ +-+ +--
.| |.| |.
| for P | | for Q | for R
(ABCDEFGHI are the same as JKLMNOPQR, but with the . replaced by a space)
\./
V for W (note the row of 3 spaces on the top)
^
/.\ for Z (note the 3 spaces on the bottom)
\
.>
/ for X (note the leading spaces)
/
<.
\ for Y (note extra trailing spaces)
(STUV are like WXYZ, but with the . replaced by a space)
Exemplo
A entrada "hEllo, wORLd" deve produzir:
+-+ +-+ | | +-- +-- +-- | --+
| | | | |. |. |. \./ |. |. |. |
| | +-+ +-- +-- +-- V +-- | +-- --+
A codificação base64 acima, com uma nova linha à direita, está abaixo. O md5sum é 6f8ff1fed0cca4dd0492f9728ea02e7b
.
Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK
Sem uma nova linha à direita, o md5sum é 581005bef7ee76e24c019d076d5b375f
e a base64 é:
Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =
Regras
- As brechas padrão são proibidas.
- Isso é código de golfe. O menor código vence.
- Em idiomas que não podem aceitar várias linhas de entrada por vez (por exemplo, com JavaScript
prompt()
), use*
(ou algum outro caractere) como um separador de linhas.
Erranda
- O exemplo estava faltando alguns espaços (um espaço deve consistir nos espaços finais do caractere anterior, se houver, em si e em seus próprios espaços finais). Isso foi consertado agora.
prompt
é usado para entrada, mas aceita apenas uma única linha. Eu poderia usar um caractere especial (como '*') para marcar uma nova linha na entrada ?.Respostas:
JavaScript (ES6) 312
327 340 372 446Sem contar o espaço em branco e as linhas de recuo
- poderia ser mais jogado. Usando um '*' para marcar novas linhas na entrada, comoprompt
aceita uma única linha.Teste no console do FireFox / FireBug
Entrada: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!
fonte
o
ew
no "Olá mundo", o OP tem apenas 4C # -
921720Obviamente, não é uma entrada vencedora, mas isso parecia muito divertido de passar :)
O programa recebe a entrada como um único e depois imprime o pigpen. Para inserir várias linhas, use um sublinhado (_) como visto na saída .
Código
Conceito
A cifra usa algumas seqüências de caracteres duplicadas um pouco. Por exemplo, '-' aparece 16 vezes e '__' (dois espaços) aparece 20 vezes. Substituo essas seqüências por símbolos de um caractere e as troco em tempo de execução, cortando o número de caracteres necessários para armazenar a cifra de porco. Da mesma forma, uma nova linha geralmente requer dois caracteres, mas é substituída por um símbolo (n) e trocada posteriormente.
O programa lida com várias linhas de entrada dividindo a entrada em uma matriz em que cada elemento é uma única linha de entrada. O programa simplesmente executa a cifra em cada linha separadamente.
Este é o meu primeiro golfe em qualquer idioma, portanto, provavelmente há muito que pode ser feito para melhorar esse código.
Resultado
fonte
for(int i=0;i<p.Length; i++)
(perto do meio)m♥lti \n lin♣e \n input
, meu telefone mostra isso como tendo um coração em vez de você no multi e um clube entre o n e o e na fila. Por que é que?Python 2, 180 + 78 + 1 + 3 = 262 caracteres
O programa de 180 bytes (as duas últimas linhas novas são guias):
Requer um arquivo de 78 bytes chamado 'f' para o mesmo diretório (+1 byte para o nome do arquivo), que contém o seguinte:
A codificação base64 do arquivo
f
é:O programa sai com uma exceção,
2>_
suprime o erro (+3 bytes):Explicação :
Criei uma tabela de consulta,
L
que é um mapeamento de{position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}
, armazenada em uma matriz plana. O programa imprime as letras fazendo uma pesquisa simples para cada posição.fonte
f
e três bytes para2>_
Perl 5
-lF
,297288261123bytesExperimente online!
Provavelmente ainda há um pouco aqui que poderia ser jogado ainda mais.
fonte