Bẻ khóa bí ẩn?


65

Giới thiệu

Enigma là một trong những máy mật mã rôto cơ điện đầu tiên được sử dụng trong Thế chiến II. Điều đó có nghĩa là sau khi một chữ cái được mã hóa, nó sẽ thay đổi khóa cho chữ cái tiếp theo. Điều này được coi là không thể phá vỡ bởi người Đức, do không gian quan trọng. Ngay cả vũ phu cũng gần như không thể. Tuy nhiên, đã có một lỗi thiết kế trong Enigma. Mã hóa một lá thư sẽ không bao giờ dẫn đến chính nó. Điều đó có nghĩa là bức thư Acó thể mã hóa đến mọi chữ cái trừ chữ cái A.

Hãy lấy một ví dụ về một tin nhắn được mã hóa:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ

Một từ tiếng Đức điển hình là WETTERBERICHT, hoặc báo cáo thời tiết bằng tiếng Anh. Với công chúa ở trên, chúng ta có thể xác định vị trí của từ có thể là:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
WETTERBERICHT
         ^

Điều này là không thể, vì Ikhông thể mã hóa thành chính nó, vì vậy chúng tôi di chuyển trên 1 vị trí:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
 WETTERBERICHT
             ^

Điều này cũng không thể, vì vậy chúng tôi di chuyển một nơi khác một lần nữa:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
  WETTERBERICHT
   ^

Điều này một lần nữa là không thể. Trong thực tế, sự xuất hiện đầu tiên có thể WETTERBERICHTlà:

BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ
             WETTERBERICHT
0123456789012345678901234567890123456789012345678901234567890123
             ^
             13

Vì vậy, chúng tôi trả về vị trí 0 chỉ mục của lần xuất hiện đầu tiên có thể xảy ra, đó là 13 .

Nhiệm vụ

  • Đưa ra một thông điệp được mã hóa và một từ, tìm chỉ mục của lần xuất hiện đầu tiên có thể .
  • Giả sử rằng chỉ các ký tự chữ cái viết hoa cơ bản sẽ được sử dụng ( ABCDEFGHIJKLMNOPQRSTUVWXYZ).
  • Nếu không có điều xảy ra là tìm thấy, bạn có thể xuất bất kỳ tiêu cực số nguyên, nhân vật, hoặc không có gì (ví dụ -1, X).
  • Đầu vào có thể được chấp nhận làm đối số, trên các dòng mới, danh sách hoặc bất cứ thứ gì khác.
  • Đây là , vì vậy bài nộp có số byte ít nhất sẽ thắng!

Các trường hợp thử nghiệm

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, tại sao chuỗi được mã hóa thay đổi ở giữa ví dụ?
tay nắm cửa

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

Có một số vấn đề với phần giới thiệu: 1. nó không được coi là không thể phá vỡ vì không gian chính, nhưng do hệ thống mà một chữ cái thay đổi những gì nó được dịch thành 2. "Mã hóa một chữ cái sẽ không bao giờ dẫn đến chính nó." - vâng, sau số lượng ký tự có sẵn, nó sẽ phải lặp lại một ký tự.
Zelphir Kaltstahl

3
@Zelphir với việc mã hóa cho chính nó, tôi có nghĩa là Esẽ không bao giờ dẫn đến một E. Đó là những gì toàn bộ thách thức này là về.
Ad Nam

Câu trả lời:


9

Bình thường, 14 byte

f!s.eqb@>zTkQ0

Tôi không chắc liệu điều này có ổn không nhưng nếu đầu vào là không thể, không có gì được ghi vào thiết bị xuất chuẩn và lỗi phân chia bằng 0 được ghi vào thiết bị lỗi chuẩn. Lấy đầu vào trên 2 dòng, dòng thứ hai được bao quanh bởi dấu ngoặc kép.

Giải trình:

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

Hãy thử nó ở đây!


55

JavaScript, 40

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

Sử dụng replace, điều này ánh xạ đầu vào văn bản gốc thành một biểu thức chính quy /[^H][^E][^L][^L][^O]/(ví dụ, đối với đầu vào văn bản gốc HELLO) và sau đó sử dụng searchđể kiểm tra chỉ mục đầu tiên của chuỗi con bản mã phù hợp với biểu thức chính quy đó. Regex này có nghĩa là "một mẫu mà ký tự thứ nhất không có H, ký tự thứ hai thì không E, v.v."

$&là một chuỗi đặc biệt cho replaceđầu ra thay thế trong giá trị khớp với replaceđối số đầu tiên (trong trường hợp này, mỗi ký tự đơn khớp với /./).


16
Ồ, wow, đó là một giải pháp thực sự thông minh!
Doorknob

2
Tôi không biết về $&! Cảm ơn đã dạy một cái gì đó của tôi ngày hôm nay.
Sản xuất ETH

