Зламування Енігми?


65

Вступ

"Енігма" була однією з перших електромеханічних шифрових машин, використовуваних у Другій світовій війні. Це означає, що після кодування однієї літери вона змінить ключ для наступної літери. Це вважалося німецьким нерозривним , через величезний ключовий простір. Навіть жорстоке насильство було майже неможливим. Однак у Enigma була помилка дизайну. Шифрування листа ніколи не призведе до себе. Це означає, що лист Aможе зашифрувати кожну букву, крім букви A.

Візьмемо приклад кодованого повідомлення:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ

Типовим німецьким словом був WETTERBERICHTабо звіт про погоду англійською мовою. За допомогою принципу вище ми можемо визначити, у яких місцях це слово може бути:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
         ^

Це неможливо, оскільки Iнеможливо зашифрувати себе, тому ми переходимо на 1 місце:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
 WETTERBERICHT
             ^

Це також неможливо, тому ми знову переміщуємо інше місце:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
  WETTERBERICHT
   ^

Це знову неможливо. Насправді перше можливе виникнення WETTERBERICHT:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
             WETTERBERICHT
0123456789012345678901234567890123456789012345678901234567890123
             ^
             13

Отже, ми повертаємо 0-індексовану позицію першого можливого виникнення, що дорівнює 13 .

Задача

  • Давши закодоване повідомлення та слово, знайдіть індекс першої можливої ​​появи .
  • Припустимо, що будуть використані лише основні алфавітні літери ( ABCDEFGHIJKLMNOPQRSTUVWXYZ).
  • Якщо виникнення не знайдено, ви можете вивести будь-яке негативне ціле число, символ чи нічого (наприклад -1, X).
  • Введення даних може бути прийнято як аргумент у окремих рядках, списках чи будь-чому іншому.
  • Це , тому подання з найменшою кількістю байтів виграє!

Тестові справи

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
Так, чому кодована рядок змінюється в середині прикладу?
Дверна ручка

36
@Doorknob 冰 ¯ \ _ (ツ) _ / ¯
Аднан

Існують проблеми із вступом: 1. Це не вважалося непорушним через простір ключів, а через систему, що лист змінює те, що перекладається на 2. "Шифрування листа ніколи не призведе до себе". - так, після кількості наявних символів доведеться повторити один.
Зельфір Кальтшталь

3
@ Zelphir, шифруючи себе, я мав на увазі, що це Eніколи не призведе до E. Ось у чому полягає вся ця проблема.
Аднан

Відповіді:


9

Піт, 14 байт

f!s.eqb@>zTkQ0

Я не впевнений, чи це нормально, але якщо введення неможливо, нічого не пишеться в stdout, а в stderr записується помилка поділу нуля. Бере вхід у 2 рядки, другий оточений лапками.

Пояснення:

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

Спробуйте тут!


55

JavaScript, 40

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

Використовуючи replaceце, відображає вхід простого тексту в регулярний вираз форми /[^H][^E][^L][^L][^O]/(наприклад, для введення в простому тексті HELLO), а потім використовує searchдля тестування першого індексу підшини на шифротекст, який відповідає цьому регулярному вираженню. Цей регулярний вираз означає "шаблон, де першого символу немає H, другого символу немає Eі т.д."

$&- це спеціальна послідовність для replaceвиводу, яка підміняє значення, відповідне першим replaceаргументом (у цьому випадку кожен окремий символ узгоджується з /./).


16
О, вау, це дійсно розумне рішення!
Дверна ручка

2
Я не знав про це $&! Дякую за те, що сьогодні я щось навчив.
ETHproductions

