Einführung
Die Enigma war eine der ersten elektromechanischen Rotor-Chiffriermaschinen, die im Zweiten Weltkrieg eingesetzt wurden. Das bedeutet, dass nach der Kodierung eines einzelnen Buchstabens der Schlüssel für den nächsten Buchstaben geändert wird. Dies wurde von den Deutschen aufgrund des enormen Schlüsselraums als unzerbrechlich angesehen . Sogar Brute Forcing war fast unmöglich. Es gab jedoch einen Designfehler im Enigma. Das Verschlüsseln eines Briefes würde niemals zu sich selbst führen. Das bedeutet, dass der Brief A
mit Ausnahme des Buchstabens zu jedem Buchstaben verschlüsselt werden kann A
.
Nehmen wir ein Beispiel für eine codierte Nachricht:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
Ein typisches deutsches Wort war WETTERBERICHT
, oder Wetterbericht in Englisch. Mit dem obigen Prinzip können wir bestimmen, an welchen Stellen das Wort möglicherweise sein könnte:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Dies ist nicht möglich, da das I
nicht für sich selbst verschlüsselt werden kann, also bewegen wir uns um einen Platz:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Das ist auch nicht möglich, also ziehen wir wieder um:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Dies ist wiederum nicht möglich. In der Tat ist das erste mögliche Auftreten von WETTERBERICHT
:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
0123456789012345678901234567890123456789012345678901234567890123
^
13
Wir geben also die 0-indizierte Position des ersten möglichen Auftretens zurück, nämlich 13 .
Die Aufgabe
- Bestimmen Sie anhand einer verschlüsselten Nachricht und eines Wortes den Index des ersten möglichen Auftretens .
- Angenommen, es werden nur einfache alphabetische Großbuchstaben verwendet (
ABCDEFGHIJKLMNOPQRSTUVWXYZ
). - Wenn kein Vorkommen gefunden wird, kann die Ausgabe jedes negativ ganze Zahl, Zeichen oder nichts (zB
-1
,X
). - Eingaben können als Argumente, in separaten Zeilenumbrüchen, Listen oder anderen Elementen akzeptiert werden.
- Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
Testfälle
Input: BHGEFXWFTIUPITHHLPETTTCLOEWOELM, WETTERBERICHT
Output: 13
Input: ABCDEFGHIJKL, HELLO
Output: 0
Input: EEEEEEEEEEEE, HELLO
Output: -1
Input: XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF, DEUTSCHLAND
Output: 11
Input: HKKH, JJJJJ
Output: -1
E
niemals zu einem führen würdeE
. Darum geht es bei dieser ganzen Herausforderung.Antworten:
Pyth, 14 Bytes
Ich bin nicht sicher, ob dies in Ordnung ist, aber wenn die Eingabe unmöglich ist, wird nichts in stdout und ein Nullteilungsfehler in stderr geschrieben. Nimmt die Eingabe in 2 Zeilen auf, die zweite ist von Anführungszeichen umgeben.
Erläuterung:
Probieren Sie es hier aus!
quelle
JavaScript, 40
Unter Verwendung von
replace
ordnet dies die Klartexteingabe einem regulären Ausdruck der Form zu/[^H][^E][^L][^L][^O]/
(z. B. für die KlartexteingabeHELLO
) undsearch
testet dann, ob der erste Index der Chiffretext-Teilzeichenfolge mit dieser Regex übereinstimmt. Dieser Ausdruck bedeutet "ein Muster, bei dem das erste Zeichen nichtH
, das zweite Zeichen nichtE
usw. ist".$&
ist eine spezielle Sequenz für diereplace
Ausgabe , die den mit dem erstenreplace
Argument übereinstimmenden Wert ersetzt (in diesem Fall jedes einzelne Zeichen, das mit übereinstimmt/./
).quelle
$&
! Danke, dass du mir heute etwas beigebracht hast.$'
im Zuge der Untersuchung dieser Antwort erfahren , die" den Teil der ZeichenfolgeTuring Machine Simulator - 15660 Bytes (nicht konkurrierend)
Ich kann keine Enigma-Herausforderung haben, ohne den Maschinencode zu verändern.
Testen Sie es hier
Kurzübersicht:
quelle
SWI-Prolog, 115 Bytes
Anwendungsbeispiel:
a(`ABCDEFGHIJKL`,`HELLO`,R).
. Dies verwendet die Zeichencodes, die mit Backticks deklariert wurden. Die Antwort ist vereinheitlicht mitR
. Wenn keine Übereinstimmung gefunden wird, wird diese ausgegebenfalse.
.Erläuterung:
Probieren Sie es hier aus
quelle
Ruby,
9179 BytesVerfluche dich
Enumerator
! Warum muss ich von String zu Array zu Enumerator konvertieren, um wertvolle Bytes zu ordnen und zu verschwenden? > :(quelle
[*...]
als Golf-Alternative zu #to_a ist eine nette Geste.CJam,
1716 BytesProbieren Sie es hier aus .
Vielen Dank an @PeterTaylor für das Speichern eines Bytes.
Erläuterung:
quelle
array block #
können Sie ein Zeichen sparen:ll:A,ew{A.=:+!}#
ew
(Slices machen), alles andere folgt einfach.MATL , 27 Bytes
Beispiele
Erläuterung
quelle
Haskell, 72 Bytes
Verwendung:
h 0 "DEUTSCHLAND" "XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF"
->11
.Einfacher rekursiver Ansatz: Wenn das Wort
w
am Anfang der Zeichenfolge platziert werden kanns
, geben Sie den Indexzähler zurücki
, andernfalls wiederholen Sie deni
Vorgang mit Inkrement und dem Ende vons
. Halten Sie an und kehren Sie zurück,-1
wenn die Länge vons
kleiner als die Länge von istw
.quelle
Python 2.7, 111 Zeichen
Versucht alle Startpositionen (a) und Überprüfungen der Buchstaben stimmen überein (unter Verwendung des Listenverständnisses). Es gibt "None" (Pythons "NULL") zurück, wenn nichts gefunden wird (das for-Schleifenende und nichts wird zurückgegeben, der Standardwert ist "None".
Testsuite:
quelle
def d(c,s): for a in range(len(c)): if a not in[a+(c+s)[a+i:].index(l)for i,l in enumerate(s)]:return a
Brachylog , 48 Bytes
Dies ist eine direkte Übersetzung meiner Prolog-Antwort. Das
brachylog_main/2
generierte Prädikat erwartet eine Liste von Zeichenfolgen mit zwei Zeichencodes, wobei die codierte Zeichenfolge zuerst als Eingabe dient, und gibt den Index als Ausgabe zurück, zbrachylog_main([`ABCDEFGHIJKL`,`HELLO`],R).
.Erläuterung
quelle
Japt, 12 Bytes (nicht konkurrenzfähig)
Ich brauche hier Hilfe.
quelle
.search
? facepalmUàVr'."[^$&]
für 12.PHP - 155 Bytes
Speichern unter
crack.php
und mit den Argumenten in der Befehlszeile ausführen. Z.B:quelle
for($r=-1;$i<strlen($p=$argv[1])-$l=strlen($q=$argv[2]);$i++)if(levenshtein($q,substr($p,$i,$l),2,1,2)==$l&&$r=$i)break;echo"$r↵";
levenshtein
, aber wahrscheinlich könnte eine einfache Iteration innerhalb einer Iteration dies in weniger Bytes tun.JavaScript,
129121118119 *118 Bytew
ist die codierte Nachricht,t
ist die Testzeichenfolge. Hierbei werden keine regulären Ausdrücke verwendet, sondern nur Buchstaben für Buchstaben verglichen, wobei die Testzeichenfolge (dh "WETTERBERICHT") verschoben wird, indem ein Leerzeichen davor angehängt wird. Einfach und langweilig.* Testfall ohne Übereinstimmung hat nicht funktioniert, jetzt funktioniert es
quelle
𝔼𝕊𝕄𝕚𝕟 14 Zeichen / 25 Byte
Try it here (Firefox only).
Ein großes Lob an @apsillers für die Idee.
Erläuterung
quelle
TeaScript, 14 Bytes
20Ähnlich wie bei @aspillers clevere JavaScript- Lösung .
Nicht konkurrierend, da dies Funktionen verwendet, die nach diesem Wettbewerb erstellt wurden.
Erläuterung
quelle
$&
nicht anstelle von${l}
?Ruby,
4336 Bytesedit: Stringinterpolation innerhalb von Stringinterpolation innerhalb eines Regex, yikes.
Der faule Ansatz: Übersetzt das Wort in einen "negativen" regulären Ausdruck. Den
=~
Rest erledigt der Bediener.Prüfung:
quelle
Python 3 , 79 Bytes
Probieren Sie es online!
quelle
05AB1E , 14 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Jolf , 14 Bytes
Probieren Sie es hier aus!
quelle
Perl, 38 + 1 = 39 Bytes
Wobei die Eingabe so aussieht:
Dies ist die gleiche Idee wie bei Javascript.
quelle
Java, 136 Zeichen
Regex-basierte Lösung, inspiriert von der JavaScript-Version von apsillers .
quelle
Brachylog (v2), 16 Bytes
Probieren Sie es online!
Brachylog kann normalerweise sehr gut scheitern, wenn es unmöglich ist, etwas zu lösen.
Dies ist keine dieser Zeiten.
(Nimmt Eingaben als Liste
[message, word]
. Die Kopfzeile gibt alles sehr hübsch aus, aber die Ausgabe des tatsächlichen Prädikats ist nur eine Zahl, wenn es erfolgreich ist.)bʰ↙.Plᵐ≥₁∧Pz₁≠ᵐ∧
scheint genauso gut für die gleiche Anzahl von Bytes zu funktionieren.quelle
C ++ (gcc) ,
160153150 BytesProbieren Sie es online!
quelle
goto
und ohne alle Fehler ...Perl 5 , 46 Bytes
Verwendet die Regex-Idee von @apsillers.
Probieren Sie es online!
quelle