Criptografia de cifra Pigpen

11

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 ABCDEFGHIJKLMNOPQRSTUVWXYZou abcdefghijklmnopqrstuvwxyzcom 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 é 581005bef7ee76e24c019d076d5b375fe 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.

fonte
11
Lembro-me de brincar com isso quando criança, mas nunca soube o nome dela. Obrigado!
Geobits
Posso usar uma fonte personalizada? :-)
Florian F
@FlorianF No ...
Codificação em javascript. Geralmente prompté usado para entrada, mas aceita apenas uma única linha. Eu poderia usar um caractere especial (como '*') para marcar uma nova linha na entrada ?.
edc65
@ edc65 Sim, você pode

Respostas:

4

JavaScript (ES6) 312 327 340 372 446

Sem contar o espaço em branco e as linhas de recuo - poderia ser mais jogado . Usando um '*' para marcar novas linhas na entrada, como promptaceita uma única linha.

console.log(prompt().split('*').map(s=>
  [0,1,2].map(r=>
  [...s].map(c=>o+=n+
    '   \\1/ \\ /1\\ /  V  ^  1><1 --++-++-- 1||1||1 '.substr(
    (c=(32|c.charCodeAt())-97)<0|c>25?0:c<18
     ?27+3*'330441552030141252033144255'[f=8,c%9*3+r]
     :3*'482630015274'[f=21,c%4*3+r],3,n=' ')
  .replace(1,' .'[r&c>f])
  ,n='\n'),o=''
)&&o).join('\n'))

Teste no console do FireFox / FireBug

Entrada: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!

  | | | |   --+ +-+ +-- --+ +-+ +--
  | | | |     | | | |     | | | |  
--+ +-+ +-- --+ +-+ +--   | | | |  

  | | | |   --+ +-+ +-- --+ +-+ +--
 .| |.| |.   .| |.| |.   .| |.| |. 
--+ +-+ +-- --+ +-+ +--   | | | |  

     \   /   ^ 
\ /   > <   / \
 V   /   \     

     \   /   ^ 
\./  .> <.  /.\
 V   /   \     

+-+ +-+ |   |   +--         +-- +-- |   --+    
| | | | |.  |.  |.      \./ |.  |.  |.    |    
| | +-+ +-- +-- +--      V  +-- |   +-- --+      
edc65
fonte
Você tem 5 espaços entre oe wno "Olá mundo", o OP tem apenas 4
Claudiu
@ Claudiu cada caractere (mesmo em branco, caractere 32) 3 espaços, separador entre caracteres 1 espaço. 1 + 3 + 1 == 5. Vou verificar com OP
edc65 15/09/14
Sim, definitivamente faz mais sentido com 5. Pensei que ele quisesse especificamente o 4 como um caso especial, mas foi bom você ter perguntado!
Claudiu
3

C # - 921 720

Obviamente, 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

using System;class P{static void Main(){
int i,y,j,k,w,z;string[]g=Console.ReadLine().ToLower().Split('_');
var d="_________  |b .|b--+_| |b|.|b+-+_|  b|. b+--_--+b .|b--+_+-+b|.|b+-+_+--b|. b+--_--+b .|b  |_+-+b|.|b| |_+--b|. b|  _____   b\\./b v _ \\ b .>b / _ / b<. b \\ _ ^ b/.\\b   _  b  b  ".Replace('b','\n').Split('_');
for(i=0;i<d.Length;i++){if(d[i]==""){d[i]=i<17?d[i+9]:d[i+4];d[i]=d[i].Replace('.',' ');}}
for(y=0;y<g.Length;y++){string o="",s,e=g[y];var r=new string[z=e.Length][];
for(i=0;i<z;i++){if(e[i]-97<0|e[i]-97>25)e=e.Replace(e[i],'{');
o+=d[e[i]-97]+'_';r[i]=(o.Split('_')[i].Split('\n'));}
for(j=0;j<3;j++)for(k=0;k<(w=r.Length);k++){
s=r[k][j];Console.Write(k==w-1?s+'\n':s+' ');}}
Console.ReadLine();}}

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

hEllo,wORLd
+-+ +-+ |   |   +--        +-- +-- |   --+
| | | | |.  |.  |.     \./ |.  |.  |.    |
| | +-+ +-- +-- +--     v  +-- |   +-- --+

code_golf
|   +-- --+ +-+
|   |.    | | |
+-- +-- --+ +-+
--+ +-- |   +--
  | |.  |.  |
  | +-- +-- +--

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /
jrbuchner
fonte
11
Eu não sei C #, mas parece haver um espaço desnecessário em for(int i=0;i<p.Length; i++)(perto do meio)
Graças professorfish, houve um outro eu perdi bem
jrbuchner
11
Em 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?
Beta Decay
2
@BetaDecay Eu acho que se destina, para mostrar a manipulação de caracteres ASCII baixos
edc65
O coração eo clube foram colocados lá para demonstrar a conformidade com a regra dos desafios: Substituir todos os caracteres que não são novas linhas ou em ABCDEFGHIJKLMNOPQRSTUVWXYZ ou abcdefghijklmnopqrstuvwxyz com espaços
jrbuchner
2

Python 2, 180 + 78 + 1 + 3 = 262 caracteres

O programa de 180 bytes (as duas últimas linhas novas são guias):

L=open('f','rb').read().decode('zip')
while 1:
 n=raw_input()
 for s in(0,3,6):
    for c in n:w=ord(c.lower())-97;print''.join(L[w+(s+i)*26]for i in(0,1,2))if-1<w<27 else'  ',
    print

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:

$ hexdump f
0000000 9c78 a853 d1a9 d6d5 2206 3805 0103 c174
0000010 c100 8b88 07d1 9ae1 051a 4ab0 385d ae03
0000020 2803 8a82 3a80 406c ae18 0f42 6006 0c1c
0000030 0a2d 31fa 6076 ee8c a030 0e14 2987 8428
0000040 7501 3080 c39a 5a10 0014 21c7 7333
000004e

A codificação base64 do arquivo fé:

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

O programa sai com uma exceção, 2>_suprime o erro (+3 bytes):

$ echo "hEllo,wORLd" | python pigpen.py 2>_| ./md5.py
7ed49b7013a30cc3e84aa807f6585325

Explicação :

Criei uma tabela de consulta, Lque é 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.

Claudiu
fonte
Você deve adicionar um byte fe três bytes para2>_
0

Perl 5 -lF , 297288261123 bytes

$,=$";$_=' .||.||. ';chomp@F;map{@r=/.../g;say map{/[a-z]/i?$r[-65+ord uc]:$"x3}@F}(y/./ /r.y/.| /-+-/r x2)x2 .'    \\  /  ^ 'x2,y/./ /r x3 .$_ x3 .'\\ /  ><  / \\\\./ .><. /.\\',(y/.| /-+-/r x2 .y/./ /r)x2 .' V  /  \\    'x2;say''

Experimente online!

Provavelmente ainda há um pouco aqui que poderia ser jogado ainda mais.

Xcali
fonte