Schreiben Sie zwei Programme:
- Eines, das eine Zeichenfolge und einen Schlüssel liest und die Zeichenfolge mit diesem Schlüssel in eine Rail-Zaun-Verschlüsselung codiert. - Schreiben Sie in ähnlicher Weise ein Programm für die Umkehrfunktion: Entschlüsseln eines Schienenzauns mit einem Schlüssel.
Für diejenigen, die nicht wissen, was eine Schienenzaun-Chiffre ist, ist es im Grunde eine Methode, einfachen Text so zu schreiben, dass ein lineares Muster spiralförmig erzeugt wird. Beispiel - wenn "FOOBARBAZQUX" mit dem Schlüssel 3 eingezäunt ist.
F . . . A . . . Z . . . .
O . B . R . A . Q . X
O . . . B . . . U
Wenn Sie die obige Spirale Zeile für Zeile lesen, wird der Chiffretext zu "FAZOBRAQXOBU".
Lesen Sie mehr unter - Rail Zaun Chiffre - Wikipedia .
Code in jeder Sprache ist willkommen.
Die kürzeste Antwort in Bytes gewinnt.
quelle
Antworten:
Python 133 Bytes
Beispielnutzung:
Hinweis: Die Ergebnisse von geraden Schienenzählungen unterscheiden sich von denen für den von Ihnen angegebenen Code, scheinen jedoch korrekt zu sein. Zum Beispiel 6 Schienen:
entspricht
AKUBJLTVCIMSWDHNRXEGOQYFPZ
und nichtAKUTBLVJICMSWXRDNHQYEOGZFP
wie Ihr Code produziert.Die Grundidee ist, dass jede Schiene direkt gefunden werden kann, indem String-Slices genommen werden
[i::m]
, wobeii
die Schienennummer (0
-indexiert) ist undm
ist(num_rails - 1)*2
. Die inneren Schienen müssen zusätzlich miteinander verwoben werden[m-i::m]
, was durch Reißverschluss und Verbinden der beiden Zeichensätze erreicht wird. Da das zweite Zeichen möglicherweise ein Zeichen kürzer sein kann, wirdes mit einem Zeichen aufgefüllt, von dem angenommen wird, dass es nirgendwo erscheint (, in eine Liste konvertiert und mit einer leeren Zeichenfolge aufgefüllt._
), und dieses Zeichen wird dann entfernt, falls erforderlichEine etwas besser lesbare Form:
quelle
APL
5241Wenn die Eingabetextzeichenfolge i und die Schlüsselnummer n vorinitialisiert sind, kann die Lösung um 9 Zeichen gekürzt werden. Wenn Sie die Lösung anhand der von primo angegebenen Beispiele ausführen, erhalten Sie identische Antworten:
Bei weiterer Überlegung scheint es eine kürzere indexbasierte Lösung zu geben:
quelle
Python 2 , 124 + 179 = 303 Bytes
Kodieren:
Probieren Sie es online aus!
Dekodieren:
Probieren Sie es online aus!
quelle
MATL, 70 Bytes (insgesamt)
Probieren Sie es mit MATL Online aus.
Probieren Sie mehrere Testfälle aus
Nimmt ein Flag als dritte Eingabe,
F
um die Zeichenfolge zu verschlüsseln,T
um sie zu entschlüsseln (danke an Kevin Cruijssen für diese Idee).Dies begann als Antwort von Julia, bis mir klar wurde, dass striktes Tippen zu viel störte, insbesondere für die Entschlüsselung. Hier ist der Julia-Code, den ich für die Verschlüsselung hatte (für TIO auf v0.6 zurückportiert):
Julia 0,6 , 191 Bytes
Probieren Sie es online aus!
Erläuterung:
Der Schienenzaunbetrieb
kann als Lesen von r = 3 Zeichen der Eingabe, dann Lesen von r-2 Zeichen und Präfixieren und Suffixieren dieser mit Dummy-Werten (Nullen), dann erneutes Lesen von r Zeichen usw. angesehen werden, wobei jedes Mal eine neue Spalte erstellt wird:
dann jede zweite Spalte umkehren (da der Zack- Teil des Zickzacks nach oben statt nach unten geht, was einen Unterschied macht, wenn r> 3 ist), dann diese Matrix entlang der Zeilen lesen und die Dummy-Zeichen entfernen.
Die Entschlüsselung schien keine offensichtlichen Muster wie dieses zu haben, aber als ich mich danach umsah , stieß ich auf diesen Beitrag , der mir sagte, dass (a) dies ein bekannter und (möglicherweise?) Veröffentlichter Algorithmus für Schienenchiffren war und ( b) Die Entschlüsselung war eine einfache Wiederverwendung derselben Methode, bei der die Indizes der Zeichenfolge angegeben und die Indizes dieser Indizes nach der Verschlüsselung abgerufen und der Chiffretext an diesen Stellen gelesen wurden.
Da die Entschlüsselung Dinge tun muss, indem an Indizes gearbeitet wird, verschlüsselt dieser Code auch, indem er die Indizes der Zeichenfolge sortiert und in diesem Fall nur an diesen neu angeordneten Indizes indiziert.
quelle
Ich möchte in diesem Code erklärt werden.
quelle
Java 10,
459451445439327 Bytes-12 Bytes dank @ceilingcat .
-112 Bytes, die die beiden Funktionen mit einem zusätzlichen Modus-Flag als Eingabe kombinieren.
Die Funktion nimmt eine dritte Eingabe entgegen
M
. Wenn dies dertrue
Fall ist, wird es verschlüsselt, und wenn dies der Fall ist, wirdfalse
es entschlüsselt.Probieren Sie es online aus.
Erläuterung:
quelle