Cifrado de cifrado Pigpen

11

Cifrado de cifrado Pigpen

Su misión es simple: escribir un programa que recibe texto como entrada y genera una representación ASCII del mismo en Pigpen Cipher .

Entrada

Solo caracteres ASCII (sin Unicode). Debe poder manejar al menos 16384 caracteres y 256 líneas.

Salida

  • Reemplace todos los caracteres que no sean líneas nuevas o en ABCDEFGHIJKLMNOPQRSTUVWXYZo abcdefghijklmnopqrstuvwxyzcon espacios.
  • Sin distinción entre mayúsculas y minúsculas, reemplace cada letra con su forma encriptada (vea la siguiente sección), insertando un espacio final en cada una de las tres líneas después de cada una. Cada carácter codificado es un bloque 3 * 3 del arte ASCII. Reemplazar espacios con 3 * 3 bloques de espacios.
  • Todos los caracteres deben estar en las mismas tres líneas (llame a estas tres líneas una línea de conexión), a menos que haya una nueva línea, que comience una nueva línea de conexión. Deje una línea normal en blanco entre las líneas pigpen

El cifrado

  |       | |       |
 .|       |.|       |.
--+ 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)

Ejemplo

La entrada "hola, mundo" debería producir:

+-+ +-+ |   |   +--         +-- +-- |   --+
| | | | |.  |.  |.      \./ |.  |.  |.    |
| | +-+ +-- +-- +--      V  +-- |   +-- --+

La codificación base64 de lo anterior, con una nueva línea final, está debajo. El md5sum es 6f8ff1fed0cca4dd0492f9728ea02e7b.

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

Sin una nueva línea final, el md5sum es 581005bef7ee76e24c019d076d5b375fy el base64 es:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =

Reglas

  • Las lagunas estándar están prohibidas.
  • Este es el código de golf. El código más corto gana.
  • En idiomas que no pueden aceptar múltiples líneas de entrada a la vez (por ejemplo, JavaScript con prompt()), use *(o algún otro carácter) como separador de línea.

Erranda

  • Al ejemplo le faltaban algunos espacios (un espacio debe consistir en los espacios finales del carácter anterior, si los hay, y sus propios espacios finales). Esto ahora ha sido arreglado.

fuente
1
Recuerdo haber jugado con esto cuando era niño, pero nunca supe el nombre. ¡Gracias!
Geobits
¿Puedo usar una fuente personalizada? :-)
Florian F
@FlorianF No ...
Codificación en javascript. Por promptlo general, se usa para la entrada, pero solo acepta una línea. ¿Podría usar un carácter especial (como '*') para marcar una nueva línea en la entrada?
edc65
@ edc65 Sí, puede

Respuestas:

4

JavaScript (ES6) 312 327 340 372 446

Sin contar el espacio en blanco de sangría y las nuevas líneas , se podría jugar más . Usando un '*' para marcar nuevas líneas en la entrada, ya que promptacepta una sola línea.

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'))

Prueba en la consola FireFox / FireBug

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

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

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

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

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

+-+ +-+ |   |   +--         +-- +-- |   --+    
| | | | |.  |.  |.      \./ |.  |.  |.    |    
| | +-+ +-- +-- +--      V  +-- |   +-- --+      
edc65
fuente
Tienes 5 espacios entre el oy wen "Hello world", el OP solo tiene 4
Claudiu
@Claudiu cada personaje (incluso en blanco, char 32) 3 espacios, separador entre caracteres 1 espacio. 1 + 3 + 1 == 5. Comprobaré con OP
edc65
Sí, definitivamente tiene más sentido con 5. Pensé que quería específicamente 4 como caso especial, ¡pero es bueno que lo hayas preguntado!
Claudiu
3

C # - 921 720

Obviamente no es una entrada ganadora, pero parecía demasiado divertida para pasarla :)

El programa toma la entrada como un solo, luego imprime el pigpen. Para ingresar varias líneas, use un guión bajo (_) como se ve en la salida .

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();}}

Concepto

El cifrado utiliza algunas secuencias de caracteres que se duplican bastante. Por ejemplo, '-' aparece 16 veces y '__' (dos espacios) aparece 20 veces. Reemplazo estas secuencias con símbolos de un solo carácter y las cambio en tiempo de ejecución, reduciendo a la mitad el número de caracteres necesarios para almacenar el cifrado pigpen. Del mismo modo, una nueva línea generalmente requiere dos caracteres, pero se reemplaza por un símbolo (n) y se cambia más tarde.

El programa maneja múltiples líneas de entrada dividiendo la entrada en una matriz donde cada elemento es una sola línea de entrada. El programa simplemente ejecuta el cifrado en cada línea por separado.

Este es mi primer golf en cualquier idioma, por lo que probablemente se pueda hacer mucho para mejorar este código.

Salida

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

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

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /
jrbuchner
fuente
1
No sé C #, pero parece que hay un espacio innecesario en for(int i=0;i<p.Length; i++)(cerca del medio)
Gracias profesorfish, había otro que también me perdí
jrbuchner
1
En m♥lti \n lin♣e \n input, mi teléfono muestra que tiene un corazón en lugar de u en multi, y un club entre la ny la e en línea. ¿Porqué es eso?
Beta Decay
2
@BetaDecay Creo que está destinado a mostrar el manejo de caracteres ASCII bajos
edc65
El corazón y el club se pusieron allí para demostrar el cumplimiento de la regla de los desafíos: reemplazar todos los caracteres que no sean líneas nuevas o en ABCDEFGHIJKLMNOPQRSTUVWXYZ o abcdefghijklmnopqrstuvwxyz con espacios
jrbuchner
2

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

El programa de 180 bytes (las dos últimas líneas nuevas son pestañas):

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

Requiere un archivo de 78 bytes llamado 'f' para ser el mismo directorio (+1 byte para nombre de archivo), que contiene lo siguiente:

$ 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

La codificación base64 del archivo fes:

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

El programa sale con una excepción, 2>_suprime el error (+3 bytes):

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

Explicación :

Creé una tabla de búsqueda L, que es una asignación de {position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}, almacenada en una matriz plana. El programa imprime las letras haciendo una búsqueda simple para cada posición.

Claudiu
fuente
Debe agregar un byte para fy tres bytes para2>_
0

Perl 5 -lF , 297 288 261 231 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''

Pruébalo en línea!

Probablemente todavía hay un poco aquí que podría jugar más golf.

Xcali
fuente