हाल ही में Puzzling.SE में, एक समस्या यह थी कि मैंने यह निर्धारित करने के बारे में लिखा था कि बड़ी संख्या में से दो बोतलें जहर हैं जब जहर केवल सक्रिय हो जाता है यदि दोनों घटक नशे में हैं। यह पूरी तरह से अलग एल्गोरिदम का उपयोग करके 18 या 19 कैदियों को इसे प्राप्त करने का प्रबंधन करने वाले अधिकांश लोगों के साथ, काफी कठिन हो गया।
मूल समस्या कथन इस प्रकार है:
आप एक मध्ययुगीन राज्य के शासक हैं, जो पार्टियों को फेंकना पसंद करते हैं। पिछली बार आपकी शराब की बोतलों में से एक को जहर देने की कोशिश करने वाले दरबारी को यह जानकर गुस्सा आया था कि आप यह पहचानने में कामयाब रहे कि उसने किस बोतल में 1,000 कैदियों के साथ जहर दिया था।
इस बार वह थोड़ा शिल्पकार है। उन्होंने एक समग्र जहर विकसित किया है
P
: एक द्विआधारी तरल जो केवल घातक है जब दो व्यक्तिगत रूप से हानिरहित घटक मिश्रण करते हैं; यह एपॉक्सी के काम करने के तरीके के समान है। उसने आपको 1,000 शराब की बोतलों का एक और टोकरा भेजा है। एक बोतल में घटक होता हैC_a
और दूसरे में घटक होता हैC_b
। (P = C_a + C_b
)जो कोई भी दोनों घटकों को पीता है, वह आधी रात के स्ट्रोक पर मर जाएगा रात को वे अंतिम घटक को पी गए, इस बात की परवाह किए बिना कि दिन में उन्होंने तरल को कबूल किया था। प्रत्येक जहर घटक शरीर में रहता है जब तक कि दूसरा घटक सक्रिय नहीं होता है, इसलिए यदि आप एक दिन एक घटक पीते हैं और दूसरा घटक अगले दिन, तो आप दूसरे दिन के अंत में आधी रात को मर जाएंगे।
आपके पास अपनी अगली पार्टी से दो दिन पहले है। उन दो कैदियों को पहचानने के लिए आपको परीक्षण के लिए न्यूनतम संख्या में कैदियों का उपयोग करने की आवश्यकता है, और कैदियों की संख्या के साथ आपको किस एल्गोरिथ्म का पालन करने की आवश्यकता है?
बोनस
इसके अलावा, मान लीजिए कि आपके पास अपने निपटान में 20 कैदियों की एक निश्चित सीमा थी, तो आप उन बोतलों की अधिकतम संख्या क्या है जो आप सैद्धांतिक रूप से परीक्षण कर सकते हैं और एक सटीक निष्कर्ष पर आ सकते हैं कि कौन सी बोतलें प्रभावित हुई थीं?
आपका कार्य बोनस समस्या को हल करने के लिए एक कार्यक्रम बनाना है। n
कैदियों को देखते हुए , आपका कार्यक्रम एक परीक्षण अनुसूची तैयार करेगा जो बोतलों के बीच दो जहर की बोतलों का पता लगाने में सक्षम होगा m
, जहां m
संभव के रूप में बड़ा है।
आपका प्रोग्राम शुरू में इनपुट नंबर N
, कैदियों की संख्या के रूप में ले जाएगा । यह तो उत्पादन होगा:
M
बोतलों की संख्या आप परीक्षण करने का प्रयास करेंगे। इन बोतलों से लेबल किया जाएगा1
करने के लिएM
।N
लाइनों, बोतलों के लेबल जिसमें प्रत्येक कैदी पीएगा।
आपका कार्यक्रम फिर इनपुट के रूप में ले जाएगा जो पहले दिन कैदियों की मृत्यु हो गई थी, कैदी के साथ पहली पंक्ति होने 1
, अगली पंक्ति होने 2
आदि, फिर, यह आउटपुट होगा:
N
अधिक लाइनें, बोतलों के लेबल वाले प्रत्येक कैदी को पीना होगा। मृत कैदियों के पास खाली लाइनें होंगी।
आपका कार्यक्रम फिर इनपुट के रूप में ले जाएगा जो दूसरे दिन कैदियों की मृत्यु हो गई, और दो संख्याओं का उत्पादन किया, A
और B
, जो आपके कार्यक्रम को लगता है कि दो बोतलों में जहर शामिल है, का प्रतिनिधित्व करता है।
दो कैदियों और चार बोतलों के लिए एक उदाहरण इनपुट के रूप में जाना जा सकता है, अगर बोतलें 1
और 3
जहर हैं:
> 2 // INPUT: 2 prisoners
4 // OUTPUT: 4 bottles
1 2 3 // OUTPUT: prisoner 1 will drink 1, 2, 3
1 4 // OUTPUT: prisoner 2 will drink 1, 4
> 1 // INPUT: only the first prisoner died
// OUTPUT: prisoner 1 is dead, he can't drink any more bottles
3 // OUTPUT: prisoner 2 drinks bottle 3
> 2 // INPUT: prisoner 2 died
1 3 // OUTPUT: therefore, the poisoned bottles are 1 and 3.
The above algorithm may not actually work in all
cases; it's just an example of input and output.
आपके कार्यक्रम के परीक्षण शेड्यूल को सफलतापूर्वक एक वैध जमा होने के लिए प्रत्येक संभावित जोड़ी जहर की बोतलों को निर्धारित करना चाहिए।
आपका कार्यक्रम निम्नलिखित मानदंडों पर बनाया जाएगा, क्रम में:
बोतलों की अधिकतम संख्या यह मामले के लिए विचार कर सकती है
N = 20
।मामले के लिए बोतलों की संख्या
N = 21
, और उसके बाद क्रमिक रूप से उच्च मामले।कोड की लंबाई। (छोटा कोड जीतता है।)