introduction
L'Enigma est l'une des premières machines à chiffrer à rotor électromécanique utilisées pendant la Seconde Guerre mondiale. Cela signifie qu’après le codage d’une seule lettre, la clé de la lettre suivante serait modifiée. Les Allemands considéraient cela comme incassable , à cause de l'énorme espace clé. Même forcer brutalement était presque impossible. Cependant, il y avait une erreur de conception dans Enigma. Crypter une lettre ne résulterait jamais en soi. Cela signifie que la lettre A
peut chiffrer toutes les lettres sauf la lettre A
.
Prenons un exemple de message codé:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
Un mot typiquement allemand était WETTERBERICHT
ou la météo en anglais. Avec le principe ci-dessus, nous pouvons déterminer à quels endroits le mot pourrait éventuellement être:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Ce n'est pas possible, car le I
fichier ne peut pas être chiffré pour lui-même, nous passons donc à 1 endroit:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Ce n’est pas non plus possible, nous nous déplaçons à nouveau:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
^
Ceci encore n'est pas possible. En fait, la première occurrence possible de WETTERBERICHT
est:
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
0123456789012345678901234567890123456789012345678901234567890123
^
13
Donc, nous retournons la position 0-indexée de la première occurrence possible, qui est 13 .
La tâche
- À partir d’un message codé et d’un mot, trouvez l’indice de la première occurrence possible .
- Supposons que seuls les caractères alphabétiques majuscules de base seront utilisés (
ABCDEFGHIJKLMNOPQRSTUVWXYZ
). - Si aucune occurrence n'est trouvée, vous pouvez générer un nombre entier négatif , un caractère ou rien (par exemple
-1
,X
). - Les entrées peuvent être acceptées en tant qu'argument, sur des sauts de ligne distincts, des listes ou toute autre chose.
- C'est du code-golf , donc la soumission avec le moins d'octets gagne!
Cas de test
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
ne résulterait jamais en unE
. C’est l’objet de tout ce défi.Réponses:
Pyth, 14 octets
Je ne sais pas si c'est correct, mais si l'entrée est impossible, rien n'est écrit dans stdout et une erreur de division zéro est écrite dans stderr. Prend l'entrée sur 2 lignes, la seconde est entourée de guillemets.
Explication:
Essayez-le ici!
la source
JavaScript, 40
En utilisant
replace
, cela mappe l'entrée de texte en clair dans une expression régulière de formulaire/[^H][^E][^L][^L][^O]/
(par exemple, pour l'entrée de texte en clairHELLO
), puis utilisesearch
pour tester le premier index de la sous-chaîne de texte chiffré qui correspond à cette expression rationnelle. Cette expression rationnelle signifie "un motif où le premier caractère n'est pasH
, le second n'est pasE
, etc."$&
est une séquence spéciale pour lareplace
sortie qui substitue la valeur mise en correspondance par le premierreplace
argument (dans ce cas, chaque caractère correspond/./
).la source
$&
! Merci d'avoir appris quelque chose aujourd'hui.$'
en train de rechercher cette réponse, qui fournit" la partie de la chaîne qui précède / suit la sous-chaîne correspondante "Turing Machine Simulator - 15660 octets (non compétitif)
Vous ne pouvez pas avoir un défi Enigma sans lire le code machine.
Testez-le ici
Bref aperçu:
la source
SWI-Prolog, 115 octets
Exemple d'utilisation:
a(`ABCDEFGHIJKL`,`HELLO`,R).
. Ceci utilise les chaînes de codes de caractères déclarées avec des backticks. La réponse est unifiée avecR
. Si aucune correspondance n'est trouvée, ceci est affichéfalse.
.Explication:
Essayez-le ici
la source
Ruby,
91 à79 octetsJe vous maudis
Enumerator
! Pourquoi dois-je convertir chaîne en tableau en énumérateur et en tableau et gaspiller de précieux octets? > :(la source
[*...]
comme alternative golfy à #to_a est une bonne idée.CJam,
1716 octetsEssayez-le ici .
Merci à @PeterTaylor pour la sauvegarde d'un octet.
Explication:
la source
array block #
peut vous faire économiser un personnage:ll:A,ew{A.=:+!}#
ew
(faire des tranches), tout le reste suit juste.MATL , 27 octets
Exemples
Explication
la source
Haskell, 72 octets
Utilisation:
h 0 "DEUTSCHLAND" "XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF"
->11
.Approche récursive simple: si le mot
w
peut être placé au début de la chaînes
, renvoyer le compteur d’indexi
, sinon répéter aveci
incrémenté et la queue des
. Arrêtez-vous et revenez-1
si la longueur des
est inférieure à la longueur dew
.la source
Python 2.7, 111 caractères
Essaie toutes les positions de départ (a) et vérifie si l'une des lettres correspond (en utilisant la liste de compréhension). Il renvoie "None" ("NULL" de Python) si rien n'est trouvé (la fin de la boucle for et rien n'est renvoyé, la valeur par défaut étant "None".
Suite de tests:
la source
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 octets
Ceci est une traduction directe de ma réponse Prolog. Le
brachylog_main/2
prédicat généré attend une liste de deux chaînes de codes de caractères avec la chaîne codée d'abord en entrée et renvoie l'index en sortie, par exemplebrachylog_main([`ABCDEFGHIJKL`,`HELLO`],R).
.Explication
la source
Japt, 12 octets (non compétitif)
Je vais avoir besoin d'aide avec celui-ci.
la source
.search
? facepalmUàVr'."[^$&]
pour 12.PHP - 155 octets
Enregistrez sous
crack.php
et exécutez-le avec les arguments de la ligne de commande. Par exemple:la source
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
, mais probablement une simple itération dans une itération pourrait le faire en moins d'octets.JavaScript,
129121118119 *118 octetsw
est le message codé,t
est la chaîne de test. Cela n'utilise pas de regex, mais compare simplement lettre par lettre, en déplaçant la chaîne de test ("WETTERBERICHT") en ajoutant de l'espace devant elle. Facile et ennuyeux.* cas de test sans correspondance n'a pas fonctionné, maintenant il fonctionne
la source
, 14 caractères / 25 octets
Try it here (Firefox only).
Félicitations à @apsillers pour l'idée.
Explication
la source
TeaScript, 14 octets
20Semblable à la solution JavaScript intelligente de @aspillers .
Non compétitif car il utilise des fonctionnalités créées après ce concours.
Explication
la source
$&
fonctionne pas à la place de${l}
?Ruby,
4336 octetsedit: interpolation de chaîne dans une interpolation de chaîne dans une expression régulière, beurk.
L'approche paresseuse: traduit le mot en regex "négatif" - L'
=~
opérateur fait le reste.Tester:
la source
Python 3 , 79 octets
Essayez-le en ligne!
la source
05AB1E , 14 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Jolf , 14 octets
Essayez-le ici!
la source
Perl, 38 + 1 = 39 octets
où l'entrée ressemble à:
C'est la même idée que celle de javascript.
la source
Java, 136 caractères
Solution basée sur Regex inspirée de la version javascript de apsillers .
la source
Brachylog (v2), 16 octets
Essayez-le en ligne!
Brachylog est généralement très bon pour échouer lorsque la résolution de quelque chose est impossible.
Ce n'est pas un de ces temps.
(prend l'entrée sous forme de liste
[message, word]
. L'en-tête imprime tout cela très joliment mais la sortie du prédicat réel n'est qu'un nombre si elle réussit)bʰ↙.Plᵐ≥₁∧Pz₁≠ᵐ∧
semble fonctionner aussi bien pour le même nombre d'octets.la source
C ++ (gcc) ,
160153150 octetsEssayez-le en ligne!
la source
goto
et sans tous les insectes ...Perl 5 , 46 octets
Utilise l'idée de regex de @apsillers.
Essayez-le en ligne!
la source