एक सार खेल के लिए इष्टतम रणनीति


12

मुझे एक साक्षात्कार में निम्नलिखित समस्या दी गई है (कि मैं पहले से ही हल करने में विफल रहा हूं, मेरे अतीत को धोखा देने की कोशिश नहीं कर रहा हूं): खेल एक सकारात्मक पूर्णांक संख्या शुरू होता है । (उदा। ) यह संख्या बाइनरी प्रतिनिधित्व में बदल जाती है, और बिट्स की संख्या सेट होती है । (जैसे , )00=1234एन10=100 1101 0010एन=5।

खिलाड़ी 1 एक संख्या चुनता की तुलना में कम । में केवल एक बिट सेट होना चाहिए 1. (जैसे ) । (जैसे ) एक चाल वैध है यदि पिछले बाधाओं को संतुष्ट करता है, और यदि में सेट बिट्स की संख्या अभी भी N के बराबर हैबी00बी0बी0=10 0000 0000=5121=0-बी01=1234-512=722=1011010010बी01

खिलाड़ी 2 से जारी है एक वैध का चयन करके , तो खिलाड़ी 1 से जारी है A_2 , और इसके आगे। यदि उनके पास कोई वैध चाल नहीं है तो एक खिलाड़ी हार जाता है।1बी12

यह मानते हुए कि दोनों खिलाड़ी बेहतर खेलते हैं, एक उचित कुशल विधि का उपयोग करके विजेता खिलाड़ी का निर्धारण करें। (मेरी समस्या की परिभाषा में, इस पर अड़चनें यह थीं कि कार्यक्रम को कुछ मिलियन इनपुट संख्याओं के लिए एक समाधान देने में सक्षम होना चाहिए जो हस्ताक्षर किए गए 32-बिट पूर्णांक में फिट होते हैं।) अर्थात, समाधान की आवश्यकता नहीं है। पूरी तरह से विश्लेषणात्मक।


यहां मेरा व्यक्तिगत हित इस बात का पता लगा रहा है कि क्या 120 मिनट में मुझे दिए गए किसी भी तरीके के फीडबैक पर सही प्रतिक्रिया के साथ सही समाधान मिल गया है या नहीं; या यदि यह उन लोगों में से एक था, "आइए देखें कि क्या उन्होंने इस पहेली को" प्रश्नों से पहले देखा है।

मैं विफल हो गया क्योंकि मैंने एक उचित रणनीति की तरह लागू करने के लिए चुना, जिसने मुझे कुछ परीक्षण मामलों के लिए सही परिणाम दिए जो कि मुझे दिया गया है, इस रन को बनाने में बहुत समय बर्बाद किया, और गलत तरीके से सौंपना समाप्त कर दिया। पूर्ण उत्पादन के रूप में मेरा समय भाग गया।

पूर्वव्यापी में मुझे एक ब्रूट-फोर्स खोज को लागू करना चाहिए और छोटे शुरुआती नंबरों के लिए आंशिक समाधानों को याद रखना चाहिए, लेकिन बाधा हमेशा 20/20 है। मैं उत्सुक हूँ लेकिन अगर वहाँ एक अलग आम दृष्टिकोण है कि मुझे एक शराबी के रूप में हटा दिया है।


विवरण से मैं समझ नहीं पाया कि चुने गए चालों में 1 के लिए एक एकल सेट होना चाहिए (मुझे लगा कि यह सिर्फ उदाहरण का हिस्सा था)।
jjmontes

@jjmontes - यह बी नंबर चुनने के लिए बहुत पहले नियम के रूप में कहा गया है - सभी उदाहरणों को इंगित किया जाता है जैसे, कोष्ठक के बाहर सब कुछ सामान्य है। क्या आपके पास एक सुझाव है कि यह कैसे स्पष्ट हो सकता है?
मिलीमो

1
हो सकता है कि "प्लेयर 1 तुलना में संख्या कम चुनता है , जिसमें केवल एक बिट सेट 1 होना चाहिए "? (शायद यह सिर्फ मुझे था, लेकिन मुझे यह महसूस करने के लिए @orlp उत्तर पढ़ना था कि यह एक बाधा थी)। बी00
jjmontes

@ वीद्रेक - यार, क्या मुझे पता था कि, मेरा सारा प्रयास बिटकॉइन को यथोचित रूप से चलाने के लिए रखा गया है, यह बेकार नहीं होगा। एक उत्तर यह बताते हुए कि यह क्यों काम करता है उत्कृष्ट होगा।
मिलीमो

@millimoose Bitcount अधिकांश आधुनिक सीपीयू के लिए हार्डवेयर में है!
विद्रेक

जवाबों:


21

अपने लिए एक पल महसूस करें कि यदि हम केवल दो की शक्ति को बदल सकते हैं, और पॉपकॉर्न को नहीं बदल सकते हैं तो हमें को उस स्थिति में घटाना होगा जहां अन्य संख्या 10 है । उस स्थिति में इसका परिणाम हमेशा 01 होता है, और संख्या कहीं और नहीं बदलती है।011001

दूसरे शब्दों में, खेल के स्वैप की एक श्रृंखला है , और यदि सभी दाहिने हाथ की तरफ हैं तो खेल समाप्त हो जाता है। ध्यान दें कि इस खेल को जल्दी समाप्त करना असंभव है - आप अटक नहीं सकते। आप हमेशा एक ऐसी स्थिति में समाप्त होंगे जहां सभी शून्य बाईं ओर हैं, और सभी सही पर हैं।1001

