यह जुलाई में क्रिसमस है, इसलिए एक आभासी सफेद हाथी उपहार विनिमय की तुलना में जश्न मनाने का बेहतर तरीका क्या है!
इस किंग ऑफ द हिल चैलेंज के लिए, आपको एक बॉट बनाना होगा जो कि व्हाइट एलिफेंट एक्सचेंज के सिमुलेशन में खेलता है , जो उच्चतम-मूल्य वाले वर्तमान में प्राप्त करने की कोशिश कर रहा है।
खेल के नियमों
- खेल कई राउंड में खेला जाएगा, प्रत्येक घुमावों की एक चर संख्या से बना होता है।
- राउंड सेटअप : खेल में जितने खिलाड़ी होते हैं, उतने ही प्रस्तुत होंगे, जिनमें से प्रत्येक का मूल्य सीमा में समान रूप से समान रूप से होता है, यह मान तब तक अज्ञात रहता है जब तक कि वर्तमान "खोला" नहीं जाता है। खिलाड़ियों को एक कतार में यादृच्छिक क्रम में रखा जाएगा। पहला खिलाड़ी कतार के सामने से पॉप किया जाएगा।
- जब यह एक खिलाड़ी की बारी है, तो वे या तो एक वर्तमान को खोल सकते हैं या किसी अन्य खिलाड़ी के वर्तमान को चुरा सकते हैं, उस खिलाड़ी को पासिंग टर्न दे सकते हैं जिसका वर्तमान चोरी हो गया था।
- प्रत्येक वर्तमान को 3 बार तक चुराया जा सकता है।
- आप उस खिलाड़ी से चोरी नहीं कर सकते जो सिर्फ आपसे चुराता है।
- प्रत्येक खिलाड़ी एक समय में केवल एक ही उपस्थित हो सकता है।
- एक प्रेजेंट खुलने के बाद, अगले खिलाड़ी को कतार के सामने से पॉप करते हुए खेलते हैं। यह अगले क्रम का खिलाड़ी होगा जिसने अभी तक टर्न नहीं लिया है।
- राउंड एंड : जब सभी प्रस्तुतियाँ खोली गई हैं, तो राउंड समाप्त होता है, और प्रत्येक खिलाड़ी द्वारा आयोजित वर्तमान का मूल्य उस खिलाड़ी के स्कोर में जोड़ा जाता है। एक नया दौर शुरू होता है, प्रत्येक खिलाड़ी के पास अब कोई मौजूद नहीं होता है और खिलाड़ी का क्रम बदल जाता है।
- गेम एंड : गेम तब खत्म होगा जब कम से कम एक खिलाड़ी ने
100500 अंक हासिल किए हों, जीत के साथ खिलाड़ी को उच्चतम कुल मूल्य के साथ पुरस्कार प्रदान किए जाएंगे ।
कोडिंग
सभी प्रस्तुतियाँ पायथन 3.7 के साथ संगत होनी चाहिए। आपको एक ऐसा वर्ग लिखना होगा जो सीधे विरासत में मिला हो WhiteElephantBot
। उदाहरण के लिए:
class FooBot(WhiteElephantBot):
# Your implementation here
आप अपने बॉट क्लास में एक __init__
विधि (जो एक तर्क लेता है name
) प्रदान कर सकते हैं , जिसे कॉल करना होगा super().__init__(name)
। आपकी कक्षा take_turn
में इस क्रम में निम्नलिखित तर्कों की अपेक्षा करने की एक विधि होनी चाहिए :
players
: उन खिलाड़ियों के नामों की सूची, बदले में, उन सभी खिलाड़ियों की जो अभी तक प्रस्तुत नहीं हुए हैं।presents
: एक डिक्शनरी जिसमें खिलाड़ी के नाम के 2-टुपल्स होते हैं, जिसमें उस खिलाड़ी के पास मौजूद मूल्य और वर्तमान में कितनी बार चोरी हुई है। इसमें केवल अन्य खिलाड़ी शामिल होंगे जो वर्तमान में प्रस्तुतियां दे रहे हैं।just_stole
: यदि अंतिम कार्रवाई एक चोरी थी, तो यह उस खिलाड़ी का नाम होगा जिसने सिर्फ चुराया था। यदि नहीं, तो यह होगाNone
।
प्रत्येक तर्क अपरिवर्तनीय या एक नई वस्तु होगी ताकि उनमें से किसी को भी म्यूट करने से खेल पर प्रभाव न पड़े। यदि आप चाहें, तो आप किसी भी तर्क की एक प्रति रख सकते हैं।
इसके लिए एक उदाहरण मूल्य presents
:
{
'Alice': (0.35, 0),
'Bob': (0.81, 2),
'Charlie': (0.57, 1)
}
आपकी take_turn
विधि उस खिलाड़ी का नाम वापस करना चाहिए जिसे आप चोरी करना चाहते हैं या None
वर्तमान को खोलना चाहते हैं। यदि यह अपवाद उठाता है, str
या इसके अलावा कुछ और लौटाता है None
, या किसी खिलाड़ी का नाम जिसे आप चुरा नहीं सकते हैं, तो आप डिफ़ॉल्ट रूप से एक वर्तमान खोल देंगे।
आपके निर्माता को प्रत्येक दौर की शुरुआत में बुलाया जाएगा, इसलिए आपको राउंड से लेकर राउंड तक याद रखने की आवश्यकता नहीं है।
से विरासत में WhiteElephantBot
, आपके पास एक ऐसी steal_targets
विधि तक पहुंच होगी जो प्रस्तुतियों को तानाशाही में ले जाएगी और just_stole
उन खिलाड़ियों के नामों की सूची लौटाएगी जिनसे आप चोरी कर सकते हैं।
आपकी लिपि के किसी भी मॉड्यूल को आपकी प्रविष्टि के शीर्ष पर आयात किया जाना चाहिए।
परीक्षण चालक
परीक्षण चालक यहां पाया जा सकता है । आपको from white_elephant import WhiteElephantBot
अपने पोस्ट किए गए उत्तर में शामिल करने की आवश्यकता नहीं है , हालांकि एक स्थानीय मॉड्यूल को ऐसा करने की आवश्यकता होगी।
बेसलाइन प्रतियोगी
- रैंडम : एक नया वर्तमान खोलने के लिए या चोरी करने के लिए यादृच्छिक रूप से चुनता है, चोरी के लक्ष्य के साथ समान रूप से बेतरतीब ढंग से चुना जाता है।
- लालची : सबसे मूल्यवान वर्तमान चुरा सकता है जो चोरी हो सकता है। यदि कोई उपहार नहीं चुराया जा सकता है, तो एक वर्तमान खोलें।
- अच्छा : हमेशा एक नया वर्तमान खोलता है। कभी चोरी नहीं करता।
अतिरिक्त नियम
- सभी अपवादों को पकड़ना आपकी जिम्मेदारी है। यदि आपकी कक्षा एक अपवाद को पकड़ने में विफल रहती है, तो उसे अयोग्य घोषित कर दिया जाएगा। इसके अलावा, कृपया KeyboardInterrupts को न पकड़ें।
- खेलों के बीच स्थिति को बचाने में असमर्थता को बायपास करने के लिए फ़ाइलों या अन्य तरीकों का उपयोग न करें। उदाहरण के लिए, आप एक तंत्रिका नेटवर्क स्थिति को एक फ़ाइल मिड-रन में सहेज नहीं सकते हैं।
- आपके बॉट को कक्षा कोड और संबंधित स्थिरांक के भीतर स्व-निहित होना चाहिए।
- आप केवल मानक पुस्तकालय आयात का उपयोग कर सकते हैं।
- प्रदर्शन की कोई सख्त आवश्यकता नहीं है। उचित और विवेकपूर्ण बनें। यदि प्रदर्शन एक मुद्दा बन जाता है, तो मैं समय सीमा जोड़ने का अधिकार सुरक्षित रखता हूं।
प्रति व्यक्ति एक प्रविष्टि।यदि आप एक से अधिक प्रविष्टि जमा करते हैं, तो आपके बॉट एक साथ काम नहीं कर सकते हैं। मैं अभी प्रति व्यक्ति के लिए कई प्रविष्टियों की अनुमति देने जा रहा हूं, हालांकि बाद में अगर यह एक समस्या बन जाती है तो मैं इसे दोबारा खोल सकता हूं।- यह एक खुली प्रतियोगिता है जिसमें कोई अलग अंतिम तिथि नहीं है। जब भी महत्वपूर्ण परिवर्तन हुए हैं, मैं किसी भी समय सक्षम हूं।
EDIT1: 100 से 500 तक विजयी स्कोर बदला ताकि रैंकिंग अधिक सुसंगत हो। टेस्ट ड्राइवर में एक नया बगफिक्स होता है और यह जीत के स्कोर में बदलाव को भी दर्शाता है।
EDIT2: आवश्यक आयात पर स्पष्ट नोट।
लीडरबोर्ड (अगस्त 8, 2018 के अनुसार)
- नमूनाबोट (500.093)
- LastMinuteBot (486.163)
- रॉबिनहुड (463.160)
- OddTodd (448.825)
- GreedyBot (438.520)
- SecondPlaceBot (430.598)
- थ्रेसहोल्डबॉट (390.480)
- जुआरी (313.362)
- नाइसबोट (275.536)
- रैंडमबॉट (256.172)
- गुडसमैन (136.298)