Cracking the Enigma?

65

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 Apeut chiffrer toutes les lettres sauf la lettre A.

Prenons un exemple de message codé:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ

Un mot typiquement allemand était WETTERBERICHTou 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 Ifichier 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 WETTERBERICHTest:

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 , 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
Adnan
la source
1
Umm, pourquoi la chaîne encodée change-t-elle au milieu de l'exemple?
Poignée de porte
36
@Doorknob ¯ \ _ (ツ) _ / ¯
Adnan
Il y a des problèmes avec l'introduction: 1. elle n'était pas considérée comme indestructible à cause de l'espace réservé aux clés, mais à cause du système en vertu duquel une lettre change ce qu'elle est traduite en 2. "Le cryptage d'une lettre ne résulterait jamais en lui-même." - oui, après le nombre de caractères disponibles, il devrait en répéter un.
Zelphir Kaltstahl
3
@Zelphir avec le cryptage pour lui-même, je voulais dire que le Ene résulterait jamais en un E. C’est l’objet de tout ce défi.
Adnan

Réponses:

9

Pyth, 14 octets

f!s.eqb@>zTkQ0

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:

               - autoassign z to first input
               - autoassign Q to second input
f            0 - The first value starting from 0 where the output is truthy
   .e       Q  - Enumerate over the second value
        >zT    - z[T:]
       @   k   - The kth item (number in enumeration)
      b        - The character in the enumeration
     q         - Are the two characters equal?
  s            - Sum the values
 !             - Invert them (want first where there isn't a collision)

Essayez-le ici!

Bleu
la source
55

JavaScript, 40

(c,p)=>c.search(p.replace(/./g,"[^$&]"))

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 clair HELLO), puis utilise searchpour 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 pas H, le second n'est pas E, etc."

$&est une séquence spéciale pour la replacesortie qui substitue la valeur mise en correspondance par le premier replaceargument (dans ce cas, chaque caractère correspond /./).

apsillers
la source
16
Oh, wow, c'est une solution vraiment intelligente!
Poignée de porte
2
Je ne savais pas $&! Merci d'avoir appris quelque chose aujourd'hui.
ETHproductions
1
@ETHproductions Moi non plus, jusqu'à aujourd'hui! J'ai également appris $ `et$' 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 "
apsillers
1
Wow, c'est génial! Je devrais lire les docs plus souvent;)
ETHproductions
43

Turing Machine Simulator - 15660 octets (non compétitif)

Vous ne pouvez pas avoir un défi Enigma sans lire le code machine.

0 * * l 0
0 _ _ l ,
, _ , l 1
1 _ 0 r 2
2 * * r 2
2 , * r 3
3 * * r 3
3 , * r 4
4 * * r 4
4 _ * r 13
4 A a l a'                                                                                                                                                                                                        
4 B b l b'                                                                                                                                                                                                        
4 C c l c'                                                                                                                                                                                                        
4 D d l d'                                                                                                                                                                                                        
4 E e l e'                                                                                                                                                                                                        
4 F f l f'                                                                                                                                                                                                        
4 G g l g'                                                                                                                                                                                                        
4 H h l h'                                                                                                                                                                                                        
4 I i l i'                                                                                                                                                                                                        
4 J j l j'                                                                                                                                                                                                        
4 K k l k'                                                                                                                                                                                                        
4 L l l l'                                                                                                                                                                                                        
4 M m l m'                                                                                                                                                                                                        
4 N n l n'                                                                                                                                                                                                        
4 O o l o'                                                                                                                                                                                                        
4 P p l p'                                                                                                                                                                                                        
4 Q q l q'                                                                                                                                                                                                        
4 R r l r'                                                                                                                                                                                                        
4 S s l s'                                                                                                                                                                                                        
4 T t l t'                                                                                                                                                                                                        
4 U u l u'                                                                                                                                                                                                        
4 V v l v'                                                                                                                                                                                                        
4 W w l w'                                                                                                                                                                                                        
4 X x l x'                                                                                                                                                                                                        
4 Y y l y'                                                                                                                                                                                                        
4 Z z l z'
a' * * l a'
a' , * l a
b' * * l b'
b' , * l b
c' * * l c'
c' , * l c
d' * * l d'
d' , * l d
e' * * l e'
e' , * l e
f' * * l f'
f' , * l f
g' * * l g'
g' , * l g
h' * * l h'
h' , * l h
i' * * l i'
i' , * l i
j' * * l j'
j' , * l j
k' * * l k'
k' , * l k
l' * * l l'
l' , * l l
m' * * l m'
m' , * l m
n' * * l n'
n' , * l n
o' * * l o'
o' , * l o
p' * * l p'
p' , * l p
q' * * l q'
q' , * l q
r' * * l r'
r' , * l r
s' * * l s'
s' , * l s
t' * * l t'
t' , * l t
u' * * l u'
u' , * l u
v' * * l v'
v' , * l v
w' * * l w'
w' , * l w
x' * * l x'
x' , * l x
y' * * l y'
y' , * l y
z' * * l z'
z' , * l z