तो एक खेल में एकमात्र निर्धारण कारक यह है कि उस स्थिति में पहुंचने के लिए कितने स्वैप लगते हैं जहां सभी सही पर हैं, और जीतने या हारने की कोई रणनीति नहीं है। स्वैप की संख्या की समता ही एकमात्र निर्धारित कारक है।

तो यह कितने स्वैप लेता है? ध्यान दें कि एस प्रत्येक अभिभावक को पार नहीं कर सकता है, इसलिए यदि हमने उन्हें गिना और स्वैप के माध्यम से उन्हें ट्रैक किया तो वे अंतिम स्थिति में उसी क्रम में रहेंगे। प्रत्येक स्वैप उन्हें अपने अंतिम स्थान के करीब लाता है।1

तो अगर वें 1 (दाएं से गिनती, दायीं 1 है 0 वें 1 ) स्थिति में है कश्मीर सही से, यह की जरूरत है कश्मीर - मैं स्वैप अपनी सही स्थिति में पाने के लिए। यह हमें आवश्यक स्वैप की मात्रा की गणना करने के लिए एक एल्गोरिथ्म देता है:मैं1101-मैं

i = 0
k = 0
total = 0
while n > 0:
    if n & 1:
       total += k - i
       i += 1
    n >>= 1
    k += 1

अब हम सिर्फ यह देख सकते हैं totalकि कौन जीतता है। समय की जटिलता हे(लॉगn)


यह सही के बारे में लगता है, मैं हाथ के बाद बिट्स और इस दृष्टिकोण के टुकड़ों पर ठोकर खाई है। मुझे लगता है कि मैं कोडिंग शुरू करने और परिणामी जंगली हंस का पीछा करने में दासी होने पर बंदूक कूद कर किया गया था।
मिलीमो

इस बारे में सोचते हुए, इस तथ्य से कोई फर्क नहीं पड़ता कि रणनीति का मतलब यह है कि मेरे कार्यान्वयन में या तो अस्पष्ट बग है, या इसे किसी अन्य कार्यान्वयन के समान परिणाम उत्पन्न करना चाहिए जो गेम को सही ढंग से खेलता है ...
मिलीमो

5

इस तरह की समस्या को हल करने का एक तरीका इस प्रकार है:

  • आपके द्वारा सुझाए जा रहे "मेमोइज्ड ब्रूट-फोर्स" दृष्टिकोण का उपयोग करके कुछ सरल मूल्यों का समाधान खोजें।

  • उत्तर का अनुमान लगाएं (कौन से पद जीत रहे हैं और जो हार रहे हैं)।

  • अपना जवाब साबित करने की कोशिश करें। अगर तुम सफल हो, महान। अन्यथा, एक पलटाव खोजने की कोशिश करें, और दूसरे उत्तर का अनुमान लगाने के लिए इसका उपयोग करें। यहाँ यह कुछ और मामलों को सुलझाने में मददगार हो सकता है।

यह कहना मुश्किल है कि कितना समय लगता है। हालांकि, साक्षात्कार में आपको समाधान खोजने के लिए आवश्यक नहीं है। इसके बजाय, साक्षात्कारकर्ता यह जानना चाहते हैं कि आपने समस्या को हल करने के लिए कैसे संपर्क किया , और आपने क्या प्रगति की।


हाँ नहीं, उन्होंने मुझे अस्वीकार कर दिया क्योंकि मेरा उत्पादन गलत था और मैं समय से बाहर भाग गया।
मिलीमो

याद रखने योग्य जानवर बल दृष्टिकोण सही होगा, क्योंकि यह रणनीति के बारे में कोई शॉर्टकट नहीं लेता है। हालाँकि, यह भी है - मुझे लगा कि - बहुत धीमी गति से हो सकता है, और स्मृति के मूर्खतापूर्ण मात्रा का उपयोग किए बिना संभवतः बहुत अधिक मदद के लिए शीर्ष पर बहुत अधिक काम हो सकता है। या शायद नहीं, मैं कोशिश करूंगा कि बाद में इसे अपने सिस्टम से बाहर कर दूं।
मिलीमोसे

5

@ Orlp के उत्तर से ध्यान दें कि हम विस्थापन की राशि की समता को आरंभ स्थिति से अंत स्थिति तक चाहते हैं। आइए इस पर टिप्पणी करें:

       9876543210
       9 76 4  1    (positions at start)
start: 1011010010
end:   0000011111
            43210   (positions at end)

इसलिए हम चाहते हैं

  ((1 - 0) + (4 - 1) + (6 - 2) + (7 - 3) + (9 - 4)) & 1
= ((1 + 4 + 6 + 7 + 9) - (0 + 1 + 2 + 3 + 4)) & 1
= ((1 + 0 + 0 + 1 + 1) - (0 + 1 + 0 + 1 + 0)) & 1

पहला भाग विषम स्थितियों में बिट्स की संख्या की समता है। आप अधिकतम अहस्ताक्षरित पूर्णांक को 0b11 से विभाजित करके और नकार कर मास्क कर सकते हैं।

= (bitcount(x & ~(UINT_MAX / 0b11)) ^ (0 + 1 + 0 + 1 + 0)) & 1

दूसरा भाग बिट्स की आधी संख्या की समता है x

= (bitcount(x & ~(UINT_MAX / 0b11)) ^ (bitcount(x) >> 1)) & 1

bitcountया तो हार्डवेयर popcntनिर्देश का उपयोग कर सकते हैं , या इसे मैन्युअल रूप से उपयोग करके कार्यान्वित किया जा सकता है या तो अंतिम या दूसरे-से-अंतिम बिट की आवश्यकता है, जैसे तेज कटौती

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.