Quadrati Steganografici
Il tuo compito è prendere una stringa e generare NxN
un'immagine che rappresenti questa stringa. Devi anche scrivere l'algoritmo che riprende l'immagine e la trasforma anche in una stringa. Il punteggio includerà il conteggio dei byte di entrambi gli algoritmi:
Algoritmo "Crittografia" + Algoritmo "Decrittazione" .
È necessario pubblicarli separatamente, con conteggi dei byte per gli algoritmi di crittografia e decrittografia visualizzati singolarmente.
Algoritmo di esempio
Ad esempio, ecco il "Puzzle di programmazione e Code Golf" che utilizza un semplice algoritmo steganografico basato su ASCII nel canale Blue:
#2e7250,#6ea972,#04eb6f,#0fc767,#74ab72,#ee6161
#b73b6d,#1aae6d,#f37169,#bda56e,#1fe367,#e99620
#706450,#0d3575,#146b7a,#4ea47a,#2a856c,#95d065
#3f2d73,#cef720,#bab661,#d1b86e,#f22564,#12b820
#0f3d43,#c86e6f,#1ee864,#a66565,#247c20,#c3bb47
#0e296f,#89d46c,#585b66,#c08f20,#455c20,#136f20
Puoi vedere che il canale blu contiene semplicemente i valori ASCII per questa immagine:
50 = 80(P) 72 = 114(r) 6f = 111(o) 67 = 103(g) 72 = 114(r) 61 = 97(a)
6d = 109(m) 6d = 109(m) 69 = 105(i) 6e = 110(n) 67 = 103(g) 20 = 32( )
50 = 80(P) 75 = 117(u) 7a = 122(z) 7a = 122(z) 6c = 108(l) 65 = 101(e)
73 = 115(s) 20 = 32( ) 61 = 97(a) 6e = 110(n) 64 = 100(d) 20 = 32( )
43 = 67(C) 6f = 111(o) 64 = 100(d) 65 = 101(e) 20 = 32( ) 47 = 71(G)
6f = 111(o) 6c = 108(l) 66 = 102(f) 20 = 32( ) 20 = 32( ) 20 = 32( )
Mentre il resto dei canali contiene valori generati casualmente per "ravvivare" la varietà di colori nell'immagine. Quando si estrae il messaggio dall'immagine, possiamo semplicemente ignorare gli altri valori del canale e tirare il bit esadecimale nel canale blu, ricostruendo la stringa:
"Programming Puzzles and Code Golf"
Notare che gli spazi utilizzati per riempire la stringa nel quadrato non sono inclusi nell'output decrittografato finale. Mentre devi riempire la stringa nell'immagine, puoi supporre che la stringa di input non finisca con spazi.
Regole
- Devi codificare 1 carattere per pixel, il canale scelto per codificare il carattere è arbitrario.
- I canali degli altri colori RGB devono essere randomizzati, diversi da quello in cui si sceglie di codificare la stringa; questo significa che i tuoi canali finali non codificati dovrebbero essere tra
0x0000-0xFFFF
(scelti casualmente). - Esprimere il risultato finale come una matrice 2D di valori di colore RGB va bene
0x000000-0xFFFFFF
, non è necessario utilizzare la creazione di immagini a meno che non si desideri divertirsi con esso o se è meno byte. Se si sceglie di generare come stringhe esadecimali, aggiungere il prefisso alla stringa esadecimale con#
EG#FFFFFF
o#05AB1E
. È possibile separare con schede, virgole o qualsiasi altra cosa che sia sensibile in senso orizzontale, ma deve mantenere il modello quadrato; in altre parole, è necessario utilizzare la separazione newline appropriata. - L'output deve essere in un quadrato e la stringa deve essere riempita con spazi alla fine per adattarlo. Questo significa che
N≈SQRT(Input#Length())
. Se la lunghezza dell'input non è un quadrato perfetto, è necessario arrotondareN
e riempire con gli spazi. - Come affermato in precedenza, se si esegue il riempimento con spazi nell'immagine, non è necessario includere i caratteri imbottiti nell'output finale "decrittografato".
- Puoi presumere che:
- La stringa di input non terminerà con spazi.
- La stringa di input utilizzerà solo caratteri ASCII stampabili.
- Questo è code-golf , vince il conteggio di byte più basso.