1
@ETHproductions Tôi cũng vậy, cho đến hôm nay! Tôi cũng đã học về $ `và$' trong quá trình nghiên cứu câu trả lời này, nó cung cấp" phần của chuỗi có trước / sau chuỗi con phù hợp "
apsillers

1
Wow, thật tuyệt vời! Tôi nên đọc tài liệu thường xuyên hơn;)
ETHproductions

43

Trình mô phỏng máy Turing - 15660 byte (Không cạnh tranh)

Không thể có một thử thách Enigma mà không cần mã máy.

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

Kiểm tra nó ở đây

Tổng quan ngắn gọn:

  1. Thiết lập một bộ đếm bên trái
  2. Tìm chữ hoa đầu tiên trong mục tiêu và làm cho chữ thường. Nếu tất cả các chữ cái là chữ thường di chuyển đến bước 5.
  3. Tìm chữ in hoa đầu tiên trong mã. Nếu hầu hết các chữ cái gần đây khớp, chuyển sang bước 4. Khác, viết chữ thường và quay lại bước 2.
  4. Bộ đếm tăng, làm cho tất cả các chữ cái viết hoa, xóa chữ cái đầu tiên trong mã. Quay trở lại bước 2. Nếu không còn chữ nào trong mã, hãy trả lại băng rõ ràng và in x.
  5. Xóa tất cả các băng nhưng quầy.

Ngoài ra, khi kiểm tra, định dạng của các đầu vào nên là: mã, mục tiêu (không gian)
KoreanwGlasses

Mất bao lâu để thực hiện điều này?
Ad Nam

18
Bắt đầu bài tập về nhà của tôi lúc 2:00. Bị phân tâm lúc 2:15. Bắt đầu điều này lúc 2.20. Đăng này lúc 4:20. Thế là khoảng 2 giờ.
KoreanwGlasses

5
+1, trong PPCGSE, không cần phải cạnh tranh để được đánh giá cao!

9575 byte (và bytecount hiện tại trong tiêu đề là sai, có không gian bên ngoài và một số tên trạng thái dài không cần thiết).
Erik the Outgolfer

8

SWI-Prolog, 115 byte

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.

Ví dụ sử dụng : a(`ABCDEFGHIJKL`,`HELLO`,R).. Điều này sử dụng các chuỗi mã ký tự được khai báo với backticks. Câu trả lời là thống nhất với R. Nếu không tìm thấy kết quả khớp, kết quả này false..

Giải trình:

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.

Hãy thử nó ở đây


7

Ruby, 91 79 byte

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

Nguyền rủa bạn , Enumerator! Tại sao tôi phải chuyển đổi từ chuỗi sang mảng sang Enumerator thành mảng và lãng phí các byte quý giá? > :(

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

Sử dụng [*...]như một thay thế golf cho #to_a là một liên lạc tốt đẹp.
Wayne Conrad

7

CJam, 17 16 byte

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

Hãy thử nó ở đây .

Cảm ơn @PeterTaylor vì đã lưu một byte.

Giải trình:

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 #có thể cứu bạn một char:ll:A,ew{A.=:+!}#
Peter Taylor

Thật đáng ngạc nhiên khi CJam có thể chơi golf được bao xa trong hầu hết mọi nhiệm vụ ...: -o
bất cứ lúc nào

@agtoever Tôi sẽ không nói rằng nó thực sự chơi gôn, vì 17 byte là lần thử đầu tiên của tôi. Tính năng chính là ew(tạo các lát), mọi thứ khác chỉ cần làm theo.
geokavel

6

MATL , 27 byte

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

Ví dụ

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

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

Giải trình

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 byte

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

Cách sử dụng: h 0 "DEUTSCHLAND" "XEEFSLBSELDJMADNADKDPSSPRNEBWIENPF"-> 11.

Cách tiếp cận đệ quy đơn giản: nếu từ wcó thể được đặt ở đầu chuỗi s, trả về bộ đếm chỉ mục i, khác lặp lại với ităng và đuôi của s. Dừng lại và trở về -1nếu chiều dài snhỏ hơn chiều dài w.


4

Python 2.7, 111 ký tự

Thử tất cả các vị trí bắt đầu (a) và kiểm tra bất kỳ chữ cái nào khớp (sử dụng cách hiểu danh sách). Nó trả về "Không" ("NULL" của Python) nếu không tìm thấy gì (kết thúc vòng lặp for và không có gì được trả về, mặc định là "Không".

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

Người kiểm tra:

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

Bạn thực sự có 114 byte, không phải 111. Đây là phiên bản 106 byte: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 byte

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

Đây là bản dịch trực tiếp câu trả lời Prolog của tôi. Các brachylog_main/2vị tạo ra hy vọng một danh sách các nhân vật hai mã chuỗi với chuỗi mã hóa đầu tiên như là đầu vào, và trả về chỉ số như đầu ra, ví dụ brachylog_main([`ABCDEFGHIJKL`,`HELLO`],R)..

Giải trình

[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 byte (không cạnh tranh)

UàVr'."[^$&]

Tôi sẽ cần một số trợ giúp với cái này.


Uhhh ... Japt không có .search? facepalm
ETHproductions

Điều này bây giờ có thể được thực hiện với UàVr'."[^$&]12.
ETHproductions

Thật tuyệt, chúng ta đang chiến thắng ngay bây giờ!
Mama Fun Roll

Vì phiên bản mới nhất của câu trả lời này sử dụng chức năng hoãn lại câu hỏi, tôi đánh dấu nó là không cạnh tranh.
Mego

Oh quên về điều đó: P Cảm ơn!
Mama Fun Roll

2

PHP - 155 byte

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

Lưu dưới dạng crack.phpvà chạy với các đối số trong dòng lệnh. Ví dụ:

$ php crack.php BHGEFXWFTIUPITHHLPETTTCLOEWOELM WETTERBERICHT
13

Bạn có thể lưu 25 byte và đánh gôn xuống còn 130 byte :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

@insertusernamehere - Wow, thật ấn tượng! Nhiều đến mức tôi sẽ không cảm thấy đúng khi sử dụng nó! Tôi nghĩ rằng tôi đã khéo léo sử dụng levenshtein, nhưng có lẽ một phép lặp đơn giản trong một lần lặp có thể làm điều đó trong ít byte hơn.

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}

wlà thông điệp được mã hóa, tlà chuỗi thử nghiệm. Điều này không sử dụng regexes, mà chỉ so sánh từng chữ cái, thay đổi chuỗi kiểm tra (tức là "WETTERBERICHT") bằng cách nối thêm khoảng trắng trước nó. Dễ dàng và nhàm chán.


* trường hợp thử nghiệm không có kết quả không hoạt động, bây giờ nó không


2

, 14 ký tự / 25 byte

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

Try it here (Firefox only).

Kudos để @apsillers cho ý tưởng.

Giải trình

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

Bất cứ ai hạ thấp điều này, có một lý do tại sao?
Mama Fun Roll

2

TeaScript, 14 byte 20

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

Tương tự như giải pháp JavaScript thông minh @aspillers .

Không cạnh tranh vì điều này sử dụng các tính năng được thực hiện sau cuộc thi này.

Giải trình

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

Không $&làm việc thay ${l}thế?
Sản phẩm ETH

@ETHproductions không phải trong trường hợp này bởi vì tôi đang sử dụng một vòng lặp chứ không phải thay thế
Downgoat

2

Ruby, 43 36 byte

chỉnh sửa: Nội suy chuỗi bên trong nội suy chuỗi bên trong regex, yike.

Cách tiếp cận lười biếng: dịch từ này sang biểu thức chính "phủ định" - =~Toán tử thực hiện phần còn lại.

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

Kiểm tra:

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 byte

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

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Œ               # 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
Anh bạn, đây hoàn toàn được coi là câu trả lời của @ Emigna;). Tôi muốn đến đây và nói đùa về việc anh ấy trả lời một câu hỏi quảng cáo với tên gần như của anh ấy trong đó. +1 (Thông báo bạn đã trả lời 4 năm sau khi thực tế sau khi tôi đăng bình luận sau thực tế này).
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Khi tôi thấy thử thách tôi cũng nghĩ như vậy, nhưng @Emigna thường trả lời các câu trả lời mới và thường không nhìn vào câu trả lời hiện có. Vì vậy, câu hỏi này không có bất kỳ câu trả lời 05AB1E nào, tôi nghĩ rằng tôi sẽ thêm một câu trả lời. Bạn thực sự đúng rằng @Emigna sẽ phù hợp nhất để trả lời thử thách này. ; p
Kevin Cruijssen


1

Perl, 38 + 1 = 39 byte

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

nơi đầu vào trông như:

WETTERBERICHT
BHGEFXWFTIUPITHHLPETTTCLOEWOELMRXXPAKAXMAMTXXUDLTWTNHKELEPPLHPRQ

Đây là ý tưởng tương tự như javascript.


'X' là không cần thiết
Zaid

1

Java, 136 ký tự

Giải pháp dựa trên Regex lấy cảm hứng từ phiên bản JavaScript của 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 byte

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

Hãy thử trực tuyến!

Brachylog thường rất giỏi trong việc thất bại khi giải quyết một điều gì đó là không thể.

Đây không phải là một trong những thời điểm.

(lấy đầu vào làm danh sách [message, word]. Tiêu đề in tất cả rất đẹp nhưng đầu ra của vị từ thực tế chỉ là một số nếu thành công)

                    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₁≠ᵐ∧ dường như cũng hoạt động tốt cho cùng một số byte.


0

C ++ (gcc) , 160 153 150 byte

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

Hãy thử trực tuyến!


1
@ceilingcat: bạn có thể thực hiện 157 byte Mã không thành công cho hai testcase (như bản gốc của tôi). Tôi đã sửa nó cho một vài byte thêm.
Movatica

1
Thêm vào đó, việc khởi tạo k của bạn trong vòng lặp bên ngoài đã đưa ra một lỗi khác, trong đó với mỗi lần lặp lại, một ký tự ít hơn được so sánh.
Movatica

Hóa ra, nó thậm chí còn ngắn hơn mà không có gotovà không có tất cả các lỗi ...
Movatica

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.