Crittografia crittografia Pigpen


11

Crittografia crittografia Pigpen

La tua missione è semplice: scrivere un programma che riceve il testo come input e ne genera una rappresentazione ASCII nel Pigpen Cipher .

Ingresso

Caratteri solo ASCII (no Unicode). Devi essere in grado di gestire almeno 16384 caratteri e 256 righe.

Produzione

  • Sostituisci tutti i caratteri che non sono nuove righe o in ABCDEFGHIJKLMNOPQRSTUVWXYZo abcdefghijklmnopqrstuvwxyzcon spazi.
  • Indifferentemente dal maiuscolo / minuscolo, sostituisci ogni lettera con la sua forma crittografata (vedi la sezione successiva), inserendo uno spazio finale su ciascuna delle tre righe dopo ciascuna. Ogni carattere codificato è un blocco 3 * 3 di arte ASCII. Sostituisci gli spazi con 3 * 3 blocchi di spazi.
  • Tutti i personaggi dovrebbero essere sulle stesse tre linee (chiamate queste tre linee una linea pigpen), a meno che non ci sia una nuova linea, che inizia una nuova linea pigpen. Lasciare vuota una linea normale tra le linee del porcile.

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)

Esempio

L'input "hEllo, wORLd" dovrebbe produrre:

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

La codifica base64 di quanto sopra, con una nuova riga finale, è al di sotto. Il md5sum è 6f8ff1fed0cca4dd0492f9728ea02e7b.

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8
LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW
ICArLS0gfCAgICstLSAtLSsK

Senza una nuova riga finale, il md5sum è 581005bef7ee76e24c019d076d5b375fe il base64 è:

Ky0rICstKyB8ICAgfCAgICstLSAgICAgICAgICstLSArLS0gfCAgIC0tKwp8IHwgfCB8IHwuICB8

LiAgfC4gICAgICBcLi8gfC4gIHwuICB8LiAgICB8CnwgfCArLSsgKy0tICstLSArLS0gICAgICBW ICArLS0gfCAgICstLSAtLSs =

Regole

  • Sono vietate le scappatoie standard .
  • Questo è il codice golf. Il codice più corto vince.
  • Nelle lingue che non possono accettare più righe di input alla volta (ad es. JavaScript con prompt()), utilizzare *(o qualche altro carattere) come separatore di riga.

Erranda

  • Nell'esempio mancavano alcuni spazi (uno spazio dovrebbe essere costituito dagli spazi finali del personaggio precedente, se presente, e dai propri spazi finali). Questo è stato risolto.

1
Ricordo di aver giocato con questo da bambino, ma non ne ho mai saputo il nome. Grazie!
Geobits,

Posso usare un carattere personalizzato? :-)
Florian F

@FlorianF No ...

Codifica in JavaScript. Di solito promptviene utilizzato per l'input, ma accetta solo una riga. Potrei usare un carattere speciale (come '*') per contrassegnare una nuova riga in input ?.
edc65,

@ edc65 Sì, puoi

Risposte:


4

JavaScript (ES6) 312 327 340 372 446

Senza contare il rientro degli spazi bianchi e delle nuove righe , si potrebbe giocare di più . Usando un '*' per contrassegnare nuove righe in input, poiché promptaccetta una sola riga.

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

Test nella console FireFox / FireBug

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

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

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

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

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

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

Hai 5 spazi tra il oe win "Hello world", l'OP ne ha solo 4
Claudiu

@Claudiu ogni carattere (anche vuoto, carattere 32) 3 spazi, separatore tra caratteri 1 spazio. 1 + 3 + 1 == 5.
Verificherò

Sì, ha decisamente più senso con 5. Ho pensato che volesse specificamente 4 come caso speciale, ma buona cosa che hai chiesto!
Claudiu,

3

C # - 921 720

Ovviamente non è una voce vincente, ma sembrava troppo divertente per passare :)

Il programma accetta l'input come singolo, quindi stampa il porcile. Per inserire più righe, utilizzare un trattino basso (_) come mostrato nell'output .

Codice

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

Concetto

Il codice usa alcune sequenze di caratteri che vengono duplicate abbastanza. Ad esempio, "-" viene visualizzato 16 volte e "__" (due spazi) viene visualizzato 20 volte. Sostituisco queste sequenze con simboli a carattere singolo e le spengo in fase di esecuzione, riducendo della metà il numero di caratteri necessari per memorizzare la cifra del pigpen. Allo stesso modo, una nuova riga di solito richiede due caratteri, ma viene sostituita da un simbolo (n) e disattivata in seguito.

Il programma gestisce più righe di input suddividendo l'input in un array in cui ogni elemento è una singola riga di input. Il programma quindi esegue semplicemente la cifra su ciascuna riga separatamente.

Questo è il mio primo golf in qualsiasi lingua, quindi probabilmente c'è molto da fare per migliorare questo codice.

Produzione

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

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

multi_line_input
--+  /  |    \  +--
 .| <   |.    > |
--+  \  +--  /  |
|   +-- +-+ +-+
|.  |   |.| | |
+-- |   +-+ +-+
+-- +-+ --+  /   \
|   |.|  .| <     >
|   +-+   |  \   /

1
Non conosco C #, ma sembra che ci sia uno spazio non necessario in for(int i=0;i<p.Length; i++)(vicino alla metà)

Grazie professorfish, ce
n'era

1
In m♥lti \n lin♣e \n input, il mio telefono lo rende come avere un cuore invece di te in multi, e un club tra la n e la e in linea. Perché?
Decadimento beta

2
@BetaDecay Penso che sia destinato, per mostrare la gestione di caratteri ASCII bassi
edc65

Il cuore e il club sono stati messi lì per dimostrare il rispetto della regola delle sfide: sostituire tutti i personaggi che non sono nuove linee o in ABCDEFGHIJKLMNOPQRSTUVWXYZ o abcdefghijklmnopqrstuvwxyz con spazi
jrbuchner

2

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

Il programma a 180 byte (le ultime due nuove righe sono schede):

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

Richiede che un file a 78 byte chiamato 'f' sia la stessa directory (+1 byte per il nome file), che contiene quanto segue:

$ 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 codifica base64 del file fè:

eJxTqKnR1dYGIgU4AwF0wQDBiIvRB+GaGgWwSl04A64DKIKKgDpsQBiuQg8GYBwMLQr6MXZgjO4w
oBQOhykohAF1gDCawxBaFADHITNz

Il programma esce con un'eccezione, 2>_elimina l'errore (+3 byte):

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

Spiegazione :

Ho creato una tabella di consultazione L, che è una mappatura di {position_in_3x3_block: {letter_being_encrypted: symbol_for_letter_at_position}}, memorizzata in una matrice piatta. Il programma stampa le lettere facendo una semplice ricerca per ogni posizione.


È necessario aggiungere un byte per fe tre byte per2>_

0

Perl 5 -lF , 297 288 261 231 byte

$,=$";$_=' .||.||. ';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''

Provalo online!

Probabilmente c'è ancora un po 'qui che potrebbe essere ulteriormente giocato a golf.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.