Das Rätsel knacken?


65

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 Amit 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 Inicht 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 , 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

1
Umm, warum ändert sich die codierte Zeichenfolge in der Mitte des Beispiels?
Türklinke

36
@Doorknob ¯ ¯ \ _ (ツ) _ / ¯
Adnan

Es gibt Probleme mit der Einführung: 1. Es wurde aufgrund des Schlüsselraums nicht als unzerbrechlich angesehen, aber aufgrund des Systems, dass ein Brief seine Übersetzung ändert. 2. "Das Verschlüsseln eines Briefes würde niemals zu sich selbst führen." - ja, nach der Anzahl der verfügbaren Zeichen müsste es eines wiederholen.
Zelphir Kaltstahl

3
@Zelphir mit sich selbst verschlüsseln meinte ich, dass das Eniemals zu einem führen würde E. Darum geht es bei dieser ganzen Herausforderung.
Adnan

Antworten:


9

Pyth, 14 Bytes

f!s.eqb@>zTkQ0

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:

               - 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)

Probieren Sie es hier aus!


55

JavaScript, 40

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

Unter Verwendung von replaceordnet dies die Klartexteingabe einem regulären Ausdruck der Form zu /[^H][^E][^L][^L][^O]/(z. B. für die Klartexteingabe HELLO) und searchtestet dann, ob der erste Index der Chiffretext-Teilzeichenfolge mit dieser Regex übereinstimmt. Dieser Ausdruck bedeutet "ein Muster, bei dem das erste Zeichen nicht H, das zweite Zeichen nicht Eusw. ist".

$&ist eine spezielle Sequenz für die replaceAusgabe , die den mit dem ersten replaceArgument übereinstimmenden Wert ersetzt (in diesem Fall jedes einzelne Zeichen, das mit übereinstimmt /./).


16
Oh, wow, das ist eine wirklich clevere Lösung!
Türklinke

2
Ich wusste es nicht $&! Danke, dass du mir heute etwas beigebracht hast.
ETHproductions

1
@ETHproductions Ich auch nicht, bis heute! Ich habe auch von $ `und$' im Zuge der Untersuchung dieser Antwort erfahren , die" den Teil der Zeichenfolge
angibt

1
Wow das ist großartig! Ich sollte die Dokumente öfter lesen;)
ETHproductions

43

Turing Machine Simulator - 15660 Bytes (nicht konkurrierend)

Ich kann keine Enigma-Herausforderung haben, ohne den Maschinencode zu verändern.

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

Testen Sie es hier

Kurzübersicht:

  1. Stellen Sie links einen Schalter auf
  2. Suchen Sie den ersten Großbuchstaben im Ziel und setzen Sie ihn in Kleinbuchstaben. Wenn alle Buchstaben in Kleinbuchstaben geschrieben sind, fahren Sie mit Schritt 5 fort.
  3. Suchen Sie den ersten Großbuchstaben im Code. Wenn der letzte Buchstabe übereinstimmt, fahren Sie mit Schritt 4 fort. Anderenfalls Kleinbuchstaben eingeben und mit Schritt 2 fortfahren.
  4. Inkrementieren Sie den Zähler, schreiben Sie alle Buchstaben in Großbuchstaben und löschen Sie den ersten Buchstaben im Code. Fahren Sie mit Schritt 2 fort. Wenn der Code keine Buchstaben mehr enthält, geben Sie das Klebeband zurück und drucken Sie x.
  5. Löschen Sie das gesamte Band bis auf den Zähler.

Außerdem sollte beim Testen das Format der Eingabe sein: Code, Ziel (kein Leerzeichen)
KoreanwGlasses

Wie lange hat das gedauert?
Adnan

18
Begann meine Hausaufgaben um 2:00 Uhr. Wurde um 2:15 abgelenkt. Begonnen um 2.20. Gepostet um 4:20. Also ungefähr 2 Stunden.
KoreanwGlasses

5
+1, in PPCGSE muss es nicht konkurrieren, um gewürdigt zu werden!

9575 Bytes (und der aktuelle Bytecount im Header ist falsch, es gibt überflüssige Leerzeichen und einige unnötig lange Zustandsnamen).
Erik der Outgolfer

8

SWI-Prolog, 115 Bytes

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.

Anwendungsbeispiel: a(`ABCDEFGHIJKL`,`HELLO`,R).. Dies verwendet die Zeichencodes, die mit Backticks deklariert wurden. Die Antwort ist vereinheitlicht mit R. Wenn keine Übereinstimmung gefunden wird, wird diese ausgegeben false..

Erläuterung:

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.

Probieren Sie es hier aus


7

Ruby, 91 79 Bytes

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

Verfluche dich Enumerator! Warum muss ich von String zu Array zu Enumerator konvertieren, um wertvolle Bytes zu ordnen und zu verschwenden? > :(

->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)
}}}

Die Verwendung [*...]als Golf-Alternative zu #to_a ist eine nette Geste.
Wayne Conrad

7

CJam, 17 16 Bytes

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

Probieren Sie es hier aus .

Vielen Dank an @PeterTaylor für das Speichern eines Bytes.

Erläuterung:

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.

array block #können Sie ein Zeichen sparen:ll:A,ew{A.=:+!}#
Peter Taylor

Erstaunlich, wie weit CJam in fast jeder Aufgabe eingesetzt werden kann ...: -o
seit dem

@agtoever Ich würde nicht sagen, dass es wirklich Golf ist, weil 17 Bytes mein allererster Versuch war. Das Hauptmerkmal ist ew(Slices machen), alles andere folgt einfach.
Geokavel

6

MATL , 27 Bytes

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

Beispiele

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

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

Erläuterung

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

4

Haskell, 72 Bytes

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

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

Einfacher rekursiver Ansatz: Wenn das Wort wam Anfang der Zeichenfolge platziert werden kann s, geben Sie den Indexzähler zurück i, andernfalls wiederholen Sie den iVorgang mit Inkrement und dem Ende von s. Halten Sie an und kehren Sie zurück, -1wenn die Länge von skleiner als die Länge von ist w.


4

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

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

Testsuite:

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)])

Sie haben tatsächlich 114 Bytes, nicht 111. Hier ist eine 106-Byte-Version: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

4

Brachylog , 48 Bytes

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

Dies ist eine direkte Übersetzung meiner Prolog-Antwort. Das brachylog_main/2generierte 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, z brachylog_main([`ABCDEFGHIJKL`,`HELLO`],R)..

Erläuterung

[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)

3

Japt, 12 Bytes (nicht konkurrenzfähig)

UàVr'."[^$&]

Ich brauche hier Hilfe.


Ähhh ... Japt hat nicht .search? facepalm
ETHproductions

Dies ist ab sofort UàVr'."[^$&]für 12.
ETHproductions

Cool, wir gewinnen jetzt!
Mama Fun Roll

Da die letzte Überarbeitung dieser Antwort Funktionen verwendet, die die Frage nachträglich beantworten, wird sie als nicht wettbewerbsfähig markiert.
Mego

Oh vergaß das: P Danke!
Mama Fun Roll

2

PHP - 155 Bytes

<?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";

Speichern unter crack.phpund mit den Argumenten in der Befehlszeile ausführen. Z.B:

$ php crack.php BHGEFXWFTIUPITHHLPETTTCLOEWOELM WETTERBERICHT
13

Sie können 25 Bytes sparen und es auf 130 Bytesfor($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↵";
reduzieren

@insertusernamehere - Wow, das ist beeindruckend! So sehr, dass ich mich nicht richtig fühle, wenn ich es benutze! Ich dachte, ich wäre clever levenshtein, aber wahrscheinlich könnte eine einfache Iteration innerhalb einer Iteration dies in weniger Bytes tun.

2

JavaScript, 129 121 118 119 * 118 Byte

(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}

wist die codierte Nachricht, tist 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


2

𝔼𝕊𝕄𝕚𝕟 14 Zeichen / 25 Byte

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

Try it here (Firefox only).

Ein großes Lob an @apsillers für die Idee.

Erläuterung

               // implicit: î = input1, í = input2
îĊ             // search for first occurrence of:
  Ɱ(í,↪`⁅⦃$}]` // regex created by wrapping each word in [^ and ] (negation matches)

Wer hat das abgelehnt, gibt es einen Grund dafür?
Mama Fun Roll

2

TeaScript, 14 Bytes 20

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

Ähnlich wie bei @aspillers clevere JavaScript- Lösung .

Nicht konkurrierend, da dies Funktionen verwendet, die nach diesem Wettbewerb erstellt wurden.

Erläuterung

             // 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`

