Apakah ini digabungkan secara unik?

10

Dalam tantangan tentang kode awalan ini , kami mempelajari bahwa kode awalan dapat disatukan secara unik.

Itu berarti, mereka dapat bergabung bersama tanpa pemisah, dan tanpa ambiguitas.

Misalnya, karena [1,2,45] adalah kode awalan, saya dapat bergabung bersama-sama tanpa pemisah seperti: 1245245112145, dan tidak akan ada ambiguitas.

Namun yang terjadi tidak selalu benar.

Misalnya, [3,34] bukan kode awalan. Namun, saya dapat melakukan hal yang sama: 3333434334333, dan tidak akan ada ambiguitas. Anda hanya perlu parser yang lebih pintar.

Namun, [1,11] tidak dapat digabungkan secara unik, karena 1111 dapat ditafsirkan dalam 5 cara.

Tujuan

Tugas Anda adalah menulis sebuah program / fungsi yang mengambil daftar string (ASCII) sebagai input, dan menentukan apakah mereka dapat digabungkan secara unik.

Detail

Duplikat dianggap salah.

Mencetak gol

Ini adalah . Solusi terpendek dalam byte menang.

Testcases

Benar:

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

Salah:

[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]
Biarawati Bocor
sumber
Hanya untuk memastikan saya memahami tantangan dengan benar, tidak bisa disatukan secara unik jika salah satu string terdiri dari kombinasi dari yang lain? Anda harus memperjelas detail itu.
James
Apakah Anda yakin ini tidak setara dengan masalah penghentian?
feersum
Bisakah Anda menunjukkan mengapa ini setara dengan masalah penghentian?
Leaky Nun
Saya tidak mengatakan itu, tapi bertanya-tanya itu mungkin. Setelah berpikir lagi, saya yakin itu bukan.
feersum
@feersum Berikut ini adalah algoritme waktu poli untuk masalah ini: en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm
isaacg

Jawaban:

5

05AB1E , 15 byte

Di telepon, jadi penjelasan harus diikuti nanti. Kode:

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

Menggunakan pengodean CP-1252 . Cobalah online! .

Membutuhkan terlalu banyak memori untuk test case terakhir, sehingga mungkin tidak berfungsi ...

Adnan
sumber
3
Sangat mengesankan bahwa Anda dapat mengetiknya di telepon.
James
3
@DrGreenEggsandHamDJ Butuh sekitar 40 menit ...
Adnan
2
@ Adnan Saya bertanya-tanya apa yang diprediksi oleh prediksi teks keyboard ponsel Anda tentang semua simbol sampah :-)
Luis Mendo
1
@LuisMendo Haha, itu hanya terjadi sekali ketika saya mengirim program 05AB1E acak ke seorang teman.
Adnan
Saya menduga ini bekerja dengan menempatkan batas atas pada panjang tabrakan terpendek. Apakah saya benar?
Peter Taylor
4

CJam (54 byte)

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

Mengambil input pada stdin sebagai daftar yang dipisahkan oleh baris baru.

Demo online

Jika kami tidak harus menangani kata sandi duplikat, ini dapat disingkat menjadi 44:

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

Atau jika CJam memiliki pengurangan array yang hanya menghapus satu item dari daftar pertama untuk setiap item di kedua, itu bisa menjadi 48 ...

Pembedahan

Ini adalah algoritma Sardinas-Patterson tetapi tidak dioptimalkan. Karena setiap sufiks menggantung hanya muncul paling banyak satu kali, menjalankan loop utama sebanyak yang ada karakter dalam input (termasuk pemisah) menjamin cukup.

Perhatikan bahwa saya harus mencari tahu apa yang bisa dikatakan sebagai bug dalam juru bahasa 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

Jadi pemeriksaan awalan lebih rumit 1$,<=daripada\#!

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*&!
Peter Taylor
sumber