a * * l a
a _ * r A
a a * r A
a b * r A
a c * r A
a d * r A
a e * r A
a f * r A
a g * r A
a h * r A
a i * r A
a j * r A
a k * r A
a l * r A
a m * r A
a n * r A
a o * r A
a p * r A
a q * r A
a r * r A
a s * r A
a t * r A
a u * r A
a v * r A
a w * r A
a x * r A
a y * r A
a z * r A
b * * l b
b _ * r B
b a * r B
b b * r B
b c * r B
b d * r B
b e * r B
b f * r B
b g * r B
b h * r B
b i * r B
b j * r B
b k * r B
b l * r B
b m * r B
b n * r B
b o * r B
b p * r B
b q * r B
b r * r B
b s * r B
b t * r B
b u * r B
b v * r B
b w * r B
b x * r B
b y * r B
b z * r B
c * * l c
c _ * r C
c a * r C
c b * r C
c c * r C
c d * r C
c e * r C
c f * r C
c g * r C
c h * r C
c i * r C
c j * r C
c k * r C
c l * r C
c m * r C
c n * r C
c o * r C
c p * r C
c q * r C
c r * r C
c s * r C
c t * r C
c u * r C
c v * r C
c w * r C
c x * r C
c y * r C
c z * r C
d * * l d
d _ * r D
d a * r D
d b * r D
d c * r D
d d * r D
d e * r D
d f * r D
d g * r D
d h * r D
d i * r D
d j * r D
d k * r D
d l * r D
d m * r D
d n * r D
d o * r D
d p * r D
d q * r D
d r * r D
d s * r D
d t * r D
d u * r D
d v * r D
d w * r D
d x * r D
d y * r D
d z * r D
e * * l e
e _ * r E
e a * r E
e b * r E
e c * r E
e d * r E
e e * r E
e f * r E
e g * r E
e h * r E
e i * r E
e j * r E
e k * r E
e l * r E
e m * r E
e n * r E
e o * r E
e p * r E
e q * r E
e r * r E
e s * r E
e t * r E
e u * r E
e v * r E
e w * r E
e x * r E
e y * r E
e z * r E
f * * l f
f _ * r F
f a * r F
f b * r F
f c * r F
f d * r F
f e * r F
f f * r F
f g * r F
f h * r F
f i * r F
f j * r F
f k * r F
f l * r F
f m * r F
f n * r F
f o * r F
f p * r F
f q * r F
f r * r F
f s * r F
f t * r F
f u * r F
f v * r F
f w * r F
f x * r F
f y * r F
f z * r F
g * * l g
g _ * r G
g a * r G
g b * r G
g c * r G
g d * r G
g e * r G
g f * r G
g g * r G
g h * r G
g i * r G
g j * r G
g k * r G
g l * r G
g m * r G
g n * r G
g o * r G
g p * r G
g q * r G
g r * r G
g s * r G
g t * r G
g u * r G
g v * r G
g w * r G
g x * r G
g y * r G
g z * r G
h * * l h
h _ * r H
h a * r H
h b * r H
h c * r H
h d * r H
h e * r H
h f * r H
h g * r H
h h * r H
h i * r H
h j * r H
h k * r H
h l * r H
h m * r H
h n * r H
h o * r H
h p * r H
h q * r H
h r * r H
h s * r H
h t * r H
h u * r H
h v * r H
h w * r H
h x * r H
h y * r H
h z * r H
i * * l i
i _ * r I
i a * r I
i b * r I
i c * r I
i d * r I
i e * r I
i f * r I
i g * r I
i h * r I
i i * r I
i j * r I
i k * r I
i l * r I
i m * r I
i n * r I
i o * r I
i p * r I
i q * r I
i r * r I
i s * r I
i t * r I
i u * r I
i v * r I
i w * r I
i x * r I
i y * r I
i z * r I
j * * l j
j _ * r J
j a * r J
j b * r J
j c * r J
j d * r J
j e * r J
j f * r J
j g * r J
j h * r J
j i * r J
j j * r J
j k * r J
j l * r J
j m * r J
j n * r J
j o * r J
j p * r J
j q * r J
j r * r J
j s * r J
j t * r J
j u * r J
j v * r J
j w * r J
j x * r J
j y * r J
j z * r J
k * * l k
k _ * r K
k a * r K
k b * r K
k c * r K
k d * r K
k e * r K
k f * r K
k g * r K
k h * r K
k i * r K
k j * r K
k k * r K
k l * r K
k m * r K
k n * r K
k o * r K
k p * r K
k q * r K
k r * r K
k s * r K
k t * r K
k u * r K
k v * r K
k w * r K
k x * r K
k y * r K
k z * r K
l * * l l
l _ * r L
l a * r L
l b * r L
l c * r L
l d * r L
l e * r L
l f * r L
l g * r L
l h * r L
l i * r L
l j * r L
l k * r L
l l * r L
l m * r L
l n * r L
l o * r L
l p * r L
l q * r L
l r * r L
l s * r L
l t * r L
l u * r L
l v * r L
l w * r L
l x * r L
l y * r L
l z * r L
m * * l m
m _ * r M
m a * r M
m b * r M
m c * r M
m d * r M
m e * r M
m f * r M
m g * r M
m h * r M
m i * r M
m j * r M
m k * r M
m l * r M
m m * r M
m n * r M
m o * r M
m p * r M
m q * r M
m r * r M
m s * r M
m t * r M
m u * r M
m v * r M
m w * r M
m x * r M
m y * r M
m z * r M
n * * l n
n _ * r N
n a * r N
n b * r N
n c * r N
n d * r N
n e * r N
n f * r N
n g * r N
n h * r N
n i * r N
n j * r N
n k * r N
n l * r N
n m * r N
n n * r N
n o * r N
n p * r N
n q * r N
n r * r N
n s * r N
n t * r N
n u * r N
n v * r N
n w * r N
n x * r N
n y * r N
n z * r N
o * * l o
o _ * r O
o a * r O
o b * r O
o c * r O
o d * r O
o e * r O
o f * r O
o g * r O
o h * r O
o i * r O
o j * r O
o k * r O
o l * r O
o m * r O
o n * r O
o o * r O
o p * r O
o q * r O
o r * r O
o s * r O
o t * r O
o u * r O
o v * r O
o w * r O
o x * r O
o y * r O
o z * r O
p * * l p
p _ * r P
p a * r P
p b * r P
p c * r P
p d * r P
p e * r P
p f * r P
p g * r P
p h * r P
p i * r P
p j * r P
p k * r P
p l * r P
p m * r P
p n * r P
p o * r P
p p * r P
p q * r P
p r * r P
p s * r P
p t * r P
p u * r P
p v * r P
p w * r P
p x * r P
p y * r P
p z * r P
q * * l q
q _ * r Q
q a * r Q
q b * r Q
q c * r Q
q d * r Q
q e * r Q
q f * r Q
q g * r Q
q h * r Q
q i * r Q
q j * r Q
q k * r Q
q l * r Q
q m * r Q
q n * r Q
q o * r Q
q p * r Q
q q * r Q
q r * r Q
q s * r Q
q t * r Q
q u * r Q
q v * r Q
q w * r Q
q x * r Q
q y * r Q
q z * r Q
r * * l r
r _ * r R
r a * r R
r b * r R
r c * r R
r d * r R
r e * r R
r f * r R
r g * r R
r h * r R
r i * r R
r j * r R
r k * r R
r l * r R
r m * r R
r n * r R
r o * r R
r p * r R
r q * r R
r r * r R
r s * r R
r t * r R
r u * r R
r v * r R
r w * r R
r x * r R
r y * r R
r z * r R
s * * l s
s _ * r S
s a * r S
s b * r S
s c * r S
s d * r S
s e * r S
s f * r S
s g * r S
s h * r S
s i * r S
s j * r S
s k * r S
s l * r S
s m * r S
s n * r S
s o * r S
s p * r S
s q * r S
s r * r S
s s * r S
s t * r S
s u * r S
s v * r S
s w * r S
s x * r S
s y * r S
s z * r S
t * * l t
t _ * r T
t a * r T
t b * r T
t c * r T
t d * r T
t e * r T
t f * r T
t g * r T
t h * r T
t i * r T
t j * r T
t k * r T
t l * r T
t m * r T
t n * r T
t o * r T
t p * r T
t q * r T
t r * r T
t s * r T
t t * r T
t u * r T
t v * r T
t w * r T
t x * r T
t y * r T
t z * r T
u * * l u
u _ * r U
u a * r U
u b * r U
u c * r U
u d * r U
u e * r U
u f * r U
u g * r U
u h * r U
u i * r U
u j * r U
u k * r U
u l * r U
u m * r U
u n * r U
u o * r U
u p * r U
u q * r U
u r * r U
u s * r U
u t * r U
u u * r U
u v * r U
u w * r U
u x * r U
u y * r U
u z * r U
v * * l v
v _ * r V
v a * r V
v b * r V
v c * r V
v d * r V
v e * r V
v f * r V
v g * r V
v h * r V
v i * r V
v j * r V
v k * r V
v l * r V
v m * r V
v n * r V
v o * r V
v p * r V
v q * r V
v r * r V
v s * r V
v t * r V
v u * r V
v v * r V
v w * r V
v x * r V
v y * r V
v z * r V
w * * l w
w _ * r W
w a * r W
w b * r W
w c * r W
w d * r W
w e * r W
w f * r W
w g * r W
w h * r W
w i * r W
w j * r W
w k * r W
w l * r W
w m * r W
w n * r W
w o * r W
w p * r W
w q * r W
w r * r W
w s * r W
w t * r W
w u * r W
w v * r W
w w * r W
w x * r W
w y * r W
w z * r W
x * * l x
x _ * r X
x a * r X
x b * r X
x c * r X
x d * r X
x e * r X
x f * r X
x g * r X
x h * r X
x i * r X
x j * r X
x k * r X
x l * r X
x m * r X
x n * r X
x o * r X
x p * r X
x q * r X
x r * r X
x s * r X
x t * r X
x u * r X
x v * r X
x w * r X
x x * r X
x y * r X
x z * r X
y * * l y
y _ * r Y
y a * r Y
y b * r Y
y c * r Y
y d * r Y
y e * r Y
y f * r Y
y g * r Y
y h * r Y
y i * r Y
y j * r Y
y k * r Y
y l * r Y
y m * r Y
y n * r Y
y o * r Y
y p * r Y
y q * r Y
y r * r Y
y s * r Y
y t * r Y
y u * r Y
y v * r Y
y w * r Y
y x * r Y
y y * r Y
y z * r Y
z * * l z
z , * r Z
z a * r Z
z b * r Z
z c * r Z
z d * r Z
z e * r Z
z f * r Z
z g * r Z
z h * r Z
z i * r Z
z j * r Z
z k * r Z
z l * r Z
z m * r Z
z n * r Z
z o * r Z
z p * r Z
z q * r Z
z r * r Z
z s * r Z
z t * r Z
z u * r Z
z v * r Z
z w * r Z
z x * r Z
z y * r Z
z z * r Z
A * * * 5
A A * l 6
B * * * 5
B B * l 6
C * * * 5
C C * l 6
D * * * 5
D D * l 6
E * * * 5
E E * l 6
F * * * 5
F F * l 6
G * * * 5
G G * l 6
H * * * 5
H H * l 6
I * * * 5
I I * l 6
J * * * 5
J J * l 6
K * * * 5
K K * l 6
L * * * 5
L L * l 6
M * * * 5
M M * l 6
N * * * 5
N N * l 6
O * * * 5
O O * l 6
P * * * 5
P P * l 6
Q * * * 5
Q Q * l 6
R * * * 5
R R * l 6
S * * * 5
S S * l 6
T * * * 5
T T * l 6
U * * * 5
U U * l 6
V * * * 5
V V * l 6
W * * * 5
W W * l 6
X * * * 5
X X * l 6
Y * * * 5
Y Y * l 6
Z * * * 5
Z Z * l 6
5 , * r 15
5 A a r 7
5 B b r 7
5 C c r 7
5 D d r 7
5 E e r 7
5 F f r 7
5 G g r 7
5 H h r 7
5 I i r 7
5 J j r 7
5 K k r 7
5 L l r 7
5 M m r 7
5 N n r 7
5 O o r 7
5 P p r 7
5 Q q r 7
5 R r r 7
5 S s r 7
5 T t r 7
5 U u r 7
5 V v r 7
5 W w r 7
5 X x r 7
5 Y y r 7
5 Z z r 7
7 * * r 7
7 , * r 4
6 * * l 6
6 _ * r 8
8 * _ r 9
9 * * r 9
9 _ * l 10
9 a A r 9
9 b B r 9
9 c C r 9
9 d D r 9
9 e E r 9
9 f F r 9
9 g G r 9
9 h H r 9
9 i I r 9
9 j J r 9
9 k K r 9
9 l L r 9
9 m M r 9
9 n N r 9
9 o O r 9
9 p P r 9
9 q Q r 9
9 r R r 9
9 s S r 9
9 t T r 9
9 u U r 9
9 v V r 9
9 w W r 9
9 x X r 9
9 y Y r 9
9 z Z r 9
10 * * l 10
10 , * l 11
11 * * l 11
11 , * l 12
12 _ 1 r 2
12 0 1 r 2
12 1 2 r 2
12 2 3 r 2
12 3 4 r 2
12 4 5 r 2
12 5 6 r 2
12 6 7 r 2
12 7 8 r 2
12 8 9 r 2
12 9 0 l 12
13 * _ l 13
13 , _ l 14
14 * _ l 14
14 , _ l halt
15 * * r 15
15 _ * l 16
16 * _ l 16
16 , _ l 17
17 * _ l 17
17 , _ l 18
18 * _ l 18
18 _ x * halt