Funktioniert $&nicht anstelle von ${l}?
ETHproductions

@ETHproductions nicht in diesem Fall, weil ich eine Schleife anstelle eines
Ersatzes verwende

2

Ruby, 43 36 Bytes

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

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

Prüfung:

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


2

05AB1E , 14 Bytes

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

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

Π              # 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)

2
Alter, das sollte eigentlich @ Emignas Antwort sein;). Ich wollte hierher kommen und einen Witz darüber machen, dass er eine Adnan-Frage mit fast seinem Namen beantwortet. +1 (Sie haben festgestellt, dass Sie 4 Jahre nach der Veröffentlichung dieses Kommentars geantwortet haben.)
Magic Octopus Urn

@MagicOctopusUrn Als ich die Herausforderung sah, dachte ich das Gleiche, aber @Emigna beantwortet normalerweise neue Antworten und schaut nicht so oft auf vorhandene Antworten. Da dieser also keine 05AB1E-Antworten hatte, dachte ich, ich würde eine hinzufügen. Sie haben in der Tat Recht, dass @Emigna am besten geeignet gewesen wäre, diese Herausforderung zu beantworten. ; p
Kevin Cruijssen


1

Perl, 38 + 1 = 39 Bytes

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

Wobei die Eingabe so aussieht:

WETTERBERICHT
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ

Dies ist die gleiche Idee wie bei Javascript.


Das 'x' ist nicht erforderlich
Zaid

1

Java, 136 Zeichen

Regex-basierte Lösung, inspiriert von der JavaScript-Version von 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);}}

1

Brachylog (v2), 16 Bytes

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

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

                    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₁≠ᵐ∧ scheint genauso gut für die gleiche Anzahl von Bytes zu funktionieren.


0

C ++ (gcc) , 160 153 150 Bytes

#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;}

Probieren Sie es online!


1
@ceilingcat: Sie können 157 Bytes ausführen. Der Code schlägt jedoch für zwei Testfälle fehl (wie bei meinem ursprünglichen Testfall). Ich habe es für ein paar zusätzliche Bytes behoben.
Movatica

1
Außerdem führte Ihre Initialisierung von k in der äußeren Schleife zu einem weiteren Fehler, bei dem bei jeder Iteration ein Zeichen weniger verglichen wurde.
Movatica

Es stellt sich heraus, es ist noch kürzer ohne gotound ohne alle Fehler ...
Movatica

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.