Carrés stéganographiques
Votre travail consiste à prendre une chaîne et à générer une NxN
image qui représente cette chaîne. Vous devez également écrire l'algorithme qui prend l'image et la transforme également en chaîne. Le score sera comprendra le nombre d'octets des deux algorithmes:
Algorithme de "chiffrement" + algorithme de "déchiffrement" .
Vous devez publier chacun séparément, avec des nombres d'octets pour les algorithmes de chiffrement et de déchiffrement affichés individuellement.
Exemple d'algorithme
Par exemple, voici les "Puzzles de programmation et Golf de code" utilisant un algorithme stéganographique simple basé sur ASCII dans le canal bleu:
#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
Vous pouvez voir que le canal bleu contient simplement les valeurs ascii pour cette image:
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( )
Alors que le reste des canaux contiennent des valeurs générées aléatoirement pour "pimenter" la variété de couleurs dans l'image. Lorsque vous retirez le message de l'image, nous pouvons simplement ignorer les autres valeurs de canal et tirer le bit hexadécimal dans le canal bleu, reconstruisant la chaîne:
"Programming Puzzles and Code Golf"
Notez que les espaces qui ont été utilisés pour remplir la chaîne dans le carré ne sont pas inclus dans la sortie décryptée finale. Bien que vous deviez remplir la chaîne dans l'image, vous pouvez supposer que la chaîne d'entrée ne se terminera pas par des espaces.
Règles
- Vous devez encoder 1 caractère par pixel, le canal choisi pour encoder le caractère est arbitraire.
- Les canaux des autres couleurs RVB doivent être randomisés, autre que celui dans lequel vous choisissez d'encoder la chaîne; cela signifie que vos canaux finaux non codés devraient être compris entre
0x0000-0xFFFF
(choisis au hasard). - L'expression du résultat final sous la forme d'un tableau 2D de valeurs de couleur RVB est très bien
0x000000-0xFFFFFF
, pas besoin d'utiliser la création d'image sauf si vous voulez vous amuser avec elle ou si c'est moins d'octets. Si vous choisissez de sortir sous forme de chaînes hexadécimales, préfixez la chaîne hexadécimale avec#
EG#FFFFFF
ou#05AB1E
. Vous pouvez vous séparer avec des tabulations, des virgules ou toute autre chose qui serait sensée horizontalement, mais elle doit conserver le motif carré; en d'autres termes, vous devez utiliser une séparation de nouvelle ligne appropriée. - La sortie doit être dans un carré et la chaîne doit être complétée par des espaces à la fin pour s'adapter à cela. Cela veut dire que
N≈SQRT(Input#Length())
. Si la longueur d'entrée n'est pas un carré parfait, vous devez arrondirN
et remplir avec des espaces. - Comme indiqué précédemment, si vous remplissez avec des espaces dans l'image, vous ne devez pas inclure les caractères remplis dans la sortie finale "décryptée".
- Vous pouvez supposer que:
- La chaîne d'entrée ne se terminera pas par des espaces.
- La chaîne d'entrée n'utilisera que des caractères ASCII imprimables.
- Il s'agit du code-golf , le nombre d'octets le plus bas gagne.