Testez-le ici

Bref aperçu:

  1. Mettre en place un compteur à gauche
  2. Recherchez la première lettre majuscule dans la cible et mettez-la en minuscule. Si toutes les lettres sont en minuscules, passez à l'étape 5.
  3. Trouver la première lettre majuscule dans le code. Si la lettre la plus récente correspond, passez à l'étape 4. Sinon, mettez la lettre en minuscule et revenez à l'étape 2.
  4. Incrémenter le compteur, mettre toutes les lettres en majuscules, supprimer la première lettre du code. Revenez à l'étape 2. S'il ne reste aucune lettre dans le code, retournez la bande vierge et imprimez x.
  5. Effacer tout le ruban sauf le comptoir.
KoreanwGlasses
la source
En outre, lors des tests, le format de l'entrée doit être le suivant: code, cible (sans espace)
KoreanwGlasses
Combien de temps a-t-il fallu pour faire cela?
Adnan
18
J'ai commencé mes devoirs à 2h00. A été distrait à 2:15. Commencé à 2.20. Posté à 16h20. Donc environ 2 heures.
KoreanwGlasses
5
+1, dans PPCGSE, il n'est pas nécessaire que la compétition soit appréciée!
9575 octets (et le décompte actuel dans l'en-tête est faux, il y a des espaces superflus et des noms d'états inutilement longs).
Erik l'Outgolfer
8

