Đây có phải là duy nhất concatenable?


10

Trong thử thách này về mã tiền tố , chúng tôi đã học được rằng các mã tiền tố có khả năng ghép nối duy nhất.

Điều đó có nghĩa là, chúng có thể được nối với nhau mà không có dấu phân tách và không có sự mơ hồ.

Ví dụ: vì [1,2,45] là mã tiền tố, tôi có thể nối chúng lại với nhau mà không cần dấu phân cách như vậy: 1245245112145 và sẽ không có sự mơ hồ.

Tuy nhiên điều ngược lại không phải lúc nào cũng đúng.

Ví dụ: [3,34] không phải là mã tiền tố. Tuy nhiên, tôi có thể làm tương tự: 3333434334333 và sẽ không có sự mơ hồ. Bạn sẽ chỉ cần một trình phân tích cú pháp thông minh hơn.

Tuy nhiên, [1,11] không thể kết hợp một cách duy nhất, bởi vì 1111 có thể được hiểu theo 5 cách.

Mục tiêu

Nhiệm vụ của bạn là viết một chương trình / hàm lấy danh sách các chuỗi (ASCII) làm đầu vào và xác định xem chúng có thể nối được với nhau không.

Chi tiết

Số lượng trùng lặp là sai.

Chấm điểm

Đây là . Giải pháp ngắn nhất trong byte thắng.

Tủ thử

Thật:

[12,21,112]
[12,112,1112]
[3,4,35]
[2,3,352]

Sai:

[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]

Chỉ để chắc chắn rằng tôi hiểu chính xác thử thách, nó không thể kết hợp một cách duy nhất nếu một trong các chuỗi được tạo thành từ bất kỳ sự kết hợp nào của các chuỗi khác? Bạn nên làm cho chi tiết rõ ràng hơn.
James

Bạn có chắc chắn điều này không tương đương với vấn đề tạm dừng?
frageum

Bạn có thể chứng minh tại sao điều này tương đương với vấn đề tạm dừng?
Nữ tu bị rò rỉ

Tôi đã không nói nó là, nhưng tự hỏi nó có thể. Sau một số suy nghĩ, tôi tin rằng nó không phải là.
frageum

@feersum Đây là thuật toán đa thời gian cho vấn đề này: en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_alacticm
isaacg

Câu trả lời:


5

05AB1E , 15 byte

Trên điện thoại, nên giải thích sẽ phải theo sau. Mã số:

gF¹N>ã})€`€JDÚQ

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .

Mất quá nhiều bộ nhớ cho trường hợp thử nghiệm cuối cùng, do đó có thể không hoạt động ...


3
Thật ấn tượng khi bạn có thể gõ nó trên điện thoại của mình.
James

3
@DrGreenEggsand HamDJ Mất khoảng 40 phút ...
Adnan

2
@Adnan Tôi tự hỏi người dự đoán văn bản trên bàn phím điện thoại của bạn nghĩ gì về tất cả các biểu tượng rác đó :-)
Luis Mendo

1
@LuisMendo Haha, chỉ xảy ra một lần khi tôi gửi một chương trình 05AB1E ngẫu nhiên cho một người bạn.
Ad Nam

Tôi đoán rằng điều này hoạt động bằng cách đặt một giới hạn trên vào độ dài của vụ va chạm ngắn nhất. Tôi có đúng không
Peter Taylor

4

CJam (54 byte)

q_N/:A\,{_Am*:${~1$,<=},{~\,>}%La:L-}*A,A_&,-A*](\M*&!

Lấy đầu vào trên stdin làm danh sách phân tách dòng mới.

Bản demo trực tuyến

Nếu chúng tôi không phải xử lý các từ mã trùng lặp, điều này có thể rút ngắn xuống còn 44:

q_N/\,{_W$m*:${~1$,<=},{~\,>}%La:L-}*](\M*&!

Hoặc nếu CJam có phép trừ mảng chỉ xóa một mục khỏi danh sách đầu tiên cho mỗi mục trong giây, thì đó có thể là 48 ...

Mổ xẻ

Đây là thuật toán Sardinas-Patterson nhưng không được tối ưu hóa. Vì mỗi hậu tố lơ lửng chỉ xuất hiện nhiều nhất một lần, nên việc chạy vòng lặp chính nhiều lần như có các ký tự trong đầu vào (bao gồm cả dấu phân cách) đảm bảo là đủ.

Lưu ý rằng tôi đã phải làm việc xung quanh những gì được cho là một lỗi trong trình thông dịch của CJam:

"abc" "a" #   e# gives 0 as the index at which "a" is found
"abc" "d" #   e# gives -1 as the index at which "d" is found
"abc" ""  #   e# gives an error

Vì vậy, kiểm tra tiền tố là phức tạp để 1$,<=thay vì\#!

e# Take input, split, loop once per char
q_N/\,{
  e# Build the suffixes corresponding to top-of-stack and bottom-of-stack
  _W$m*
  e# Map each pair of Cartesian product to the suffix if one is the prefix of the other;
  e# otherwise remove from the array
  :${~1$,<=},{~\,>}%
  e# Filter out empty suffixes iff it's the first time round the loop
  La:L-
}*
e# If we generated an empty suffix then we've also looped enough times to generate all
e# of the keywords as suffixes corresponding to the empty fix, so do a set intersection
e# to test this condition.
](\M*&!
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.