1
@ETHproductions Мені ні до сьогодні! Я також дізнався про $ `і$' в процесі дослідження цієї відповіді, яка надає" частину рядка, яка передує / слідує узгодженій
підрядці

1
Ого, це приголомшливо! Я повинен читати документи частіше;)
ETHproductions

43

Симулятор машини Тьюрінга - 15660 байт (неконкурентоспроможний)

Не можу виникнути виклик Enigma без встановлення машинного коду.

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

Перевірте це тут

Короткий огляд:

  1. Встановіть лічильник ліворуч
  2. Знайдіть першу велику літеру в цілі та зробіть її з малої літери. Якщо всі літери є малі, перейдіть до кроку 5.
  3. Знайдіть першу велику літеру в коді. Якщо відповідність останніх листів, перейдіть до кроку 4. Ще раз зробіть малі літери та поверніться до кроку 2.
  4. Збільшуємо лічильник, складаємо всі літери з великої літери, видаляємо першу букву в коді. Поверніться до кроку 2. Якщо в коді не залишилося жодної літери, поверніть прозору стрічку та надрукуйте х.
  5. Очистіть всю стрічку, окрім лічильника.

Також при тестуванні формат введення повинен бути: код, ціль (немає місця)
KoreanwGlasses

Скільки часу знадобилося, щоб це зробити?
Аднан

18
Почав домашнє завдання о 2:00. Відлучився о 2:15. Почав це о 2.20. Опублікував це о 4:20. Так приблизно 2 години.
KoreanwGlasses

5
+1, в PPCGSE це не повинно бути конкурентоспроможним!

9575 байт (а поточний числовий рахунок у заголовку помилковий, є сторонні пробіли та деякі зайві довгі імена стану).
Ерік Аутгольфер

8

SWI-Prolog, 115 байт

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.

Приклад використання: a(`ABCDEFGHIJKL`,`HELLO`,R).. При цьому використовуються рядки кодів символів, оголошені за допомогою зворотних посилань. Відповідь уніфікована з R. Якщо збігу не знайдено, це виводить false..

Пояснення:

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.

Спробуйте тут


7

Рубі, 91 79 байт

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

Проклинаю тебе Enumerator! Чому мені доводиться перетворювати з рядка в масив в Enumerator для масиву і витрачати дорогоцінні байти? > :(

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

Використання [*...]в якості гофрованої альтернативи #to_a - приємне дотик.
Уейн Конрад

7

CJam, 17 16 байт

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

Спробуйте тут .

Дякуємо @PeterTaylor за збереження байта.

Пояснення:

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 #може врятувати вас чаром:ll:A,ew{A.=:+!}#
Пітер Тейлор

Дивовижно, наскільки CJam можна пограти в гольф майже в кожному завданні ...: -o
agtoever

@agtoever Я б не сказав, що це дійсно гольф, тому що 17 байт - це моя перша спроба. Ключова особливість - ewробити шматочки, все інше лише слідувати.
geokavel

6

MATL , 27 байт

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

Приклади

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

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

Пояснення

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 байти

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

Використання: h 0 "DEUTSCHLAND" "XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF"-> 11.

Простий рекурсивний підхід: якщо слово wможна розмістити на початку рядка s, поверніть лічильник індексу i, інакше повторіть із iзбільшенням і хвіст s. Зупинка і повернення, -1якщо довжина sменше довжини w.


4

Python 2.7, 111 символів

Перевірте всі вихідні позиції (а) та перевіряє відповідність будь-якої літери (використовуючи розуміння списку). Він повертає "None" (Python's "NULL"), якщо нічого не знайдено (кінець циклу і нічого не повертається, що за замовчуванням є "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)])

У вас насправді 114 байт, а не 111. Ось 106-байтна версія: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

Брахілог , 48 байт

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

Це прямий переклад моєї відповіді Пролог. brachylog_main/2Генеруються предикат очікує , що список з двох символьних кодів рядків з кодованої рядком першим в якості вхідних даних, і повертає індекс в якості висновку, наприклад brachylog_main([`ABCDEFGHIJKL`,`HELLO`],R)..

Пояснення

[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 байт (неконкурентний)

UàVr'."[^$&]

Мені знадобиться допомога з цим.


А-а-а ... Джапта немає .search? facepalm
ETHproductions

Тепер це можна зробити UàVr'."[^$&]за 12.
ETHproductions

Класно, ми виграємо зараз!
Mama Fun Roll

Оскільки в останньому перегляді цієї відповіді використовується функціонал, який подає запитання, я відзначаю її як неконкурентну.
Mego

О, забув про це: P Спасибі!
Mama Fun Roll

2

PHP - 155 байт

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

Збережіть як crack.phpі запустіть з аргументами в командному рядку. Наприклад:

$ php crack.php BHGEFXWFTIUPITHHLPETTTCLOEWOELM WETTERBERICHT
13

Ви можете зберегти 25 байт і 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↵";
переграти

@insertusernamehere - Ого, це вражає! Настільки, що я не відчував би себе правильно, використовуючи це! Я думав, що я розумно використовую levenshtein, але, ймовірно, пряма ітерація в рамках ітерації могла зробити це в меншій кількості байтів.

2

JavaScript, 129 121 118 119 * 118 байт

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

wє кодованим повідомленням, tє тестовою рядком. Тут не використовуються регулярні вирази, а просто порівнюється буква за літерою, зміщуючи тестову рядок (тобто "WETTERBERICHT"), додаючи пробіл перед цим. Легко і нудно.


* тестовий випадок, що не відповідає, тепер не працює


2

𝔼𝕊𝕄𝕚𝕟, 14 символів / 25 байт

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

Try it here (Firefox only).

Кудо до @apsillers для ідеї.

Пояснення

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

Хто хто це спростував, чи є причина?
Mama Fun Roll

2

TeaScript, 14 байт 20

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

Схоже на розумне рішення @aspillers .

Не змагається, оскільки тут використовуються функції, створені після цього конкурсу.

Пояснення

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

Хто $&не працює на місці ${l}?
ETHproductions

@ETHproductions не в цьому випадку, тому що я використовую цикл, а не заміну
Downgoat

2

Ruby, 43 36 байт

редагувати: рядок інтерполяції всередині інтерполяції рядків всередині регулярного вираження, дає результат.

Ледачий підхід: переводить слово на «негативний» регулярний вираз - =~Оператор робить все інше.

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

Тест:

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 байт

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

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Œ               # 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
Чувак, це цілком повинно було відповісти @ Emigna;). Я хотів приїхати сюди і пожартувати над ним, відповідаючи на аднан-питання з майже своїм ім’ям. +1 (Помітив, що ви відповіли через 4 роки після факту після того, як я опублікував цей коментар після факту).
Чарівна восьминога урна

@MagicOctopusUrn Коли я побачив виклик, то думав те саме, але @Emigna зазвичай відповідає на нові відповіді і не так часто дивиться на існуючі відповіді. Так як у цього не було жодних відповідей 05AB1E, я зрозумів, що додам його. Ви справді праві, що @Emigna найкраще відповів би на це завдання. ; p
Кевін Круїссен


1

Perl, 38 + 1 = 39 байт

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

де вхід виглядає так:

WETTERBERICHT
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ

Це та сама ідея, що і javascript.


Значення "х" непотрібне
Заїд

1

Ява, 136 символів

Рішення на основі Regex, натхнене версією JavaScript 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

Брахілог (v2), 16 байт

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

Спробуйте в Інтернеті!

Брахілог, як правило, дуже добре провалюється, коли вирішити щось неможливо.

Це не один із тих часів.

(приймає введення як список [message, word]. Заголовок друкує все це дуже влучно, але вихід фактичного предиката - це лише число, якщо це вдається)

                    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₁≠ᵐ∧ здається, працює так само добре для одного і того ж рахунку байтів.


0

C ++ (gcc) , 160 153 150 байт

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

Спробуйте в Інтернеті!


1
@ceilingcat: ти можеш виконати 157 байт . Код не вдається для двох тестових скриньок (як і моя оригінальна). Я зафіксував це на кілька зайвих байт.
movatica

1
Крім того, ваша ініціалізація k у зовнішньому циклі ввела ще одну помилку, де з кожною ітерацією порівнювався один менший символ.
movatica

Виходить, ще коротше без gotoі без усіх помилок ...
movatica

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.