SWI-Prolog, 115 octets

a(S,W,R):-length(S,L),length(W,M),N is L-M,between(0,N,I),\+ (between(0,M,J),K is I+J,nth0(J,W,A),nth0(K,S,A)),R=I.

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 avec R. Si aucune correspondance n'est trouvée, ceci est affiché false..

Explication:

a(S,W,R):-
    length(S,L),length(W,M),     
    N is L-M,
    between(0,N,I),             % I is successively unified with an integer between 0 
                                % and the last possible index of the coded message

    \+ (                        % This will only be true if what's inside the parentheses 
                                % cannot be proven to be true

        between(0,M,J),         % J is successively unified with an integer between 0 
                                % and the length of the desired word
        K is I+J,
        nth0(J,W,A),nth0(K,S,A) % Check if one letter is the same in both string at 
                                % the same index
    ),                          % If it the case, then it will be 'true' and thus 
                                % the predicate \+ will be false, meaning we need to
                                % backtrack to try a different value of I

    R=I.                        % If we get here it means it didn't find any matching 
                                % letter for this value of I, which is then the answer.

Essayez-le ici

Fataliser
la source
7

Ruby, 91 à 79 octets

->a,b{[*a.chars.each_cons(b.size)].index{|x|x.zip(b.chars).all?{|y|y.uniq==y}}}

