क्या यह विशिष्ट रूप से संक्षिप्त है?


10

उपसर्ग कोड के बारे में इस चुनौती में , हमने सीखा कि उपसर्ग कोड विशिष्ट रूप से संक्षिप्त हैं।

इसका मतलब है, वे विभाजक के बिना और अस्पष्टता के बिना एक साथ शामिल हो सकते हैं।

उदाहरण के लिए, चूंकि [1,2,45] एक उपसर्ग कोड है, इसलिए मैं उन्हें विभाजक के बिना एक साथ जोड़ सकता हूं जैसे: 1245245112145, और कोई अस्पष्टता नहीं होगी।

हालांकि यह विश्वास हमेशा सही नहीं होता है।

उदाहरण के लिए, [3,34] एक उपसर्ग कोड नहीं है। हालांकि, मैं ऐसा ही कर सकता हूं: 3333434334333, और कोई अस्पष्टता नहीं होगी। आपको बस एक बेहतर पार्सर की आवश्यकता होगी।

हालांकि, [1,11] विशिष्ट रूप से सुगम नहीं है, क्योंकि 1111 की व्याख्या 5 तरीकों से की जा सकती है।

लक्ष्य

आपका कार्य एक प्रोग्राम / फ़ंक्शन लिखना है जो इनपुट के रूप में स्ट्रिंग्स (एएससीआईआई) की सूची लेता है, और निर्धारित करता है कि क्या वे विशिष्ट रूप से संक्षिप्त हैं।

विवरण

डुप्लीकेट मायने रखता है झूठ।

स्कोरिंग

यह । बाइट्स जीत में सबसे कम समाधान।

परीक्षण के मामलों

सच:

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

बस यह सुनिश्चित करने के लिए कि मैं चुनौती को सही ढंग से समझता हूं, यह विशिष्ट रूप से समझ में नहीं आता है कि क्या तार एक दूसरे के किसी भी संयोजन से बना है? आपको उस विवरण को अधिक स्पष्ट करना चाहिए।
जेम्स

क्या आप सुनिश्चित हैं कि यह रुकने की समस्या के बराबर नहीं है?
feersum

क्या आप प्रदर्शित कर सकते हैं कि यह रुकने की समस्या के बराबर क्यों है?
लीक नून

मैंने कहा कि यह नहीं था, लेकिन आश्चर्य है कि यह हो सकता है। कुछ और विचार के बाद मेरा मानना ​​है कि यह नहीं है।
feersum

@ Faersum यहाँ इस समस्या के लिए एक पॉली टाइम एल्गोरिथ्म है: en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm
isaacg

जवाबों:


5

05AB1E , 15 बाइट्स

फोन पर, इसलिए स्पष्टीकरण बाद में पालन करना होगा। कोड:

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

CP-1252 एन्कोडिंग का उपयोग करता है । इसे ऑनलाइन आज़माएं!

आखिरी टेस्ट केस के लिए बहुत अधिक मेमोरी लेता है, ताकि काम न हो ...


3
यह बेहद प्रभावशाली है कि आप अपने फोन पर टाइप करने में सक्षम हैं।
जेम्स

3
@DrGreenEggsand HamDDJ में लगभग 40 मिनट लगे ...
अदनान

2
@ अदनान मुझे आश्चर्य है कि आपके फोन कीबोर्ड के टेक्स्ट प्रेडिक्टर को क्या लगता है कि सभी कचरा प्रतीक हैं :-)
लुइस मेंडो

1
@LuisMendo Haha, यह केवल एक बार हुआ कि मैंने एक दोस्त को यादृच्छिक 05AB1E कार्यक्रम भेजा।
अदनान

मैं अनुमान लगा रहा हूं कि यह सबसे छोटी टक्कर की लंबाई पर एक ऊपरी सीमा रखकर काम करता है। क्या मैं सही हू?
पीटर टेलर

4

CJam (54 बाइट्स)

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

स्टडिन पर इनपुट को न्यूलाइन-सेपरेटेड लिस्ट के रूप में लेता है।

ऑनलाइन डेमो

यदि हमें डुप्लिकेट कोडवर्ड को संभालने की आवश्यकता नहीं है, तो इसे 44 तक छोटा किया जा सकता है:

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

या अगर सीजेएम में एक सरणी घटाव होता था जो केवल दूसरी सूची में प्रत्येक आइटम के लिए पहली सूची से हटा देता था, तो यह 48 हो सकता है ...

विच्छेदन

यह सार्डिनस-पैटरसन एल्गोरिथम है लेकिन डी-ऑप्टिमाइज़्ड है। चूंकि प्रत्येक झूलने वाला प्रत्यय केवल एक ही बार आता है, मुख्य लूप को चलाने के रूप में कई बार इनपुट में अक्षर होते हैं (विभाजक सहित) पर्याप्त होने की गारंटी देता है।

ध्यान दें कि मुझे 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*&!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.