Schreiben Sie ein Programm, das zwei Eingabezeilen verwendet und die erste als Schlüsselphrase verwendet, um die zweite nach der Playfair-Verschlüsselungstechnik zu verschlüsseln.
Wikipedia beschreibt die Playfair-Verschlüsselung ausführlich , um jedoch Unklarheiten zu vermeiden, folgt eine kurze Zusammenfassung:
1. Generieren Sie eine Schlüsseltabelle:
Ersetzen Sie alle Vorkommen J
in der Schlüsselphrase durch und entfernen Sie I
dann alle Nicht-Alphabet- und Wiederholungszeichen. In eine 5 × 5-Verschlüsselungstabelle einfügen und die verbleibenden Zellen mit dem Rest des Alphabets füllen (außer J
, wir mögen es nicht J
).
Beispiel:
S T A C K
O V E R F
Stack Overflow --> STACKOVERFLW --> L W B D G
H I M N P
Q U X Y Z
2. Bereiten Sie die zu verschlüsselnde Nachricht vor
Ersetzen Sie jedes J
durch ein I
, entfernen Sie alle Nicht-Alphabet-Zeichen und teilen Sie sie in Paare auf. Verwenden Sie dabei ein X
, um alle Paare zu trennen, die denselben Buchstaben zweimal enthalten. Wenn Sie am Ende eine ungerade Anzahl von Buchstaben haben, fügen Sie diese X
am Ende hinzu. (Hinweis: Die Ziffern haben vollständig buchstabiert werden - ONE
, TWO
, THREE
etc. - Sie können dies aber davon ausgehen , bereits für Sie erledigt worden ist .)
Beispiel:
In:
The cat crept into the crypt, crapped, and crept out again.
Out:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
3. Verschlüsselung
Verschlüsseln Sie nacheinander jedes Buchstabenpaar. Wenn sie sich in verschiedenen Zeilen und Spalten der Schlüsseltabelle befinden, ersetzen Sie sie jeweils durch den Buchstaben aus derselben Zeile in der Spalte, in der sich der andere Buchstabe befindet (z. B. VM
⇒ EI
, LZ
⇒ GQ
). Wenn sie sich in derselben Zeile (oder Spalte) befinden, wählen Sie die beiden Zeichen unmittelbar rechts (oder darunter) aus und schließen Sie sie gegebenenfalls um (z. B. OE
⇒ VR
, ZG
⇒ KP
).
Beispiel:
In:
TH EC AT CR EP TI NT OT HE CR YP TC RA PX PE DA ND CR EP TO UT AG AI NX
Out:
SI RA CA RD FM VU IC VS MO RD ZN AK EC MZ MF BC YN RD FM SV TV KB TM MY
Der von diesem Prozess erzeugte String ist die verschlüsselte Nachricht, die Ihr Programm ausgeben soll.
Regeln:
- Der Eingabetext und der Schlüssel können von
stdin
Befehlszeilenargumenten oder anderen derartigen Quellen bezogen werden. Hardcodierte Eingaben sind nicht zulässig. - Ihr Programm muss sowohl Groß- als auch Kleinbuchstaben für die Passphrase und die Nachricht akzeptieren.
- Die verschlüsselte Ausgabe kann in Groß- oder Kleinschreibung erfolgen.
- Ihr Programm sollte Schlüsselphrasen mit einer Länge von mindestens 64 Zeichen und Nachrichtentexte von mindestens 16 KB akzeptieren.
- Sie müssen keine Nicht-ASCII-Eingaben verarbeiten.
- Sie können die Möglichkeit, dass das Buchstabenpaar
XX
während der Verschlüsselung auftritt, ignorieren . - Es ist nicht erforderlich, Leerzeichen zur Ausgabe des Programms hinzuzufügen.
- Ihre Antwort sollte ein Beispiel für eine Nachricht, eine Schlüsselphrase und eine verschlüsselte Ausgabe enthalten, die von Ihrem Programm erstellt wurden.
- Dies ist eine Code-Golf-Herausforderung, daher gewinnt die Antwort mit dem kürzesten Code (in Bytes).
HINWEIS: Bitte denken Sie daran, dass Sie aufeinanderfolgende Buchstaben nur unterbrechen müssen, wenn sie im selben Paar vorkommen . So sollte zum Beispiel
MASSACHUSETTS
verschlüsselt werden alsMA SX SA CH US ET TS
- das DoubleS
muss geteilt werden, aber das DoubleT
nicht.
quelle
J
" Haben Sie ähnliche Gefühle gegenüber APL?Antworten:
JI *,536431417380263218203197186167(mit ausführlichen Vorschlägen von @algorithmshark)
Beispiel verwenden:
teilt die Eingabe korrekt auf:
* Ersetze jeden
J
mit einemI
, oder?quelle
Ruby,
461411366359352346330 ZeichenVielen Dank an @daniero für das Speichern ... ähm, viele Bytes. \O/
Hier ist der ungolfed Code:
Hier sind einige Beispielausgaben:
quelle
chars
Array "umgewandelt" werden, vorausgesetzt, Sie verwenden Ruby 2. Sie können auch&
einen Set-Operator anstelle vontr
:t=->s{s.gsub(?j,?i).upcase.chars&[*?A..?Z]}
(7 Byte gespeichert) verwenden. Die beiden nächsten Zeilen können mit so etwas wiek,m=[1,2].map{t[gets.chop]}
(Notizchop
stattchomp
) verbunden werden.&
entfällt auch die Notwendigkeit füruniq
später. Und daschars
to-Array-Ding gilt auch für Zeile 6.tr
auf&
der Linie 1 nicht funktioniert , weilm
nicht seinuniq
ified. Jedochk.uniq
zu können verkürzt werden(k&k)
(1 Byte aus).C:
495401355341 ZeichenAb sofort ist es nur eine grobe Skizze. Ich sollte in der Lage sein, mindestens hundert Zeichen zu rasieren.Ziel erreicht: Mehr als hundert Zeichen (bisher 154) sind auf mysteriöse Weise aus dem Code verschwunden.
Mit einigem angenehmen Leerzeichen:
Ich habe die erste Iteration des Programms kurz vor dem Einschlafen geschrieben, daher gab es eine Menge überflüssiger bedeutungsloser Aussagen und so weiter. Das meiste davon ist behoben, aber es gibt einige Bereiche, in denen eine Verbesserung auf jeden Fall möglich ist.
quelle
Matlab - 458 Zeichen
Einige Beispiele:
quelle
Haskell - 711
Demo:
Code:
Große Version:
quelle
Pyth - 111
Zu spät für den Wettbewerb, ich wollte nur teilen. Hier ist der Encoder und Decoder
Erläuterung:
Beispielschlüssel / Nachricht / Ausgabe:
quelle
C 516
Zeilenumbrüche zur besseren
Lesbarkeithinzugefügt . (Die Lesbarkeit ging leider aus dem Fenster.)Beispiel:
quelle
Python 3,
709705685664Akzeptiert Eingaben von stdin.
Beispiel:
quelle
Python: 591 Bytes
Hiermit werden
stdin
der Schlüssel und die Nachricht in dieser Reihenfolge abgerufen. Ich hoffe, es ist kein Betrug, eine flache Liste zum Speichern der Verschlüsselungsmatrix zu verwenden, da dies das Arbeiten mit der Matrix ziemlich einfach gemacht hat. Hier sind einige Beispielläufe:quelle
z
zulambda x:0if b not in x else b.remove(x)or 1
. Es gibt auch eine Menge Leerzeichen, die Sie entfernen können. Auf diese Weise können Sie es auch direkt in denfilter
Anruf verschieben, anstatt es außerhalb zu definieren.Java - 791
Mein erstes Golf, daher ist jede Kritik willkommen. Mit Java, weil ich nicht sollte. Es scheint nicht so schlimm; weniger als doppelt so groß wie der aktuelle Anführer. Ich hatte erwartet, dass es größer wird, da es ja Java ist :)
Mit Auto-Format:
Beispielausgabe:
quelle
JS (Knoten) -
528466Beispielausgabe:
quelle
UU
. Sieht so aus, als ob es eine Wiederholung gabE
, die Sie hätten trennen sollen.PHP 582
Ungolfed
Decoder
Ausgänge
quelle
Perl, 265
Sehr einfach.
Eingerückt:
quelle
CoffeeScript - 610
Demo:
Code:
Ungolfed-Version:
quelle