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.
la source
Réponses:
05AB1E , 34 + 12 = 46 octets
Utilise le canal rouge.
05AB1E utilise le codage CP-1252 .
Encoder:
Essayez-le en ligne!
Décoder:
Essayez-le en ligne!
Méthode de remplissage alternative avec nombre d'octets égal
la source
C, 201 (codage) + 175 (décodage) = 376 octets
Pour encoder:
Encode chaque caractère de la chaîne d'entrée dans le canal vert du spectre RVB tout en définissant les deux autres canaux comme des valeurs hexadécimales aléatoires. Prend l'entrée via STDIN sous forme de chaîne et envoie à STDOUT une chaîne multiligne de code de couleur hexadécimal sous la forme d'un carré. En supposant que vous avez installé Python 3 et ImageMagick et que le fichier ci-dessus est compilé dans un fichier nommé
a.out
dans le répertoire de travail actuel (CWD), vous pouvez directement obtenir l'image résultante, nomméeOutput.png
, dans le CWD à partir de la sortie textuelle à l'aide de la commande suivante:Voici un exemple d'image de sortie créée par la commande ci-dessus en utilisant
Programming Puzzles and Code Golf
comme chaîne d'entrée:Pour décoder:
Prend en entrée via STDIN une séquence de chaînes de code de couleur hexadécimales séparées par des espaces, chacune étant placée entre guillemets (
"
) (char** argv
inmain
) et également, lorsqu'elle est appeléemain
,int argc
pour l'entrée entière. Fournit à STDOUT une chaîne simple / multiligne représentant le message décodé.Je vais essayer de jouer au golf au fil du temps quand et où je peux.
En outre, si vous utilisez les deux méthodes dans le même fichier, vous pouvez utiliser la
main
méthode suivante pour tout regrouper avec chaque fonction obtenant les entrées correctes:et en utilisant cela, pour l'encodage, vous devez fournir
E
comme premier argument pour appeler la méthode d'encodage suivie par l'argument de chaîne unique, tandis que pour le décodage, tout ce que vous devez fournir est la séquence de chaînes de code de couleur hexadécimales séparées par des espaces, chacune étant incluse dans guillemets doubles ("
).Enfin, si vous voulez, vous pouvez obtenir le bien préparé, la version prête à utiliser ici le fait, bien qu'il ne soit pas golfed, mais aussi pas émis des avertissements ou des erreurs lors de la compilation.
la source
Python 2,
164160 +9493 = 253 octets1 + 1 octet enregistré grâce à l'assistant de blé.
-5 octets grâce à Kade
Encodeur: la chaîne doit être placée entre guillemets, par exemple
"CodeGolf"
, la sortie est une image PPM ascii couleur.Décodeur: prend le nom du fichier d'entrée comme argument de ligne de commande
Usage:
Exemple:
Programmation de puzzles et de code golf
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. Chez vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. Chez vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
la source
for
int
partir de cela est 4 qui est ensuite+1
édité, donc 5-1
.print
et'
dans le décodeur. Je suis également sûr que vous pourriez faireint((len(s)+1)**.5)
pour économiser quelques octets.' '.join("%d %d %d"
en''.join(3*"%d "
car je suis sûr qu'un espace de fin est OK.Scala, 97 + 68 = 165 octets
Cryptage (97 octets):
Prend une chaîne et répète un itérateur de séquences de nombres entiers.
Décryptage (68 octets):
Prend un itérateur de séquences de nombres entiers et renvoie une chaîne.
Explication:
.
la source
Perl, (103 + 1) + (36 + 2) = 142 octets
L'encodeur de texte en image (exécuté avec
-p
pour une pénalité de 1 octet;-p0
(pour un octet supplémentaire de pénalités) est nécessaire si vous souhaitez gérer les retours à la ligne dans la chaîne d'entrée):Décodeur image vers texte (exécuté avec
-p0
une pénalité de 2 octets):Celui-ci utilise le
#abcdef
format d'image textuelle et encode dans le canal bleu. Voici un exemple d'une sortie possible donnéeProgramming Puzzles and Code Golf
en entrée:Explication de l'encodeur:
J'étais vraiment content de cette utilisation de
\K
travaillé; il spécifie où remplacer, et en le plaçant dans une boucle, il semble que l'occurrence sur la dernière itération de la boucle soit ce qui compte. Doncs/(.*?\K,){$a}/\n/g
, correspondra à une chaîne de longueur minimale de la forme quoi que ce soit virgule quoi que ce soit virgule ... tout virgule, qui a des$a
virgules, mais la partie remplacée réelle de la correspondance sera simplement la dernière virgule. Cela a pour effet de remplacer chaque$a
e virgule par une nouvelle ligne, ce qui nous donne la forme carrée de l'image.Le grand avantage de Perl pour ce défi (autre que le convertisseur chaîne de caractères-hexadécimal intégré, qui était incroyablement pratique) est qu'il a un décodeur très court (si court, en fait, que même si Perl a une fonction intégrée pour conversion hexadécimale en chaîne, il était plus court de ne pas l'utiliser). Voici comment ça fonctionne:
Les seules instances de deux caractères juste avant un caractère non alphanumérique sont les canaux bleus (que nous voulons décompresser), qui apparaissent juste avant les virgules et les retours à la ligne; et les deux caractères qui apparaissent l'un devant l'
#
autre que le premier. Nous ne voulons pas de cette dernière catégorie de matchs, mais ils chevauchent inévitablement l'ancienne catégorie, et seront donc exclus par la vérification des matches qui se chevauchent.la source
MySQL, 438 + 237 = 675 octets
Il y a une nouvelle ligne à la fin de la sortie, mais elle n'apparaît pas après avoir été déchiffrée. La fonction hexadécimale (surcharge d'entier) couperait les 0 en tête, donc je devais la remplir avec une chaîne 0. Je pourrais économiser quelques octets si je pouvais déclarer les deux fonctions entre les délimiteurs.
Crypter
Déchiffrer
Usage:
la source
C #, 312 + 142 = 454 octets
Codage:
Décodage:
Programme complet:
la source
Mathematica, 111 + 65 = 176 octets
Encodeur
Décodeur
la source
Transformation,
220209194 +171167151 =391380376361345 octetsMise à jour:
Supprimé inutile
noStroke()
et rendu les deux boucles pour un-déclaration.Supprimé inutile
image(p,0,0);
, a donné au décrypteur le nom de fichier comme paramètreAlgorithme de cryptage
Appel de la fonction:
g("Programming Puzzles and Code Golf");
Il s'agit d'une fonction qui prend une chaîne et crée la sortie avant de l'enregistrer sous
t.png
. Il utilise lered
valeur pour stocker le texte masqué.Algorithme de déchiffrement
Fonction d'appel par:
u(file_name);
Il s'agit également d'une fonction qui recherche l'image spécifiée par le paramètre, puis génère la chaîne masquée (car elle est plus courte que le renvoi d'une chaîne).
Code développé
(Algorithme de cryptage)
La chaîne est passée lorsque la fonction est appelée. La première ligne de la fonction calcule la longueur du côté du carré en prenant la
ceil
racine carrée. Ensuite, nous entrons dans une boucle for, où nous définissons lastroke
(la couleur du bord) pour que la valeur ASCII du caractère soit rouge et des valeurs aléatoires pour le bleu et le vert. Après cela, nous créons unrect
(rectangle) avec width =1
et height =1
, c'est-à-dire un pixel (pour une raison étrange, je ne peux pas l'utiliserpoint
correctement). Dans la dernière ligne, l'image résultante est ensuite enregistrée soust.png
.(Algorithme de décryptage)
Cette fonction a le nom du fichier comme paramètre (sous forme de chaîne). Ensuite, l'image dans le fichier est stockée dans une variable pour être utilisée ultérieurement. Après avoir terminé avec cela, nous définissons la chaîne au
""
lieu de créer une nouvelle chaîne juste pour contenir la chaîne masquée. Ensuite, nous parcourons l'image via deux boucles for imbriquées, et nous ajoutons à la chaîne la valeur de caractère de la valeur rouge du pixel. Enfin, nous imprimons la chaîne résultante après en avoir supprimé les espaces de tête (à l'aide d'une expression régulière). La raison pour laquelle nous imprimons le texte masqué au lieu de le renvoyer est que, de cette façon, il est plus court et nous économisons des octets.Texte brut de défi chiffré:
la source
Jelly, 40 + 20 = 60 octets dans la page de codes de Jelly
Encodeur (texte → image):
Essayez-le en ligne!
Décodeur (image → texte):
Essayez-le en ligne!
Un exemple de sortie que le programme pourrait produire (il stocke des informations dans le canal rouge):
Dans ces défis plus importants, la lacune de Jelly commence à diminuer un peu, nécessitant plusieurs caractères "structurels" pour résoudre les ambiguïtés d'analyse, mais elle est néanmoins toujours très laconique. Voici comment fonctionne l'encodeur:
Et voici comment fonctionne le décodeur:
la source