Steganographische Quadrate
Ihre Aufgabe ist es, eine Zeichenfolge aufzunehmen und ein NxN
Bild zu generieren , das diese Zeichenfolge darstellt. Sie müssen auch den Algorithmus schreiben, der das Bild aufnimmt und es wieder in eine Zeichenfolge umwandelt. Die Bewertung wird die Anzahl der Bytes beider Algorithmen beinhalten:
Algorithmus "Verschlüsselung" + Algorithmus "Entschlüsselung" .
Sie sollten jedes einzeln veröffentlichen, wobei die Byteanzahl sowohl für die Verschlüsselungs- als auch für die Entschlüsselungsalgorithmen einzeln angezeigt wird.
Beispielalgorithmus
Hier ist zum Beispiel das "Programmieren von Rätseln und Code Golf" mit einem einfachen ASCII-basierten steganografischen Algorithmus im blauen Kanal:
#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
Sie können sehen, dass der blaue Kanal einfach die ASCII-Werte für dieses Bild enthält:
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( )
Während der Rest der Kanäle zufällig generierte Werte enthält, wird die Vielfalt der Farben im Bild "aufgepeppt". Wenn Sie die Nachricht wieder aus dem Bild ziehen, können Sie einfach die anderen Kanalwerte ignorieren und das Hex-Bit im blauen Kanal ziehen, um die Zeichenfolge zu rekonstruieren:
"Programming Puzzles and Code Golf"
Beachten Sie, dass die Leerzeichen, die zum Auffüllen der Zeichenfolge im Quadrat verwendet wurden, in der endgültigen entschlüsselten Ausgabe nicht enthalten sind. Während Sie die Zeichenfolge im Bild auffüllen müssen, können Sie davon ausgehen, dass die Eingabezeichenfolge nicht mit Leerzeichen endet.
Regeln
- Sie müssen 1 Zeichen pro Pixel codieren, der Kanal, der zum Codieren des Zeichens ausgewählt wurde, ist willkürlich.
- Die Kanäle der anderen RGB-Farben müssen nach dem Zufallsprinzip ausgewählt werden. Dies bedeutet, dass Ihre letzten nicht codierten Kanäle zwischen
0x0000-0xFFFF
(zufällig ausgewählt) liegen müssen. - Das Endergebnis als 2D-Array von RGB-Farbwerten auszudrücken, ist in Ordnung
0x000000-0xFFFFFF
. Sie müssen die Bilderstellung nicht verwenden, es sei denn, Sie möchten Spaß damit haben oder es sind weniger Bytes. Wenn Sie sich für die Ausgabe als Hex-Zeichenfolge entscheiden, stellen Sie der Hex-Zeichenfolge#
EG#FFFFFF
oder voran#05AB1E
. Sie können mit Tabulatoren, Kommas oder allem anderen trennen, was horizontal sinnvoll wäre, aber das quadratische Muster muss beibehalten werden. Mit anderen Worten, Sie müssen einen geeigneten Zeilenumbruch verwenden. - Die Ausgabe muss in einem Quadrat erfolgen, und die Zeichenfolge muss am Ende mit Leerzeichen aufgefüllt werden, um dies zu berücksichtigen. Das bedeutet das
N≈SQRT(Input#Length())
. Wenn die eingegebene Länge kein perfektes Quadrat ist, sollten Sie aufrundenN
und mit Leerzeichen auffüllen. - Wie bereits erwähnt, dürfen Sie beim Auffüllen mit Leerzeichen im Bild die aufgefüllten Zeichen nicht in die endgültige "entschlüsselte" Ausgabe einbeziehen.
- Sie können davon ausgehen, dass:
- Die Eingabezeichenfolge endet nicht mit Leerzeichen.
- Die Eingabezeichenfolge verwendet nur druckbare ASCII-Zeichen.
- Dies ist Code-Golf , die niedrigste Anzahl an Bytes gewinnt.