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.
quelle
Antworten:
05AB1E , 34 + 12 = 46 Bytes
Verwendet roten Kanal.
05AB1E verwendet die CP-1252- Codierung.
Kodieren:
Probieren Sie es online!
Dekodieren:
Probieren Sie es online!
Alternative Auffüllmethode mit gleicher Bytezahl
quelle
C 201 (Codierung) + 175 (Decodierung) = 376 Bytes
Um zu kodieren:
Codiert jedes Zeichen der Eingabezeichenfolge im grünen Kanal des RGB-Spektrums, während die beiden anderen Kanäle als zufällige hexadezimale Werte festgelegt werden. Nimmt Eingaben über STDIN als Zeichenfolge und gibt eine mehrzeilige Zeichenfolge mit hexadezimalem Farbcode in Form eines Quadrats an STDOUT aus. Angenommen, Sie haben Python 3 und ImageMagick installiert und die obige Datei wurde in eine Datei kompiliert, die
a.out
im aktuellen Arbeitsverzeichnis (CWD) benanntOutput.png
ist. Mit dem folgenden Befehl können Sie das resultierende benannte Bild direkt aus der Textausgabe auf das CWD übertragen:Hier ist ein Beispiel für ein Ausgabebild, das mit dem obigen Kommando
Programming Puzzles and Code Golf
als Eingabezeichenfolge erstellt wurde:Dekodieren:
Nimmt die Eingabe über STDIN in eine Folge von durch Leerzeichen getrennten hexadezimalen Farbcode-Zeichenfolgen auf, wobei jede in doppelte Anführungszeichen (
"
) (char** argv
inmain
) eingeschlossenmain
ist.int argc
für die Ganzzahleingabe. Gibt eine ein- / mehrzeilige Zeichenfolge an STDOUT aus, die die decodierte Nachricht darstellt.Ich werde versuchen, diese im Laufe der Zeit zu spielen, wann und wo immer ich kann.
Wenn Sie beide Methoden in derselben Datei verwenden, können Sie auch die folgende
main
Methode verwenden, um alle Methoden zusammenzufassen, wobei jede Funktion die richtigen Eingaben erhält:Wenn Sie dies verwenden, müssen Sie für die Codierung
E
als erstes Argument die Codierungsmethode gefolgt von dem Argument für eine einzelne Zeichenfolge angeben, während Sie für die Decodierung nur die Folge von durch Leerzeichen getrennten hexadezimalen Farbcode-Zeichenfolgen angeben müssen, wobei jede Zeichenfolge in eingeschlossen ist doppelte Anführungszeichen ("
).Schließlich, wenn Sie möchten, können Sie die voll und ganz bereit, ready-to-use - Version bekommen hier , obwohl es nicht golfed, aber auch nicht ausgibt keine Warnungen oder Fehler bei der Kompilierung.
quelle
Python 2,
164160+9493 = 253 Bytes1 + 1 Byte dank Weizen-Assistent gespeichert.
-5 Bytes dank Kade
Encoder: Der String muss in Anführungszeichen gesetzt werden, z. B.
"CodeGolf"
ist die Ausgabe ein farbiges ASCII-PPM-Bild.Decoder: Übernimmt den eingegebenen Dateinamen als Befehlszeilenargument
Verwendung:
Beispiel:
Programmieren von Rätseln und Code Golf
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy temporär invidunt ut labore und dolore magna aliquyam erat, sed diam voluptua. Bei vero eos et accusam et justo duo dolores et ea rebum. Es gibt keinen Grund zur Besinnung, keinen Grund zur Besinnung. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy temporär invidunt ut labore und dolore magna aliquyam erat, sed diam voluptua. Bei vero eos et accusam et justo duo dolores et ea rebum. Es gibt keinen Grund zur Besinnung, keinen Grund zur Besinnung.
quelle
for
int
Daraus ergibt sich 4, die dann+1
bearbeitet wird, also 5-1
.print
und'
im Decoder entfernen . Ich bin mir auch ziemlich sicher, dass Sie einint((len(s)+1)**.5)
paar Bytes sparen können.' '.join("%d %d %d"
,''.join(3*"%d "
da ich mir ziemlich sicher bin, dass ein Leerzeichen in Ordnung ist.Scala, 97 + 68 = 165 Bytes
Verschlüsselung (97 Bytes):
Nimmt einen String und wiederholt einen Iterator von Sequenzen von ganzen Zahlen.
Entschlüsselung (68 Bytes):
Nimmt einen Iterator von Sequenzen von ganzen Zahlen und gibt eine Zeichenfolge zurück.
Erläuterung:
.
quelle
Perl, (103 + 1) + (36 + 2) = 142 Bytes
Text-zu-Bild-Encoder (wird mit
-p
einer 1-Byte-Strafe ausgeführt;-p0
(für ein zusätzliches Byte Strafe) ist erforderlich, wenn Sie Zeilenumbrüche in der Eingabezeichenfolge verarbeiten möchten):Bild-zu-Text-Decoder (wird mit
-p0
einer 2-Byte-Strafe ausgeführt):Dies verwendet das
#abcdef
textbasierte Bildformat und codiert im blauen Kanal. Hier ist ein Beispiel für eine mögliche AusgabeProgramming Puzzles and Code Golf
als Eingabe:Erklärung des Gebers:
Ich war wirklich froh, dass dieser Einsatz
\K
funktioniert hat; es gibt an, wo ersetzt werden soll, und es scheint, dass das Auftreten bei der letzten Schleifeniteration zählt, wenn es in einer Schleife platziert wird. Entspricht alsos/(.*?\K,){$a}/\n/g
einer Zeichenfolge mit minimaler Länge der Form " alles Komma alles Komma" ... alles Komma, das$a
Kommas enthält, aber der tatsächlich ersetzte Teil der Übereinstimmung ist einfach das letzte Komma. Dies hat den Effekt, dass jedes$a
Komma durch eine neue Linie ersetzt wird, wodurch wir die quadratische Form für das Bild erhalten.Der große Vorteil von Perl für diese Herausforderung (abgesehen vom eingebauten Konverter für die Zeichenfolge in Hexadezimalzahlen, der unglaublich praktisch war) ist, dass es einen sehr kurzen Decoder hat (in der Tat so kurz, dass Perl zwar einen eingebauten Decoder für hat) Um hexadezimal in einen String umzuwandeln, war es kürzer, ihn nicht zu verwenden. So funktioniert das:
Die einzigen Vorkommen von zwei Zeichen unmittelbar vor einem nicht-alphanumerischen Zeichen sind die blauen Kanäle (die entpackt werden sollen), die direkt vor Kommas und Zeilenumbrüchen stehen. und die beiden Zeichen, die vor
#
dem ersten vorkommen. Wir möchten nicht, dass die letztgenannte Kategorie von Übereinstimmungen, aber sie überlappen zwangsläufig die erstgenannte Kategorie und werden daher von der Überprüfung überlappender Übereinstimmungen ausgeschlossen.quelle
MySQL, 438 + 237 = 675 Bytes
Am Ende der Ausgabe befindet sich eine nachgestellte neue Zeile, die jedoch nach dem Entschlüsseln nicht angezeigt wird. Die Hex-Funktion (Integer-Überladung) würde führende Nullen abhacken, daher musste ich sie mit einem String 0 auffüllen. Ich könnte einige Bytes sparen, wenn ich beide Funktionen zwischen den Begrenzern deklarieren könnte.
Verschlüsseln
Entschlüsseln
Verwendung:
quelle
C #, 312 + 142 = 454 Bytes
Codierung:
Dekodierung:
Volles Programm:
quelle
Mathematica, 111 + 65 = 176 Bytes
Encoder
Decoder
quelle
Verarbeitung,
220209194 +171167151 =391380376361345 BytesAktualisieren:
Nutzlos entfernt
noStroke()
und beide for-Loops zu Einsätzen gemacht.image(p,0,0);
Nutzlos entfernt , gab dem Entschlüsseler den Dateinamen als ParameterVerschlüsselungsalgorithmus
Aufruf der Funktion:
g("Programming Puzzles and Code Golf");
Dies ist eine Funktion, die einen String aufnimmt und die Ausgabe erstellt, bevor sie gespeichert wird
t.png
. Es verwendet denred
Wert, um den verborgenen Text zu speichern.Entschlüsselungsalgorithmus
Funktion aufrufen durch:
u(file_name);
Dies ist auch eine Funktion, die nach dem durch den Parameter angegebenen Bild sucht und dann die verborgene Zeichenfolge ausgibt (da sie kürzer ist als die Rückgabe einer Zeichenfolge).
Erweiterter Code
(Verschlüsselungsalgorithmus)
Die Zeichenfolge wird beim Aufruf der Funktion übergeben. Die erste Zeile der Funktion berechnet die Seitenlänge des Quadrats aus der
ceil
Quadratwurzel. Dann geben wir eine for-Schleife ein, in der wir diestroke
(die Farbe der Kante) so einstellen , dass der ASCII-Wert des Zeichens rot und die Zufallswerte für blau und grün sind. Danach erstellen wir einrect
(Rechteck) mit width =1
und height =1
, dh ein Pixel (aus irgendeinem seltsamen Grund kann ich es nichtpoint
richtig verwenden). In der letzten Zeile wird das resultierende Bild dann als gespeichertt.png
.(Entschlüsselungsalgorithmus)
Diese Funktion hat den Namen der Datei als Parameter (als String). Dann wird das Bild in der Datei in einer Variablen gespeichert, die später verwendet werden soll. Nachdem wir damit fertig sind, setzen wir die Zeichenfolge auf,
""
anstatt eine neue Zeichenfolge zu erstellen, die nur die verborgene Zeichenfolge enthält. Dann iterieren wir über zwei verschachtelte for-Schleifen durch das Bild und addieren den Zeichenwert des roten Wertes des Pixels zum String. Zum Schluss drucken wir den resultierenden String, nachdem wir führende Leerzeichen entfernt haben (unter Verwendung eines regulären Ausdrucks). Der Grund, warum wir den verborgenen Text drucken, anstatt ihn zurückzugeben, ist, dass er auf diese Weise kürzer ist und wir Bytes sparen.Verschlüsselter Challenge-Rohtext:
quelle
Jelly, 40 + 20 = 60 Bytes in Jellys Codepage
Encoder (Text → Bild):
Probieren Sie es online!
Decoder (Bild → Text):
Probieren Sie es online!
Eine Beispielausgabe, die das Programm erzeugen könnte (es speichert Informationen im roten Kanal):
Bei diesen größeren Herausforderungen lässt die Knappheit von Jelly allmählich nach und es werden mehrere "strukturelle" Zeichen benötigt, um Parsing-Ambiguitäten aufzulösen, aber es ist dennoch sehr knapp. So funktioniert der Encoder:
Und so funktioniert der Decoder:
quelle