Je vous maudis Enumerator! Pourquoi dois-je convertir chaîne en tableau en énumérateur et en tableau et gaspiller de précieux octets? > :(

->a,b{                  # define lambda
[*                      # convert to array...
  a.chars               # get enumerator from string
  .each_cons(b.size)    # each consecutive group of (b.size) letters
]
.index{|x|              # find index of...
  x.zip(b.chars)        # zip group with second input string
  .all?{|y|             # is the block true for every element?
    y.uniq==y           # uniqueify results in same array (no dups)
}}}
Poignée de porte
la source
Utiliser [*...]comme alternative golfy à #to_a est une bonne idée.
Wayne Conrad
7

CJam, 17 16 octets

ll:A,ew{A.=:+!}#

Essayez-le ici .

Merci à @PeterTaylor pour la sauvegarde d'un octet.

Explication:

ll:A,ew    e# Finds every slice in the coded message with the length of the word
{A.=:+     e# Compare the characters in each slice to the characters in the word, and add up the result. If the sum is zero, then the slice and the word have no characters in common.
!}#        e# Invert truthiness (0 -> 1, non-0 -> 0) Return index of first truthy value.
geokavel
la source
array block #peut vous faire économiser un personnage:ll:A,ew{A.=:+!}#
Peter Taylor
Incroyable à quel point CJam peut être joué au golf dans presque toutes les tâches ...: -o
agtoever
@agtoever Je ne dirais pas que c'est vraiment jouer au golf, parce que 17 octets ont été mon tout premier essai. La fonctionnalité clé est ew(faire des tranches), tout le reste suit juste.
geokavel
6

MATL , 27 octets

jYbZ)tnb!wlhYCw!=a~ftn?1)1-

