भूख गेमिंग - खाओ या मरो
यदि आप नहीं खाते हैं, तो आप मर जाते हैं। यदि आप खाते हैं, तो आप जीते हैं (जब तक आप मर नहीं जाते) तुम मर जाओगे , इसलिए आखिरी मरने की कोशिश करो।
अवलोकन
शिकारियों के झुंड के साथ आबादी वाला एक द्वीप है। आप पाँच शिकारियों के एक पैकेट को नियंत्रित करते हैं। आपका उद्देश्य अपने पैक को जीवित रखना है। शिकार खाकर ऐसा करो। शिकारियों को शिकारियों से भागना पड़ता है, और अन्यथा झुंड में रहने की कोशिश करें। बेशक, आपका पैक हर दूसरे पैक की तरह ही उसी क्षेत्र में होगा, इसलिए प्रतियोगिता आपके खाने से पहले उन्हें खाने की कोशिश करेगी। इसे आप हतोत्साहित न करें, या आप भूखे मरेंगे।
कैसे खेलें
अपने पैक को निर्देशित करने के लिए कमांड लाइन प्रोग्राम बनाएं और सबमिट करें। यह STDIN पर नियंत्रण कार्यक्रम, और STDOUT पर आउटपुट कमांड से राज्य की जानकारी प्राप्त करेगा। प्रारूप नीचे विस्तार से दिया गया है। प्रत्येक कार्यक्रम को केवल एक बार निष्पादित किया जाएगा और तब तक चलना चाहिए जब तक कि उसके पास अधिक पैक सदस्य जीवित न हों। इसमें आते ही आपको इनपुट पढ़ना होगा और जल्दी से जवाब देना होगा। प्रत्येक प्रतिक्रिया के लिए 200ms का एक सख्त समयबाह्य है। यदि आपने तब तक जवाब नहीं दिया है, तो आपके पैक को वर्तमान मोड़ के लिए नए निर्देश प्राप्त नहीं होंगे।
यदि आपका प्रोग्राम कंट्रोलर द्वारा नहीं चलाया जा सकता है, तो इसे वैध नहीं माना जाएगा। कृपया कमांड लाइन स्ट्रिंग शामिल करें जो मुझे आपके सबमिशन को चलाने के लिए उपयोग करने की आवश्यकता होगी। यदि कोई विशेष निर्देश हैं (संकलक स्थापित करने के लिए, आदि), तो कृपया उन्हें शामिल करें। अगर मुझे यह काम नहीं मिल रहा है, तो मैं आपसे टिप्पणियों में सहायता के लिए पूछूंगा। यदि आप जवाब नहीं देते हैं, तो मैं आपकी अधीनता स्वीकार नहीं कर पाऊंगा।
टूर्नामेंट 64 बिट लिनक्स सिस्टम पर आयोजित किया जाएगा। कोई भी आवश्यक दिशा निर्देश देते समय इसका ध्यान रखें।
विवरण
प्रत्येक प्राणी की स्थिति और दिशा क्रमशः
double
उनकेx
औरy
निर्देशांक का प्रतिनिधित्व करने वाले दोहरे-सटीक फ़्लोटिंग पॉइंट नंबरों (जैसे ) की एक जोड़ी के रूप में होती है ।प्रत्येक प्राणी एक बिंदु माना जाता है। इसका मतलब है कि वे एक ही स्थान पर ओवरलैप और कब्जा कर सकते हैं। आप एक तरफ टकराएंगे नहीं, और अन्य प्राणियों के साथ टकराव की कोई अवधारणा नहीं है।
द्वीप एक वर्ग है, एक तरफ 500 इकाइयाँ हैं। यदि आप उन सीमाओं से परे उद्यम करने की कोशिश करते हैं, तो आपको किनारे पर जकड़ दिया जाएगा। मूल
{0,0}
ऊपरी-बाएँ में है,x
दाईं ओरy
बढ़ने और नीचे की ओर बढ़ने के साथ । फिर से, नक्शा लपेट नहीं करता है ।खेल 1500 + (packCount * 50) शिकार जानवरों के साथ शुरू होता है। उन्हें द्वीप के केंद्र में इकट्ठा किया जाएगा, लेकिन जल्दी से चलना शुरू करने का फैसला किया।
परिधि के चारों ओर समान रूप से दूरी वाले सर्कल में पैक्स की व्यवस्था की जाएगी। पैक ऑर्डर में फेरबदल किया गया है, इसलिए किसी विशेष स्थान पर शुरू करने पर भरोसा न करें।
प्रिही जानवर 30 यूनिट के दायरे में अन्य सभी जानवरों को देख सकते हैं । वे अधिकतम 6.0 यूनिट प्रति मोड़ पर जा सकते हैं।
शिकारी 50 इकाई के दायरे में अन्य सभी जानवरों को देख सकते हैं। वे अधिकतम 6.1 यूनिट प्रति मोड़ पर जा सकते हैं। इसका मतलब है कि वे शिकार होने से पहले देख सकते हैं और (बमुश्किल) उन्हें पीछे छोड़ सकते हैं।
शिकारी अपनी भूख के स्तर के अनुसार जीते और मरते हैं । यह 1000 से शुरू होता है , और प्रत्येक मोड़ से घटता है। अगर, आंदोलन के बाद, एक शिकारी शिकार की 1 इकाई के भीतर है, तो यह स्वचालित रूप से इसे खा जाएगा। यह शिकार को हटा देता है और शिकारी की भूख को 1000 पर सेट करता है। प्रत्येक शिकारी केवल एक शिकार को प्रति बार खा सकता है। यदि सीमा के भीतर एक से अधिक हैं, तो यह जो भी पहले लूप प्राप्त करेगा उसे खाएगा (जरूरी नहीं कि निकटतम)। एक शिकारी मर जाता है अगर उसकी भूख शून्य तक पहुंच जाती है।
पैक पांच सदस्यों के साथ शुरू होता है । हर 5000 मोड़, खेल में अभी भी सभी पैक एक नए सदस्य को जन्म देगा। इसे एक साथी पैक सदस्य के दृश्यमान सीमा के भीतर रखा जाएगा। सुनिश्चित करें कि आपकी प्रविष्टियाँ पाँच से अधिक सदस्यों को संभाल सकती हैं।
हर 1000 मोड़, अधिक शिकार होगा। नए शिकार की संख्या में रहने वाले शिकारियों की संख्या माइनस एक होगी।
शिकारी दूसरे शिकारियों पर हमला नहीं कर सकते। जब वे इसे पकड़ते हैं तो वे शिकार करते हैं। बस।
एक मोड़ के भीतर आदेश है:
- सभी शिकार निर्णय लेते हैं
- सभी शिकारी निर्णय लेते हैं
- सभी शिकार करते हैं
- सभी शिकारी चलते / खाते हैं
प्रत्येक पैक उनके आदेश / चालों को प्रत्येक मोड़ पर यादृच्छिक रूप से व्यवस्थित करता है।
प्रोटोकॉल (सामान्य)
सभी संचार स्ट्रिंग प्रारूप में किए जाते हैं US-ASCII
। जावा Double.toString()
या का उपयोग करके संख्याओं को स्ट्रिंग में बदल दिया जाता है Integer.toString()
। आपके आउटपुट को स्वरूपित किया जाना चाहिए ताकि इसे जावा के द्वारा पढ़ा जा सके Double.valueOf(String)
(आप पूर्णांक आउटपुट नहीं कर रहे हैं)। पार्स करने योग्य प्रारूपों के विवरण के लिए, के लिए प्रलेखनDouble
देखें । एक पंक्ति के सभी फ़ील्ड मानक \t
वर्ण द्वारा अलग किए जाते हैं , और नए अंक होते हैं \n
। पूरे स्ट्रिंग को समाप्त कर दिया जाएगा एक अशक्त बाइट \0
।
नीचे दिए गए उदाहरणों में, मैं <>
पठनीयता के लिए खेतों को चिह्नित करने के लिए उपयोग कर रहा हूं । ये वास्तविक तारों में मौजूद नहीं हैं।
प्रोटोकॉल (इनपुट)
इनपुट स्ट्रिंग लंबाई में भिन्न होती है, जो इस बात पर निर्भर करती है कि आपके पैक में कितने जीव दिखाई दे रहे हैं। यह 100k अक्षरों को पार कर सकता है, इसलिए इसके लिए तैयार रहें। मूल सेटअप है:
लाइन 0: खेल के बारे में बुनियादी जानकारी।
turn
वर्तमान मोड़ संख्या है, और क्षेत्र में शिकार और शिकारियों की कुल संख्या को छोड़ दिया जाता है। येinteger
स्ट्रिंग रूप में हैं।<turn>\t<preyCount>\t<predatorCount>\n
पंक्ति 1: आपके पैक सदस्यों की विशिष्ट आईडी और भूख का स्तर। ये हर इनपुट के लिए समान क्रम में नहीं दिए गए हैं । व्यक्तिगत सदस्यों को ट्रैक करने के लिए अद्वितीय आईडी का उपयोग करें, न कि उस क्रम में जिसमें वे इनपुट में दिखाई देते हैं। फिर, ये
integer
तार के समान हैं। दो पैक के लिए, यह होगा:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
पंक्ति 2: आपके पैक सदस्यों के स्थान, उसी क्रम में जैसे पंक्ति 1 पर दिए गए हैं । ये
double
स्ट्रिंग के रूप में हैं :<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
निम्न पंक्तियाँ प्रत्येक पैक सदस्य की दृश्यता हैं, उसी क्रम में जैसा कि पंक्ति 1 पर दिया गया है । इन्हें प्रति सदस्य दो लाइनों के रूप में दिया जाएगा।
प्रत्येक के लिए सबसे पहले वह देख सकता है शिकार के लिए स्थानों में शामिल हैं । दूसरा शिकारियों के लिए स्थान है जिसे वह देख सकता है। ये स्थान एक पूरे के रूप में अद्वितीय नहीं हैं। उदाहरण के लिए, यदि दो पैक सदस्य एक ही जानवर को देख सकते हैं, तो यह दोनों सदस्य के स्ट्रिंग में होगा। इसके अलावा, अपने स्वयं के पैक सदस्यों जाएगा शामिल किया। यदि आप उन्हें बाहर करना चाहते हैं, तो आप अपने स्वयं के सदस्यों के साथ स्थानों की तुलना करना चाहते हैं। सभी स्थान double
स्ट्रिंग प्रारूप के रूप में हैं ।
प्रत्येक जीवित सदस्य के लिए:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
अंत में, अंतिम चरित्र \0
अगली पंक्ति की शुरुआत में होगा।
अपवाद: यदि आप इनपुट प्राप्त करते हैं dead\0
, तो आपका पैक मृत है। कृपया अपना कार्यक्रम समाप्त करें, कृपया। नियंत्रक को बंद होने पर सभी जीवित प्रक्रियाओं को बंद कर देना चाहिए , लेकिन मेरे पास सभी जगह ज़ोंबी प्रक्रिया नहीं होगी। शिष्टाचार के रूप में, आप एक इनपुट टाइमआउट शामिल कर सकते हैं। उदाहरण के लिए, मेरा उदाहरण वर्ग तब समाप्त होता है जब उसे 15 सेकंड के लिए इनपुट प्राप्त नहीं होता है।
प्रोटोकॉल (आउटपुट)
आउटपुट सरल है। आप double
प्रत्येक जीवित पैक सदस्य के लिए एक जोड़ी मान देंगे । ये उस आंदोलन का प्रतिनिधित्व करते हैं जो आप उन्हें इस मोड़ पर ले जाना चाहेंगे। उदाहरण के लिए, यदि आपका प्राणी वर्तमान में है {100.0, 100.0}
और आप उन्हें आज्ञा देते हैं {-1.0, 1.0}
, तो वे आगे बढ़ेंगे {99.0, 101.0}
। सभी नंबर एक लाइन पर होंगे, जो टैब द्वारा अलग किए गए हैं।
उदाहरण के लिए, यदि आपके पास 3 पैक सदस्य जीवित हैं, तो यह एक मान्य प्रतिक्रिया होगी:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
यह द्वारा अपने जीव कदम होगा {1.0,-1.0}
, {2.0,-2.0}
और {3.0,-3.0}
। आदेश इनपुट में प्राप्त के समान है। अंत मत भूलना \0
!
यदि आप अमान्य इनपुट देते हैं, तो बुरे परिणाम होंगे। यदि किसी एकल संख्या को a को पार्स नहीं किया जा सकता है double
, तो यह शून्य हो जाएगा। यदि स्ट्रिंग को पूरी तरह से पार्स नहीं किया जा सकता है, तो कोई नया निर्देश नहीं दिया जाएगा, और आपका पूरा पैक पिछली बारी से निर्देशों का उपयोग करेगा।
सभी दिशाओं को 6.1 इकाइयों की अधिकतम दूरी तक जोड़ा जाएगा। यदि आप चाहें तो आप इसे धीमा कर सकते हैं। उदाहरण के लिए, {1, 0}
आप एक इकाई को स्थानांतरित करेंगे। {6,8}
(दूरी 10) केवल आपको 6.1 इकाइयों को स्थानांतरित कर देगा, और चारों ओर कम कर देगा {3.66, 4.88}
। दिशा स्थिर रहती है।
महत्वपूर्ण: नियंत्रण कार्यक्रम आपके STDOUT और STDERR दोनों को पढ़ता है । यदि आप एक अपवाद को फेंकते हैं और STDERR को प्रिंट करते हैं, तो यह बहुत संभावना नहीं है कि संदेश एक मान्य प्रतिक्रिया के रूप में होगा। ऐसा करने से बचने की कोशिश करें।
नियंत्रण कार्यक्रम / परीक्षण
नियंत्रक के लिए स्रोत bitbucket.org पर यहां देखे जा सकते हैं । दौड़ने से पहले आपको इसे संकलित करना होगा। मुख्य वर्ग है Game
, और सभी कक्षाएं डिफ़ॉल्ट पैकेज में हैं। चलाने के लिए, प्रत्येक पैक की कमांड को एक अलग तर्क के रूप में शामिल करें। उदाहरण के लिए, यदि आप एक जावा चेज़रपैक और एक पायथन लाजपैकहोम चलाना चाहते हैं, तो आप उपयोग कर सकते हैं:
java Game "java ChaserPack" "python LazyPack.py"
नक्शे में, शिकार हरे रंग में दिखाई देते हैं, और लाल रंग में शिकारी। हालांकि, जो भी पैक एक तर्क के रूप में दिया गया पहला पैक है, उसके बजाय नीले रंग का होगा। इसका उद्देश्य परीक्षण उद्देश्यों के लिए उन्हें अधिक आसानी से भेद करना है। जब वे खाते हैं तो शिकारी भी पांच फ्रेम के लिए सफेद चमकेंगे।
गेम अंतिम शिकारी स्टार्स तक पहुंच जाएगा, कंसोल को भुखमरी या विलुप्त होने की घटनाओं के रूप में लिखता है। एक बार गेम पूरा होने के बाद, प्रत्येक पैक के लिए स्कोर दिया जाएगा। यदि आप भुखमरी / विलुप्त होने की घटनाओं को नहीं देखना चाहते हैं, तो आप -silent
तर्क का उपयोग कर सकते हैं । तब यह केवल अंतिम स्कोर का उत्पादन करेगा। आपको इसे पहले तर्क के रूप में पारित करना होगा :
java Game -silent "java ChaserCat" "./someOtherPack"
शामिल एक कंकाल जावा पैक है GenericPack
। इसमें आवश्यक मूल इनपुट / आउटपुट ऑपरेशन शामिल हैं। यह एक स्पष्ट उदाहरण है कि पार्स और उत्तर कैसे दिया जाए। यदि आप किसी अन्य भाषा में टेम्पलेट जोड़ना चाहते हैं, तो मुझे बताएं।
भी शामिल, टेम्पलेट के आधार पर एक शिकारी है ChaserPack
। यह टूर्नामेंट में शामिल नहीं होगा, और केवल परीक्षण प्रयोजनों के लिए शामिल किया गया है। जानबूझकर लक्षित दोष के कारण यह काफी खराब प्रदर्शन करता है। यदि आप इसे हरा नहीं सकते हैं, तो कोशिश करते रहें।
नीचे नियंत्रण कार्यक्रम का एक उदाहरण रन (वीडियो के लिए क्लिक करें) है। वीडियो की गुणवत्ता बढ़िया नहीं है (क्षमा करें), लेकिन आप यह महसूस कर सकते हैं कि शिकार कैसे चलता है। ( सावधानी: ऑडियो )
स्कोरिंग
विजेता को प्रत्येक राउंड में अंक प्राप्त करके, टूर्नामेंट द्वारा निर्धारित किया जाएगा।
प्रत्येक दौर तब तक आगे बढ़ता है जब तक सभी शिकारी मर नहीं जाते। प्रत्येक पैक के आधार पर स्कोर किया जाएगा जब इसके अंतिम सदस्य भुखमरी से मर गए। फिर उन्हें आदेश के आधार पर अंक दिए जाएंगे। अंक दस राउंड के लिए जमा होंगे, और विजेता उच्चतम कुल अंकों के साथ पैक है।
प्रत्येक राउंड के लिए पहले स्थान पर 100 अंक प्राप्त होंगे। उसके बाद प्रत्येक स्थान के लिए, इनाम में 20% (गोल नीचे) की कमी होगी। यह तब तक जारी रहेगा जब तक अंक शून्य (17 वें स्थान के बाद) तक नहीं पहुंच जाते। 18+ स्थानों को गोल के लिए कोई अंक नहीं मिलेगा। टाई करने वाले पैक को बराबर अंक प्राप्त होंगे। उदाहरण के लिए:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
टूर्नामेंट के पाठ्यक्रम पर अधिकतम संभव बिंदु 1000 हैं, पहले स्थान पर सभी दस बार से।
यदि कई कार्यक्रम पहले स्थान के लिए बंधे टूर्नामेंट को समाप्त करते हैं, तो एक और दस राउंड टूर्नामेंट केवल प्रथम स्थान वाली प्रविष्टियों के साथ आयोजित किया जाएगा । यह तब तक जारी रहेगा जब तक कि एक विजेता नहीं उभरता।
मैं एक टूर्नामेंट लगभग साप्ताहिक रूप से चलाने की कोशिश करूंगा, या जैसे ही नई प्रस्तुतियाँ आएंगी।
अतिरिक्त नियम (निष्पक्ष खेलते हैं!)
आप किसी भी बाहरी संसाधन को पढ़ या लिख नहीं सकते हैं। चूँकि आप अपने प्रोग्राम म्यूटाल्टर समय को लागू नहीं करने जा रहे हैं, किसी भी राज्य की जानकारी को आंतरिक रूप से संग्रहीत किया जा सकता है।
अन्य प्रक्रियाओं / प्रस्तुतियाँ में हस्तक्षेप न करें। इसका मतलब यह नहीं है कि वे अपने शिकार को चुराने की कोशिश न करें, उन्हें छोड़ दें, आदि इसका मतलब है कि इस प्रक्रिया को चलाने में हस्तक्षेप न करें। यह मेरे विवेक पर है।
प्रतियोगी अधिकतम तीन प्रविष्टियों तक सीमित हैं । यदि आप अधिक जमा करते हैं, तो मैं केवल पहले प्रस्तुत किए गए तीन अंक प्राप्त करूंगा। यदि आप किसी को रद्द करना चाहते हैं, तो उसे हटा दें।
प्रविष्टियाँ केवल अन्य प्रविष्टियों को प्रचलित करने के लिए मौजूद नहीं हो सकती हैं। प्रत्येक को अपनी योग्यता के आधार पर जीतने के लिए खेलना चाहिए।
आपका कार्यक्रम एक समय में अधिकतम एक बच्चे की प्रक्रिया को जन्म दे सकता है ( कुल वंशज, प्रत्यक्ष नहीं)। किसी भी तरह से, सुनिश्चित करें कि आप टाइमआउट पर नहीं जाते हैं। हो सकता है कि आप
Game
किसी भी तरह से कक्षा में प्रवेश न करें ।
परिणाम - 29 अप्रैल 2014
यहाँ नवीनतम दस-राउंड टूर्नामेंट के परिणाम हैं:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
09:00 EDT 2014/04/29 से पहले प्रस्तुत पैक इस रन में शामिल हैं।
आप प्रत्येक दौर के लिए विवरण भी देख सकते हैं । किसी कारण से मैंने राउंड को पीछे की ओर करने का फैसला किया, इसलिए यह "राउंड 10" से शुरू होता है।
अपडेट
2014/04/23: FGreg ने टाइमआउट से संबंधित बग की सूचना दी (धन्यवाद!)। एक फिक्स लागू किया गया है, इसलिए परीक्षक अपने नियंत्रण कार्यक्रम कोड को अपडेट करना चाहेंगे।