परिचय
मान लीजिए कि आपको n
वस्तुओं का यादृच्छिक क्रमांकन सौंपा गया है । क्रमचय को एक बॉक्स में सील कर दिया जाता है, इसलिए आपको पता नहीं है कि यह कौन n!
सा संभावित है। यदि आप n
अलग-अलग वस्तुओं में क्रमपरिवर्तन को लागू करने में कामयाब रहे , तो आप तुरंत इसकी पहचान को कम कर सकते हैं। हालाँकि, आपको केवल लंबाई- n
बाइनरी वैक्टर के लिए क्रमपरिवर्तन लागू करने की अनुमति है , जिसका अर्थ है कि आपको इसे पहचानने के लिए कई बार इसे लागू करना होगा। स्पष्ट रूप से, इसे n
केवल एक 1
ही काम के साथ वैक्टर पर लागू करना है , लेकिन यदि आप चतुर हैं, तो आप इसे log(n)
अनुप्रयोगों के साथ कर सकते हैं । उस पद्धति का कोड लंबा होगा, हालांकि ...
यह एक प्रायोगिक चुनौती है जहां आपका स्कोर कोड लंबाई और क्वेरी जटिलता का एक संयोजन है , जिसका अर्थ है एक सहायक प्रक्रिया के लिए कॉल की संख्या। युक्ति थोड़ी लंबी है, इसलिए मेरे साथ रहो।
काम
आपका कार्य एक नामित फ़ंक्शन (या निकटतम समतुल्य) लिखना है जो f
इनपुट के रूप में एक सकारात्मक पूर्णांक लेता है n
, और 0-आधारित या 1-आधारित इंडेक्सिंग का उपयोग करते हुए p
पहले n
पूर्णांकों का एक क्रमांकन । इसका आउटपुट पर्मुटेशन है p
। हालांकि, आपको p
सीधे क्रमपरिवर्तन तक पहुंचने की अनुमति नहीं है । केवल एक चीज जो आप इसके साथ कर सकते हैं वह है इसे n
बिट्स के किसी भी वेक्टर पर लागू करना । इस प्रयोजन के लिए, आप एक सहायक फ़ंक्शन का उपयोग करेंगे P
जो एक क्रमपरिवर्तन p
और बिट्स के वेक्टर में होता है v
, और अनुमत वेक्टर को वापस लौटाता है, जिनके p[i]
वें समन्वय में बिट शामिल होता है v[i]
। उदाहरण के लिए:
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
आप इस तरह के रूप में किसी भी दो अलग-अलग मान, के साथ "बिट्स" की जगह ले सकता 3
है और -4
, या 'a'
और 'b'
ताकि आप कॉल कर सकते हैं, और वे तय करने की आवश्यकता नहीं, P
दोनों के साथ [-4,3,3,-4]
और [2,2,2,1]
एक ही कॉल में f
। की परिभाषा को P
आपके स्कोर की ओर नहीं गिना जाता है।
स्कोरिंग
किसी दिए गए इनपुट पर आपके समाधान की क्वेरी जटिलता सहायक फ़ंक्शन को कॉल करने की संख्या है P
। इस उपाय को अस्पष्ट बनाने के लिए, आपका समाधान निर्धारक होना चाहिए। आप छद्म-बेतरतीब ढंग से उत्पन्न संख्याओं का उपयोग कर सकते हैं, लेकिन फिर आपको जनरेटर के लिए प्रारंभिक बीज को भी ठीक करना होगा।
में इस भंडार आप एक फ़ाइल बुलाया मिल जाएगा permutations.txt
कि 505 क्रमपरिवर्तन, 50 और 150 के बीच समावेशी प्रत्येक लंबाई के 5, 0-आधारित अनुक्रमण (1 आधारित मामले में प्रत्येक की संख्या को बढ़ाना) का उपयोग होता है। प्रत्येक क्रमपरिवर्तन अपनी लाइन पर है, और इसके नंबर रिक्त स्थान से अलग किए गए हैं। आपका स्कोर इन इनपुट्स पर + औसत क्वेरी जटिलता की बाइट काउंट हैf
। सबसे कम स्कोर जीतता है।
अतिरिक्त नियम
स्पष्टीकरण के साथ कोड पसंद किया जाता है, और मानक खामियों को रोक दिया जाता है। विशेष रूप से, व्यक्तिगत बिट अप्रभेद्य होते हैं (इसलिए आप Integer
वस्तुओं का वेक्टर नहीं दे सकते हैं P
और उनकी पहचान की तुलना कर सकते हैं), और फ़ंक्शन P
हमेशा अपने इनपुट को फिर से व्यवस्थित करने के बजाय एक नया वेक्टर लौटाता है। आप स्वतंत्र रूप से f
और के नाम बदल सकते हैं P
, और जिस क्रम में वे अपने तर्क लेते हैं।
यदि आप अपनी प्रोग्रामिंग भाषा में जवाब देने वाले पहले व्यक्ति हैं, तो आपको एक परीक्षण हार्नेस को शामिल करने के लिए दृढ़ता से प्रोत्साहित किया जाता है, जिसमें फ़ंक्शन का कार्यान्वयन P
भी शामिल है जो उस समय की संख्या को भी गिना जाता है जिसे यह कहा जाता था। एक उदाहरण के रूप में, यहाँ पायथन 3 के लिए हार्नेस है।
def f(n,p):
pass # Your submission goes here
num_calls = 0
def P(permutation, bit_vector):
global num_calls
num_calls += 1
permuted_vector = [0]*len(bit_vector)
for i in range(len(bit_vector)):
permuted_vector[permutation[i]] = bit_vector[i]
return permuted_vector
num_lines = 0
file_stream = open("permutations.txt")
for line in file_stream:
num_lines += 1
perm = [int(n) for n in line.split()]
guess = f(len(perm), perm)
if guess != perm:
print("Wrong output\n %s\n given for input\n %s"%(str(guess), str(perm)))
break
else:
print("Done. Average query complexity: %g"%(num_calls/num_lines,))
file_stream.close()
कुछ भाषाओं में, इस तरह के हार्नेस को लिखना असंभव है। सबसे विशेष रूप से, हास्केल शुद्ध फ़ंक्शन P
को उस समय की संख्या को रिकॉर्ड करने की अनुमति नहीं देता है जिसे यह कहा जाता है। इस कारण से, आपको अपने समाधान को इस तरह से फिर से लागू करने की अनुमति है कि यह इसकी क्वेरी जटिलता की गणना भी करे और दोहन में इसका उपयोग करें।
abaaabababaa
और-4 3 3 3 -4 3
बिट्स की एक वेक्टर होगा।