Bu benzersiz bir şekilde birleştirilebilir mi?


10

In önek kodu ile ilgili bu meydan , biz önek kodları benzersiz concatenable olduğunu öğrendik.

Bu, ayırıcı olmadan ve belirsizlik olmadan birleştirilebileceği anlamına gelir.

Örneğin, [1,2,45] bir önek kodu olduğundan, 1245245112145 gibi ayırıcı olmadan bunları birleştirebilirim ve belirsizlik olmayacak.

Ancak bunun tersi her zaman doğru değildir.

Örneğin, [3,34] bir önek kodu değildir. Ancak aynı şeyi yapabilirim: 3333434334333 ve belirsizlik olmayacak. Sadece daha akıllı bir ayrıştırıcıya ihtiyacınız olacak.

Bununla birlikte, [1,11] benzersiz şekilde birleştirilemez, çünkü 1111 5 şekilde yorumlanabilir.

Hedef

Göreviniz, dizeler listesini (ASCII) girdi olarak alan bir program / işlev yazmak ve benzersiz bir şekilde birleştirilebilir olup olmadıklarını belirlemektir.

ayrıntılar

Yinelenen sayım yanlış.

puanlama

Bu . Baytlarda en kısa çözüm kazanır.

testcases

Doğru:

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

Yanlış:

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

Sadece meydan okumayı doğru anladığımdan emin olmak için, dizelerden birinin diğerinin kombinasyonundan oluşması benzersiz bir şekilde birleştirilemez mi? Bu detayları daha açık hale getirmelisiniz.
James

Bunun durma problemine eşdeğer olmadığından emin misiniz?
feersum

Bunun neden durma problemine denk olduğunu gösterebilir misiniz?
Leaky Nun

Öyle olduğunu söylemedim, ama olabileceğini merak ettim. Biraz daha düşündükten sonra bunun olmadığına inanıyorum.
feersum

@feersum İşte bu sorun için bir poli zaman algoritması: en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm
isaacg

Yanıtlar:


5

05AB1E , 15 bayt

Telefonda, açıklama daha sonra takip etmek zorunda kalacak. Kod:

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

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .

Son test vakası için çok fazla bellek gerekiyor, bu işe yaramayabilir ...


3
Bunu telefonunuza yazabilmeniz son derece etkileyici.
James

3
@DrGreenEggsandHamDJ Yaklaşık 40 dakika sürdü ...
Adnan

2
@Adnan Telefonunuzun klavyesinin metin tahmincisinin tüm bu çöp sembolleri hakkında ne düşündüğünü merak ediyorum :-)
Luis Mendo

1
@LuisMendo Haha, sadece bir arkadaşına rastgele bir 05AB1E programı gönderdiğimde oldu.
Adnan

Bunun en kısa çarpışmanın uzunluğuna bir üst sınır koyarak işe yaradığını tahmin ediyorum. Haklı mıyım?
Peter Taylor

4

CJam (54 bayt)

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

Stdin'e yeni satırla ayrılmış liste olarak girdi alır.

Çevrimiçi demo

Yinelenen kod sözcüklerini işlememiz gerekmiyorsa, bu 44'e kısaltılabilir:

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

Veya CJam, ikinci listedeki her öğe için ilk listeden yalnızca bir öğe kaldıran bir dizi çıkarma işlemi yaptıysa, 48 olabilir ...

teşrih

Bu Sardinas-Patterson algoritmasıdır, ancak optimize edilmiş değildir. Her sarkan sonek en fazla bir kez geldiğinden, ana döngüyü girişte (ayırıcılar dahil) karakterler olduğu kadar çok kez çalıştırmak yeterli olmayı garanti eder.

CJam yorumlayıcıda muhtemelen bir hata olan şeyleri çözmek zorunda olduğumu unutmayın:

"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

Bu yüzden önek kontrolünün 1$,<=yerine karmaşık\#!

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*&!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.