Exemples

>> matl jYbZ)tnb!wlhYCw!=a~ftn?1)1-
> EEEEEEEEEEEE, HELLO

>> matl jYbZ)tnb!wlhYCw!=a~ftn?1)1-
> XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF, DEUTSCHLAND
11

Explication

j           % input string
YbZ)        % split into two strings based on space. Trailing comma is not a problem
tnb!wlhYC   % arrange first string into sliding columns of the size of the second
w!=         % compare with transposed second string, element-wise with broadcast
a~          % detect columns where all values are 0 (meaning unequal characters)
f           % find indices of such columns
tn?         % if there's at least one such column
1)1-        % pick index of the first and subtract 1 for 0-based indexing
Luis Mendo
la source
4

Haskell, 72 octets

l=length
h i w s|l s<l w= -1|and$zipWith(/=)w s=i|1<2=h(i+1)w$tail s
h 0

Utilisation: h 0 "DEUTSCHLAND" "XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF"-> 11.

Approche récursive simple: si le mot wpeut être placé au début de la chaîne s, renvoyer le compteur d’index i, sinon répéter avec iincrémenté et la queue de s. Arrêtez-vous et revenez -1si la longueur de sest inférieure à la longueur de w.

nimi
la source
4

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".

def d(c,s):
 for a in range(len(c)):
  if a not in [((c+s)[a+i:]).index(l)+a for i,l in enumerate(s)]:
   return a

Suite de tests:

cases = {
         ("BHGEFXWFTIUPITHHLPETTTCLOEWOELM","WETTERBERICHT"):13,
         ("ABCDEFGHIJKL","HELLO"):0,
         ("EEEEEEEEEEEE","HELLO"):-1,
         ("XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF","DEUTSCHLAND"):11
        }

for idx,(code,string) in enumerate(cases):
    output=d(code,string)
    print "Case: {}: d({:<35},{:<16}) gives: {}. Correct answer is: {}.".format(idx+1,code,string,output,cases[(code,string)])
