Die Caesar-Chiffre ist eine sehr einfache Substitutions-Chiffre, bei der jeder Buchstabe um einen festen Versatz verschoben ist (Schleife um Z nach A). Ebenso können wir auch eine Caesar-Chiffre für den Satz druckbarer ASCII-Zeichen verwenden. Dies sind die 95 Zeichen von den Codepunkten 0x20 bis 0x7E. Für einen bestimmten Versatz ordnen d
wir den Codepunkt C
zu
(C - 32 + d) % 95 + 32
Das verschiebt alle Zeichen um a d
und wandert von einem ~
zum nächsten. Zeichen außerhalb dieses Bereichs (Steuerzeichen wie Zeilenumbrüche, Tabulatoren und Zeichen außerhalb des ASCII-Bereichs) sind nicht betroffen.
Sie müssen zwei Programme oder Funktionen (möglicherweise in verschiedenen Sprachen) schreiben, die einen Offset d
und eine Zeichenfolge enthalten. Das erste Programm sollte den Caesar-Code der Eingabe zurückgeben oder ausdrucken. Das zweite Programm sollte die inverse Caesar-Chiffre zurückgeben oder drucken (dh Offset verwenden -d
). Sie können Eingaben über STDIN, Befehlszeilenargument oder Funktionsargument vornehmen.
Um die Sache interessanter zu machen, muss das zweite Programm eine Cäsar-Chiffre des ersten Programms sein. Wenn Sie also den Quellcode des ersten Programms an sich selbst übergeben, d
muss die Ausgabe für einen Versatz ungleich Null das zweite Programm sein.
Beide Programme sowie die Eingabezeichenfolgen dürfen nur druckbare ASCII-Zeichen, Zeilenumbrüche und Tabulatoren enthalten. Kein Programm darf Kommentare enthalten oder seinen eigenen Quellcode, Dateinamen oder seine eigene Prozess-ID direkt oder indirekt lesen.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes). Da beide Programme dieselbe Größe haben müssen, müssen Sie sie nur einmal zählen.
quelle
Python 2, 147
Offensichtlich habe ich nicht zu viel darüber nachgedacht, da es in Python sinnlos wäre. Es gibt einfach zwei separate Programme, wobei das nicht verwendete in einer Zeichenfolge eingeschlossen ist.
Der Versatz zwischen den beiden Programmen beträgt 39.
Nach vorne
Definiert die Funktion Z, die eine Unicode-Zeichenfolge und einen Offset akzeptiert.
Inverse
Definiert die Funktion, die eine Unicode-Zeichenfolge und einen Offset akzeptiert.
quelle
Python 3 - 248 Bytes
Mein Ziel war es, dies als Python-Einzeiler zu tun. Zielerfolg, aber jetzt kann ich mich nicht mehr ums Golfen kümmern.
Verschlüsseln:
Entschlüsseln:
Bearbeiten: Behoben, dass Zeichen außerhalb des druckbaren ASCII-Bereichs nicht beeinflusst werden
Der Versatz vom Verschlüsseln zum Entschlüsseln beträgt 20. Verwenden Sie diesen Versatz, indem Sie zuerst den Versatz und dann die Zeichenfolge eingeben, z
Erläuterung
Die folgenden Transformationen sind der Schlüssel:
Die erste erlaubt die Verwendung von
or
, während die zweite Zeichenkette durch Semikolons ignoriert.Beachten Sie, dass
"".__doc__[2]
die Zeichenfolger
(entnommen vonstr
) zurückgegeben wird. Dies ist erforderlich, um zu verhindern, dass die Zeichenfolge in Anführungszeichen im Entschlüsselungsprogramm in der Mitte Streuungsanführungszeichen enthält.quelle
Ruby,
131125 BytesHier ist meine eigene Vorlage (die ich zuvor als Proof of Concept geschrieben hatte, aber es gelang mir, irgendwie gegen meine eigenen Regeln zu verstoßen). Ich verwende keinen Code zwischen den beiden Einreichungen (ich möchte, dass ihr das immerhin besiegt), sondern es besteht aus zwei Zeilen, von denen eine in eine Zeichenfolge mit Kauderwelsch verwandelt wird.
Vorwärts-Chiffre:
Inverse Chiffre:
Beide Snippets definieren eine Funktion (die
Y
in der ersten undJ
in der zweiten aufgerufen wird ), die eine Ganzzahl und eine Zeichenfolge verwendet und die transformierte Zeichenfolge in STDOUT ausgibt. Der Versatz zwischen den beiden Codeteilen beträgt40
.quelle
oOo CODE ,
750744 Byte, der gesamte Code wird in beiden Programmen verwendetZu lang, aber es ist wahrscheinlich das richtige Werkzeug, um das zu tun ...
Verschlüsseln:
Entschlüsseln:
Brainfuck-Übersetzungen:
oOo CODE ist eine Brainfuck-Variante, bei der nur die Groß- und Kleinschreibung von Bedeutung ist.
Es nimmt das erste Byte und verwendet seinen Zeichencode als
d
(eine neue Zeile bedeutet also d = 10). Der Rest der Eingabe ist die Zeichenfolge. EOF ist 0.quelle
GolfScript,
9564 Bytes, der gesamte Code wird in beiden Programmen verwendetVerschlüsseln:
Entschlüsseln:
Eingabeformat:
Erläuterung
Entschlüsseln:
Verschlüsseln:
quelle
Javascript (ES7-Entwurf) -
167165 BytesAusleihen von @feersums Verwendung von Strings und @MartinButtners Verwendung von Semikolon;)
Verschlüsseln:
Entschlüsseln:
Zu verwendender Versatz: 55
quelle
or <empty string> and <function>
eher als nur setzenor <function>
.> <> (Fisch) , 467 Bytes
Verschlüsseln:
Entschlüsseln:
Die beiden Programme sind um 3 versetzt und nehmen die Eingabe der Form vor:
Der Versatz muss 2-stellig sein, daher muss ein Versatz von 5 als eingegeben werden
05
.Dies ist eine lange Übermittlung, aber fast alle Zeichen ohne Füllzeichen werden von beiden Programmen verwendet . Es gibt eine Menge Leerzeichen, die definitiv herausgolfen werden können, aber ich dachte, das Programm wäre auf diese Weise interessanter.
Dieses Bild hebt die Zeichen hervor, die von beiden Programmen verwendet werden.
Erläuterung
Das Hauptkonstrukt, das dies ermöglicht
_{} -> b~!
, ermöglicht das willkürliche Überspringen von Zeichen im Entschlüsselungsprogramm. Wie?Alles in allem macht das Verschlüsselungsprogramm nichts, aber das Entschlüsselungsprogramm überspringt den nächsten Befehl. Dies kann dann erweitert werden
_{}! -> b~!$
, was stattdessen das willkürliche Überspringen von Zeichen im Verschlüsselungsprogramm ermöglicht .Abgesehen davon drückt der größte Teil des Programms Zahlen, führt Operationen an diesen Zahlen durch und findet dann Möglichkeiten, sie zu platzieren. Ein nützliches Konstrukt ist beispielsweise
~~ -> ""
, bei dem zwei Werte für das Verschlüsselungsprogramm abgelegt werden, im Entschlüsselungsprogramm jedoch keine Pushs ausgeführt werden.> <> 149 Bytes
Hier ist die weniger interessante Version, die die Tatsache ausnutzt, dass Anweisungen, die nicht durchgereicht werden, effektiv Kommentare in 2D-Sprachen sind.
Verschlüsseln:
Entschlüsseln:
Die beiden Programme sind um 84 versetzt und werden auf die gleiche Weise wie oben eingegeben. Der erste Befehl entscheidet, welche Hälfte des Programms ausgeführt werden soll, wobei der
i
Programmfluss im Verschlüsselungsprogramm nach rechts (eingegeben) und der^
Programmfluss im Entschlüsselungsprogramm nach oben (in einer Schleife und von unten zurück) umgeleitet wird.Erläuterung
Für die relevante Hälfte des Verschlüsselungsprogramms (Entschlüsselungsprogramm ist ähnlich):
Codierungswerkzeug
Dies hat nichts mit dem Rest des obigen Beitrags zu tun, aber ich dachte, ich würde das posten, weil ich es verwenden muss: P
quelle
Perl - 131
Es nimmt Eingaben von Kommandozeilenargumenten entgegen.
Eine Verschiebung um 26 ergibt die andere:
quelle