Steganography verbirgt eine bestimmte Nachricht in einem bestimmten Träger und erzeugt ein Paket, das nicht verdächtig aussieht. Für diese Herausforderung schreiben Sie ein Programm, das eine ASCII-Nachricht und einen ASCII-Träger als Eingabe verwendet, und geben oder drucken ein Paket, das mit dem Träger identisch ist, mit der Ausnahme, dass die Zeichen, die der Nachricht entsprechen, in derselben Reihenfolge verdoppelt werden, in der sie angezeigt werden die Nachricht.
Regeln:
- Wenn der Träger bereits mehrmals Sequenzen desselben Zeichens enthält und diese nicht zum Codieren eines Zeichens der Nachricht verwendet werden, werden sie vom Programm auf ein einzelnes Zeichen reduziert.
- Wenn der Spediteur die Nachrichtenzeichen nicht in der richtigen Reihenfolge enthält, gibt das Programm möglicherweise nichts, den Spediteur selbst oder einen Fehler zurück.
- Sie können davon ausgehen, dass die Nachricht und der Träger nicht leere ASCII-Zeichenfolgen sind.
- Auf die Groß- und Kleinschreibung kommt es an: A ist nicht gleichbedeutend mit a.
- Wenn mehr als ein Paket gültig ist, kann Ihr Programm eines oder alle davon ausgeben.
- Das Leerzeichen ist ein Zeichen wie jedes andere Zeichen.
Testfälle:
Paket für den Nachrichtenträger "hi" "ist es angekommen?" "Ist es angekommen?" ODER "ist es angekommen?" "Herr" "ist es angekommen?" "Ist es angekommen?" "foo" "ist es angekommen?" "" ODER "ist es angekommen?" ODER ein Fehler. "Auto" "Katzen sind cool." "CCaats arre col." "Auto" "Katzen sind cool." "" ODER "Katzen sind cool." ODER ein Fehler. "Couch" "Couch" "CCoouucchh" "oo" "oooooooooo" "oooo" "o o" "oooo oooa" "oo ooa"
Dies ist Codegolf, so dass nur wenige Bytes gewinnen.
code-golf
string
steganography
jkpate
quelle
quelle
"oooo oa"
(mit 2 Leerzeichen) eine gültige Ausgabe für den letzten Testfall?Antworten:
Gelee , 28 Bytes
Ein volles Programm Mitnahmen
carrier
undmessage
als Kommandozeilen - Argumente , die das Ergebnis druckt(für ein nicht packbares gibt es
message
das unveränderte auscarrier
).Probieren Sie es online!Oder sehen Sie sich die Testsuite an .
Wie?
quelle
JavaScript (ES6), 71 Byte
Übernimmt die Eingabe als
(message)(carrier)
.Probieren Sie es online!
Alternative Version, 66 Bytes
Wenn wir die Nachricht als ein Array von Zeichen annehmen können:
Probieren Sie es online!
Bearbeiten : Vielen Dank an @tsh, dass ich vergessen habe, Code zu entfernen, wenn ich von einer nicht rekursiven auf eine rekursive Version umgestiegen bin.
quelle
p=
da p von einem Parameter übergeben wird.Haskell,
124121107101979590 BytesLöst die Ausnahme "Nicht erschöpfende Muster" aus, wenn der Netzbetreiber die Nachricht nicht enthält.
Probieren Sie es online!
Edit: -5 Bytes dank @Laikoni.
quelle
m==c
: Probieren Sie es online aus!Retina 0.8.2 , 67 Bytes
Probieren Sie es online!Nimmt den Träger in die erste Zeile und die Nachricht in die zweite Zeile. Erläuterung:
Prozessläufe mit 1 oder mehr identischen Zeichen des Trägers. Wenn die Nachricht auch einen Durchlauf von mindestens einem Zeichen enthält, hängen Sie den kürzeren der beiden Durchläufe doppelt an die Ausgabe an, andernfalls hängen Sie ein einzelnes Zeichen des Trägers an die Ausgabe an. Jeder Lauf von Ausgabezeichen wird mit einem Zeilenumbruch abgeschlossen, um es von der Eingabe zu unterscheiden. Das
(?!¶)
am Ende verhindert, dass der Regex denkt, dass der Träger die Nachricht ist, sobald die Nachricht erschöpft ist, wie es normalerweise$
erlaubt ist, zu passen, wo¶$
es passen würde.Löschen Sie alles, wenn die Nachricht nicht vollständig verschlüsselt ist.
Entfernen Sie die Zeilenumbrüche aus der Ausgabe.
quelle
Sauber , 118 Bytes
Probieren Sie es online!
Nimmt zuerst den Träger, dann die Nachricht.
Fehler mit,
Run time error, rule '$;2' in module 'main' does not match
wenn die Nachricht nicht passt.quelle
Ruby , 73 Bytes
Probieren Sie es online!
Rekursive Funktion, nimmt Eingaben als Array von Zeichen an.
Ich hatte ausnahmsweise gehofft, die in Ruby integrierte
squeeze
Methode zu verwenden, mit der aufeinanderfolgende Läufe desselben Zeichens an eine einzige Instanz vergeben werden. Aber leider, nein - die letzten beiden Testfälle haben alles so sehr durcheinander gebracht, dass ich auf einen völlig anderen Ansatz zurückgreifen musste, und dies stellte sich im Grunde als eine Antwort von Arnauld heraus .quelle
Powershell, 134 Bytes
Das Skript gibt das zurück
empty string
wenn der Träger die Nachrichtenzeichen nicht in der richtigen Reihenfolge enthält.Weniger Golf-Testskript:
Ausgabe:
quelle
C (gcc) , 69 + 12 = 81 Bytes
Übersetzen mit (12 Bytes)
Probieren Sie es online!
quelle