agtoever
la source
Vous avez en fait 114 octets, pas 111. Voici une version de 106 octets: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
movatica Le
4

Brachylog , 48 octets

[S:W]hlL,WlM,L-M=:0reI,'(0:MeJ+I=:SrmA,W:JmA),I.

Ceci est une traduction directe de ma réponse Prolog. Le brachylog_main/2pré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 exemple brachylog_main([`ABCDEFGHIJKL`,`HELLO`],R)..

Explication

[S:W]                                            § Unify the input with the list [S,W]

     hlL,WlM,                                    § L and M are the length of S and W

             L-M=:0reI,                          § Enumerate integers between 0 and the 
                                                 § last possible index

                       '(                   ),I. § Unify the output with the current 
                                                 § enumerated integer if what's inside the 
                                                 § parenthesis cannot be proven to be true

                         0:MeJ                   § Enumerate integers between 0 and the
                                                 § length of the word desired

                              +I=:SrmA,W:JmA     § Check if both strings contain at matching
                                                 § indexes the same letter (unified with A)
Fataliser
la source
3

Japt, 12 octets (non compétitif)

UàVr'."[^$&]

Je vais avoir besoin d'aide avec celui-ci.

Maman Fun Roll
la source
Euh ... Japt n'a pas .search? facepalm
ETHproductions
Cela peut maintenant être fait avec UàVr'."[^$&]pour 12.
ETHproductions
Cool, on gagne maintenant!
Mama Fun Roll
Étant donné que la dernière révision de cette réponse utilise des fonctionnalités postérieures à la question, je la marque comme non compétitive.
Mego
Oh, j'ai oublié ça: P Merci!
Mama Fun Roll
2

PHP - 155 octets

<?php for($p=$argv[1],$q=$argv[2],$l=strlen($q),$i=0,$r=-1;$i<strlen($p)-$l;$i++)if(levenshtein($q,substr($p,$i,$l),2,1,2)==$l){$r=$i;break;}echo$r."\n";

Enregistrez sous crack.phpet exécutez-le avec les arguments de la ligne de commande. Par exemple:

$ php crack.php BHGEFXWFTIUPITHHLPETTTCLOEWOELM WETTERBERICHT
13

la source
Vous pouvez économiser 25 octets et 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↵";
graver
@insertusernamehere - Wow, c'est impressionnant! Tellement que je ne me sentirais pas bien de l'utiliser! Je pensais utiliser intelligemment levenshtein, mais probablement une simple itération dans une itération pourrait le faire en moins d'octets.
2

JavaScript, 129 121 118 119 * 118 octets

(w,t){for(j=0;(x=t.length)<(y=w.length);t=' '+t,j++){for(a=i=0;++i<y;)w[i]==t[i]?a=1:a;if(!a)break}return x==y?-1:j}

west le message codé, test 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

nicael
la source
2

, 14 caractères / 25 octets

