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
ABCDEFGHIJKLMNOPQRSTUVWXYZ
oabcdefghijklmnopqrstuvwxyz
con 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 581005bef7ee76e24c019d076d5b375f
y 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.
prompt
lo 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?Respuestas:
JavaScript (ES6) 312
327 340 372 446Sin 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 queprompt
acepta una sola línea.Prueba en la consola FireFox / FireBug
Entrada: ABCDEFGHI * JKLMNOPQR * STUV * WXYZ * HeLlO WoRlD!
fuente
o
yw
en "Hello world", el OP solo tiene 4C # -
921720Obviamente 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
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
fuente
for(int i=0;i<p.Length; i++)
(cerca del medio)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?Python 2, 180 + 78 + 1 + 3 = 262 caracteres
El programa de 180 bytes (las dos últimas líneas nuevas son pestañas):
Requiere un archivo de 78 bytes llamado 'f' para ser el mismo directorio (+1 byte para nombre de archivo), que contiene lo siguiente:
La codificación base64 del archivo
f
es:El programa sale con una excepción,
2>_
suprime el error (+3 bytes):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.fuente
f
y tres bytes para2>_
Perl 5
-lF
,297 288 261231 bytesPruébalo en línea!
Probablemente todavía hay un poco aquí que podría jugar más golf.
fuente