นี่เป็นการเชื่อมโยงที่เป็นเอกลักษณ์หรือไม่?


10

ในความท้าทายนี้เกี่ยวกับรหัสคำนำหน้าเราได้เรียนรู้ว่ารหัสคำนำหน้านั้นสามารถต่อกันได้อย่างมีเอกลักษณ์

นั่นหมายความว่าพวกเขาสามารถรวมตัวกันได้โดยไม่ต้องมีตัวคั่นและไม่มีความกำกวม

ตัวอย่างเช่นเนื่องจาก [1,2,45] เป็นรหัสนำหน้าฉันสามารถเข้าร่วมได้โดยไม่ต้องมีตัวคั่นดังนี้: 1245245112145 และจะไม่มีความคลุมเครือ

อย่างไรก็ตามการสนทนาไม่เป็นความจริงเสมอไป

ตัวอย่างเช่น [3,34] ไม่ใช่รหัสนำหน้า อย่างไรก็ตามฉันสามารถทำเช่นเดียวกัน: 3333434334333 และจะไม่มีความกำกวม คุณจะต้องมีเครื่องมือแยกวิเคราะห์ที่ชาญฉลาด

อย่างไรก็ตาม [1,11] นั้นไม่สามารถต่อเนื่องกันได้เนื่องจาก 1111 สามารถตีความได้ 5 วิธี

เป้าหมาย

งานของคุณคือการเขียนโปรแกรม / ฟังก์ชั่นที่ใช้รายการของสตริง (ASCII) เป็นอินพุตและตรวจสอบว่าพวกเขาจะเข้ากันไม่ซ้ำกัน

รายละเอียด

การทำซ้ำนับเป็นเท็จ

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟทางออกที่สั้นที่สุดในหน่วยไบต์ชนะ

Testcases

จริง:

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

เท็จ:

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

เพียงเพื่อให้แน่ใจว่าฉันเข้าใจความท้าทายอย่างถูกต้องมันไม่สามารถเชื่อมโยงกันได้อย่างไม่ซ้ำใครหากหนึ่งในสายนั้นประกอบขึ้นจากการรวมกันของสายอื่น ๆ คุณควรทำให้รายละเอียดนั้นชัดเจนยิ่งขึ้น
James

คุณแน่ใจหรือว่าไม่เท่ากับปัญหาการหยุดพักชั่วคราว
feersum

คุณสามารถแสดงให้เห็นว่าทำไมสิ่งนี้ถึงเทียบเท่ากับปัญหาการหยุดชะงัก
Leun Nun

ฉันไม่ได้บอกว่ามันเป็น แต่สงสัยว่ามันอาจจะเป็น หลังจากที่คิดเพิ่มเติมฉันเชื่อว่ามันไม่ใช่
feersum

@feersum ต่อไปนี้เป็นอัลกอริทึมเวลาโพลีสำหรับปัญหานี้: en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm
isaacg

คำตอบ:


5

05AB1E , 15 ไบต์

บนโทรศัพท์ดังนั้นคำอธิบายจะต้องติดตามในภายหลัง รหัส:

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

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .

ใช้หน่วยความจำมากเกินไปสำหรับกรณีทดสอบล่าสุดดังนั้นจึงอาจไม่ทำงาน ...


3
เป็นเรื่องที่น่าประทับใจอย่างยิ่งที่คุณสามารถพิมพ์ลงบนโทรศัพท์ของคุณ
James

3
@DrGreenEggsandHamDJ ใช้เวลาประมาณ 40 นาที ...
Adnan

2
@Adnan ฉันสงสัยว่าทำนายข้อความแป้นพิมพ์โทรศัพท์ของคุณคิดว่าทุกสัญลักษณ์ขยะที่ :-)
หลุยส์ Mendo

1
@ LuisMendo ฮ่าฮ่าเกิดขึ้นเพียงครั้งเดียวที่ฉันส่งโปรแกรม 05AB1E แบบสุ่มให้เพื่อน
Adnan

ฉันเดาว่ามันจะทำงานได้โดยการวางขอบบนของความยาวของการชนที่สั้นที่สุด ฉันถูกไหม?
Peter Taylor

4

CJam (54 ไบต์)

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

รับอินพุตบน stdin เป็นรายการที่คั่นด้วยบรรทัดใหม่

การสาธิตออนไลน์

หากเราไม่ต้องจัดการ codewords ที่ซ้ำกันสิ่งนี้อาจสั้นลงได้ถึง 44:

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

หรือถ้า CJam มีการลบอาร์เรย์ที่ลบเพียงหนึ่งรายการจากรายการแรกสำหรับแต่ละรายการในวินาทีมันอาจเป็น 48 ...

การผ่า

นี่คืออัลกอริทึม Sardinas-Pattersonแต่ได้รับการปรับปรุงให้ดีที่สุด เนื่องจากส่วนต่อท้ายที่ห้อยต่องแต่งเพียงหนึ่งครั้งเท่านั้นการรันวนรอบหลักหลาย ๆ ครั้งเนื่องจากมีอักขระในอินพุต (รวมถึงตัวคั่น) รับประกันว่าเพียงพอ

โปรดทราบว่าฉันต้องหลีกเลี่ยงสิ่งที่เป็นข้อบกพร่องในล่าม 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

ดังนั้นการตรวจสอบคำนำหน้าจึงซับซ้อน1$,<=แทน\#!

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*&!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.