îĊⱮ(í,↪`⁅⦃$}]`

Try it here (Firefox only).

Félicitations à @apsillers pour l'idée.

Explication

               // implicit: î = input1, í = input2
îĊ             // search for first occurrence of:
  Ɱ(í,↪`⁅⦃$}]` // regex created by wrapping each word in [^ and ] (negation matches)
Maman Fun Roll
la source
Quiconque a voté contre, y a-t-il une raison à cela?
Mama Fun Roll
2

TeaScript, 14 octets 20

xc(yl#`[^${l}]

Semblable à la solution JavaScript intelligente de @aspillers .

Non compétitif car il utilise des fonctionnalités créées après ce concours.

Explication

             // Implicit: x = 1st input, y = 2nd input
x            // First input
 c           // returns index of regex match
 yl#         // Loop through every char in `y`
    `[^${l}] // Replace template, ${l} because current char in `y`
Downgoat
la source
Ne $&fonctionne pas à la place de ${l}?
ETHproductions
@ETHproductions pas dans ce cas parce que j'utilise une boucle plutôt qu'un remplacement
Downgoat
2

Ruby, 43 36 octets

edit: 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.

->m,w{m=~/#{"[^#{w.chars*'][^'}]"}/}

Tester:

f=->m,w{m=~/#{"[^#{w.chars*'][^'}]"}/}

require "minitest/autorun"

describe :f do
  it "works for the given test cases" do
    assert_equal 13, f["BHGEFXWFTIUPITHHLPETTTCLOEWOELM", "WETTERBERICHT"]
    assert_equal 0, f["ABCDEFGHIJKL", "HELLO"]
    assert_equal nil, f["EEEEEEEEEEEE", "HELLO"]
    assert_equal 11, f["XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF", "DEUTSCHLAND"]
    assert_equal nil, f["HKKH", "JJJJJ"]
  end
end
Daniero
la source
2

05AB1E , 14 octets

ŒIgùDʒø€Ëà_}нk

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

Π              # Get all substrings of the first (implicit) input
 Ig             # Get the length of the second input
   ù            # Only leave the substrings of that length
    D           # Duplicate the list of remaining substrings
     ʒ          # Filter the copy by:
      ø         #  Zip/transpose; swapping rows/columns the current substring with
                #  the second (implicit) input
       €Ë       #  Check for each if both characters are equal (1 if truthy; 0 if falsey)
         à      #  Get the maximum (basically equal to an `any` builtin)
               #  And invert the boolean (!= 1)
              # After the filter: only leave the first substring
             k  # And get its index in the duplicated list (-1 if none are found)
                # (which is output implicitly as result)
Kevin Cruijssen
la source
2
Mec, c'était supposé être la réponse de @ Emigna;). Je voulais venir ici et faire une blague à son sujet en répondant à une question adnan contenant presque son nom. +1 (remarquez que vous avez répondu 4 ans après le fait après avoir posté ce commentaire après le fait).
Urne Magic Octopus
@MagicOctopusUrn Quand j'ai vu le défi, je pensais la même chose, mais @Emigna répond habituellement à de nouvelles réponses et ne regarde pas aussi souvent les réponses existantes. Donc, comme celui-ci n’a pas eu de réponses 05AB1E, j’ai pensé en ajouter une. Vous avez effectivement raison, @Emigna aurait été le mieux placé pour relever ce défi. ; p
Kevin Cruijssen
1

Jolf , 14 octets

Essayez-le ici!

 siρI".'[^$&]
_s            search
  i            input 1 for
    I          input 2
   ρ            replacing (2 byte rho character)
     ".'         all characters
        [^$&]    with that
Conor O'Brien
la source
1

Perl, 38 + 1 = 39 octets

perl -E "$r=<>=~s!.![^$&]!gr;say@-if<>=~/$r/x" < input

où l'entrée ressemble à:

WETTERBERICHT
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ

C'est la même idée que celle de javascript.

alexander brett
la source
Le 'x' n'est pas nécessaire
Zaid
1

Java, 136 caractères

Solution basée sur Regex inspirée de la version javascript de apsillers .

class L{public static void main(String[]a){a=a[0].split(a[1].replaceAll("(.)","[^$1]"));System.out.print(a.length>1?a[0].length():-1);}}
Minimal
la source
1

Brachylog (v2), 16 octets

bʰ↙.Pz₁≠ᵐzhc~hP∧

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)

                    The input
b                   with a number of letters removed from the beginning
 ʰ                  of its first element
  ↙.                where that number is the output
    P               is P
     z₁             which with its elements zipped, without cycling
       ≠ᵐ           contains no duplicate pairs
         z          and which zipped back
          h         has a first element
           c        which concatenated
            ~h      is the first element of
              P     P
               ∧    (which is not the output).

bʰ↙.Plᵐ≥₁∧Pz₁≠ᵐ∧ semble fonctionner aussi bien pour le même nombre d'octets.

Chaîne non liée
la source
0

C ++ (gcc) , 160 153 150 octets

#include<map>
int f(std::string c,std::string w){int i=-1,k,e=1;while(e&&w.size()+i++<c.size())for(e=k=0;k<w.size();)e+=c[i+k]==w[k++];return e?-1:i;}

Essayez-le en ligne!

movatica
la source
1
@ceilingcat: vous pouvez utiliser 157 octets Le code échoue pour deux cas de test (tout comme le premier). Je l'ai corrigé pour quelques octets supplémentaires.
movatica
1
De plus, votre initialisation de k dans la boucle externe a introduit un autre bogue dans lequel, à chaque itération, un caractère de moins était comparé.
movatica
Il s'avère que c'est encore plus court sans gotoet sans tous les insectes ...
movatica