उपयोगकर्ता कारपेटपाइथॉन ने इस समस्या पर एक नया कदम पोस्ट किया , जो वृद्धि के खोज स्थान के कारण, हेयुरिस्टिक समाधानों पर अधिक ध्यान केंद्रित करता है। मैं व्यक्तिगत रूप से सोचता हूं कि चुनौती मेरी तुलना में बहुत अच्छी है, इसलिए इस पर विचार करने की कोशिश करें!
वेक्टर रेसिंग एक नशे की लत खेल है जिसे एक कलम और वर्ग-शासित कागज की एक शीट के साथ खेला जा सकता है। आप कागज पर एक मनमाना रेसट्रैक बनाते हैं, एक शुरुआत और अंत को परिभाषित करते हैं और फिर आप अपनी बात के आकार की कार को मोड़-आधारित तरीके से चलाते हैं। जितनी जल्दी हो सके अंत करने के लिए जाओ, लेकिन एक दीवार में समाप्त नहीं करने के लिए सावधान रहें!
ट्रैक
- नक्शा एक दो आयामी ग्रिड है, जहां प्रत्येक सेल में पूर्णांक निर्देशांक होते हैं।
- आप ग्रिड कोशिकाओं पर चलते हैं।
- प्रत्येक ग्रिड सेल या तो ट्रैक का हिस्सा है या यह एक दीवार है।
- वास्तव में एक ट्रैक सेल शुरुआती समन्वय है।
- कम से कम एक ट्रैक सेल को लक्ष्य के रूप में नामित किया गया है। इनमें से किसी एक पर उतरने से दौड़ पूरी होती है। एकाधिक लक्ष्य कोशिकाएं आवश्यक रूप से जुड़ी नहीं हैं।
स्टीयरिंग कार
आपकी कार एक दिए गए समन्वय पर और वेग वेक्टर के साथ शुरू होती है (0, 0)
। प्रत्येक मोड़ में, आप वेग के प्रत्येक घटक को समायोजित कर सकते हैं ±1
या इसे छोड़ सकते हैं। फिर, परिणामस्वरूप वेग वेक्टर को आपकी कार की स्थिति में जोड़ा जाता है।
एक चित्र मदद कर सकता है! लाल घेरा आपकी स्थिति अंतिम मोड़ था। नीला वृत्त आपकी वर्तमान स्थिति है। आपका वेग लाल से नीले वृत्त तक का वेक्टर है। इस मोड़ में, आप अपने वेग को कैसे समायोजित करते हैं, इस पर निर्भर करते हुए, आप किसी भी हरे रंग की मंडलियों में जा सकते हैं।
आप तो देश एक दीवार में, आप तुरंत खो देते हैं।
आपका कार्य
आपने यह अनुमान लगाया: एक प्रोग्राम लिखें , जो इनपुट के रूप में एक रेसट्रैक दिया गया हो, कार को लक्ष्य कोशिकाओं में से किसी एक के रूप में संभव के रूप में बदल देता है। आपका समाधान मनमाने ढंग से पटरियों के साथ बहुत अच्छी तरह से निपटने में सक्षम होना चाहिए और विशेष रूप से प्रदान किए गए परीक्षण मामलों के लिए अनुकूलित नहीं होना चाहिए।
इनपुट
जब आपका कार्यक्रम लागू किया जाता है, तो स्टडिन से पढ़ें :
target
n m
[ASCII representation of an n x m racetrack]
time
target
ट्रैक को पूरा करने के लिए आपके द्वारा किए जाने वाले परिवर्तनों की अधिकतम संख्या है, और time
सेकंड में (आवश्यक रूप से पूर्णांक नहीं) ट्रैक के लिए आपका कुल समय बजट है। समय के बारे में जानकारी के लिए नीचे देखें।
न्यूलाइन-सीमांकित ट्रैक के लिए, निम्न वर्णों का उपयोग किया जाता है:
#
- दीवारS
- शुरू*
- एक लक्ष्य.
- अन्य सभी ट्रैक सेल (यानी सड़क)
दी गई n x m
ग्रिड के बाहर की सभी कोशिकाओं को दीवारों के होने का अनुमान है।
समन्वित मूल शीर्ष बाएं कोने में है।
ये रहा एक सरल उदाहरण:
8
4.0
9 6
###...***
###...***
###...***
......###
S.....###
......###
0-आधारित अनुक्रमण का उपयोग करना, प्रारंभिक समन्वय होगा (0,4)
।
हर कदम के बाद आपको आगे इनपुट मिलेगा:
x y
u v
time
कहाँ x
, y
, u
, v
सभी 0-आधारित पूर्णांक हैं। (x,y)
आपकी वर्तमान स्थिति है और (u,v)
आपका वर्तमान वेग है। ध्यान दें कि x+u
और / या y+v
सीमा से बाहर हो सकता है।
time
आपके बजट का जो कुछ भी बचा है, वह सेकंड में है। बेझिझक इसे अनदेखा करें। यह केवल उन प्रतिभागियों के लिए है जो वास्तव में अपने कार्यान्वयन को समय सीमा तक ले जाना चाहते हैं।
जब खेल खत्म हो जाता है (क्योंकि आप एक दीवार में उतरे हैं, सीमा से बाहर चले गए, target
बदल गए, समय से बाहर भाग गए या लक्ष्य तक पहुंच गए), तो आपको एक खाली लाइन प्राप्त होगी।
उत्पादन
प्रत्येक मोड़ के लिए, stdout को लिखें :
Δu Δv
जहां Δu
और Δv
प्रत्येक में से एक हैं -1
, 0
, 1
। यह (u,v)
आपकी नई स्थिति निर्धारित करने के लिए जोड़ा जाएगा । बस स्पष्ट करने के लिए, निर्देश निम्नानुसार हैं
(-1,-1) ( 0,-1) ( 1,-1)
(-1, 0) ( 0, 0) ( 1, 0)
(-1, 1) ( 0, 1) ( 1, 1)
उपरोक्त उदाहरण के लिए एक इष्टतम समाधान होगा
1 0
1 -1
1 0
ध्यान दें कि कंट्रोलर खुद को stderr के साथ संलग्न नहीं करता है , इसलिए आप किसी भी प्रकार के डिबग आउटपुट के लिए इसका उपयोग करने के लिए स्वतंत्र हैं, जबकि आपको अपना बॉट विकसित करने की आवश्यकता हो सकती है। कृपया अपने सबमिट किए गए कोड में ऐसे किसी भी आउटपुट को हटा दें / टिप्पणी करें।
आपका बॉट प्रत्येक एक बारी में जवाब देने के लिए आधा सेकंड ले सकता है। लंबे समय तक चलने वाले परिवर्तनों के लिए, आपके पास target/2
सेकंड का समय बजट (प्रति ट्रैक) होगा । हर बार जब एक मोड़ आधे से अधिक समय लेता है, तो अतिरिक्त समय आपके समय के बजट से घटाया जाएगा। जब आपका समय बजट शून्य हो जाएगा तो वर्तमान दौड़ समाप्त हो जाएगी।
नई: व्यावहारिक कारणों के लिए, मुझे एक मेमोरी सीमा निर्धारित करनी होगी (चूंकि मेमोरी उचित ट्रैक आकारों के लिए समय से अधिक सीमित लगती है)। इसलिए, मुझे किसी भी टेस्ट रन को निरस्त करना होगा, जहां रेसर निजी एक्सप्लोरर के रूप में प्रोसेस एक्सप्लोरर द्वारा मापा गया 1 जीबी से अधिक मेमोरी का उपयोग करता है ।
स्कोरिंग
20 पटरियों का एक बेंचमार्क है। प्रत्येक ट्रैक के लिए:
- यदि आप ट्रैक पूरा करते हैं, तो आपका स्कोर उन चालों की संख्या है जिन्हें आपको विभाजित करके
target
एक लक्ष्य सेल तक पहुंचने की आवश्यकता है । - आप समय / स्मृति समाप्त हो जाता है या लक्ष्य तक पहुँचने नहीं है इससे पहले कि
target
बारी-बारी से नहीं बीते हैं या आप किसी भी समय एक दीवार में देश / सीमा से बाहर, अपने स्कोर है2
। - यदि आपका कार्यक्रम निर्धारक नहीं है, तो आपका स्कोर उस ट्रैक पर औसतन 10 से अधिक रन है (कृपया अपने उत्तर में यह बताएं)।
आपका समग्र स्कोर व्यक्तिगत ट्रैक स्कोर का योग है। सबसे कम स्कोर जीत!
इसके अलावा, प्रत्येक प्रतिभागी एक अतिरिक्त बेंचमार्क ट्रैक प्रदान कर सकता है (और उसे दृढ़ता से प्रोत्साहित किया जाता है) , जिसे आधिकारिक सूची में जोड़ा जाएगा। इस नए ट्रैक सहित पिछले उत्तरों का पुनर्मूल्यांकन किया जाएगा। यह सुनिश्चित करने के लिए है कि कोई भी समाधान मौजूदा परीक्षण मामलों के बहुत करीब से तैयार नहीं है और दिलचस्प धार वाले मामलों के लिए जिम्मेदार है जो मुझे याद हो सकते हैं (लेकिन जो आप स्पॉट कर सकते हैं)।
बाँध तोड़ना
अब चूंकि पहले से ही एक इष्टतम समाधान है, यह संभवतः प्रतिभागियों के स्कोर के लिए मुख्य कारक होगा।
यदि कोई टाई है (कई उत्तरों के कारण सभी ट्रैक को बेहतर तरीके से हल करने के लिए या अन्यथा), मैं टाई को तोड़ने के लिए अतिरिक्त (बड़े) परीक्षण मामलों को जोड़ूंगा। उन टाई-ब्रेकरों को बनाते समय किसी भी मानवीय पूर्वाग्रह से बचने के लिए, ये एक निश्चित तरीके से उत्पन्न होंगे :
- मैं पक्ष लंबाई में वृद्धि होगी
n
द्वारा10
इस तरह से उत्पन्न पिछले ट्रैक की तुलना में। (यदि वे टाई नहीं तोड़ते हैं तो मैं आकार छोड़ सकता हूं।) - आधार यह वेक्टर-ग्राफिक है
- यह इस Mathematica स्निपेट का उपयोग करके वांछित रिज़ॉल्यूशन पर rasterised किया जाएगा ।
- शुरुआत शीर्ष बाएं कोने में है। विशेष रूप से, यह ट्रैक के उस छोर की सबसे ऊपरी पंक्ति का सबसे बाएं सेल होगा।
- लक्ष्य नीचे दायें कोने में है। विशेष रूप से, यह ट्रैक के उस छोर के सबसे नीचे पंक्ति का सबसे सही सेल होगा।
target
इच्छा4*n
।
प्रारंभिक बेंचमार्क का अंतिम ट्रैक पहले से ही इस तरह तैयार किया गया था, जिसके साथ n = 50
।
नियंत्रक
प्रोग्राम जो सबमिशन का परीक्षण करता है, वह रूबी में लिखा जाता है और मुझे जिस बेंचमार्क फ़ाइल का उपयोग करना होगा, उसके साथ GitHub पर पाया जा सकता है । वहाँ एक उदाहरण बॉट भी कहा जाता randomracer.rb
है, जो बस यादृच्छिक चालें चुनता है। आप अपने बुनियादी ढांचे का उपयोग अपने बॉट के लिए शुरुआती बिंदु के रूप में कर सकते हैं कि संचार कैसे काम करता है।
आप अपनी पसंद की एक ट्रैक फाइल के खिलाफ अपना बॉट चला सकते हैं:
ruby controller.rb track_file_name command to run your racer
जैसे
ruby controller.rb benchmark.txt ruby randomracer.rb
रिपॉजिटरी में भी दो वर्ग होते हैं Point2D
और Track
। यदि आपका सबमिशन रूबी में लिखा गया है, तो अपनी सुविधा के लिए उन का पुन: उपयोग करने के लिए स्वतंत्र महसूस करें।
कमांड-लाइन स्विच
आप कमांड लाइन स्विच जोड़ सकते हैं -v
, -s
, -t
बेंचमार्क के फ़ाइल नाम से पहले। आप एक से अधिक स्विच का उपयोग करना चाहते हैं, तो आप भी, उदाहरण के लिए कर सकते हैं, -vs
। यही है जो वे करते हैं:
-v
(क्रिया): नियंत्रक से थोड़ा अधिक डीबग आउटपुट बनाने के लिए इसका उपयोग करें।
-s
(मौन): यदि आप अपनी स्थिति और वेग को स्वयं ट्रैक करना पसंद करते हैं और समय के बजट की परवाह नहीं करते हैं, तो आप इस झंडे के साथ आउटपुट की तीन पंक्तियों को प्रत्येक मोड़ (आपके प्रस्तुत करने के लिए भेजा गया) को बंद कर सकते हैं।
-t
(ट्रैक्स): आपको टेस्ट किए जाने वाले व्यक्तिगत ट्रैक्स का चयन करने देता है। ईजी -t "1,2,5..8,15"
1, 2, 5, 6, 7, 8 और 15 को ही ट्रैक करेगा। इस सुविधा और विकल्प पार्सर के लिए वेंटरो को बहुत धन्यवाद ।
आपका सबमिशन
सारांश में, कृपया अपने उत्तर में निम्नलिखित शामिल करें:
- अपने स्कोर।
- यदि आप यादृच्छिकता का उपयोग कर रहे हैं, तो कृपया इसे बताएं, इसलिए मैं आपका स्कोर कई रनों से पार कर सकता हूं।
- आपके सबमिशन का कोड।
- अपनी पसंद की भाषा के लिए एक मुफ्त संकलक या दुभाषिया का स्थान जो विंडोज 8 मशीन पर चलता है।
- यदि आवश्यक हो तो संकलन निर्देश।
- अपना सबमिशन चलाने के लिए एक विंडोज कमांड-लाइन स्ट्रिंग।
- आपके जमा करने के लिए
-s
ध्वज की आवश्यकता है या नहीं। - (वैकल्पिक रूप से) एक नया, सॉल्व करने योग्य ट्रैक जिसे बेंचमार्क में जोड़ा जाएगा। मैं
target
मैन्युअल रूप से आपके ट्रैक के लिए एक उचित निर्धारित करूंगा । जब ट्रैक को बेंचमार्क में जोड़ा जाता है, तो मैं इसे आपके उत्तर से बाहर कर दूँगा। मैं आपको एक अलग ट्रैक के लिए पूछने का अधिकार सुरक्षित रखता हूं (यदि आप एक अव्यवस्थित रूप से बड़े ट्रैक को जोड़ते हैं, तो ट्रैक में अश्लील ASCII कला शामिल करें, आदि)। जब मैं परीक्षण मामले को बेंचमार्क सेट में जोड़ता हूं, तो मैं इस पोस्ट में अव्यवस्था को कम करने के लिए बेंचमार्क फ़ाइल में ट्रैक के लिंक के साथ आपके उत्तर में ट्रैक को बदल दूंगा।
जैसा कि आप देख सकते हैं, मैं विंडोज 8 मशीन पर सभी प्रस्तुतियाँ का परीक्षण करूँगा। अगर विंडोज पर आपके सबमिशन को पूरा करने का कोई तरीका नहीं है, तो मैं उबंटू वीएम पर भी कोशिश कर सकता हूं। हालांकि यह काफी धीमा होगा, इसलिए यदि आप समय सीमा को अधिकतम करना चाहते हैं, तो सुनिश्चित करें कि आपका प्रोग्राम विंडोज पर चलता है।
सबसे अच्छा चालक उभरेगा!
लेकिन मैं खेलना चाहता हूँ!
यदि आप इसके लिए एक बेहतर अनुभव प्राप्त करने के लिए गेम को स्वयं आज़माना चाहते हैं, तो यह कार्यान्वयन है । मेरे द्वारा उपयोग किए गए नियम थोड़े अधिक परिष्कृत हैं, लेकिन यह उपयोगी होने के लिए पर्याप्त समान है, मुझे लगता है।
लीडरबोर्ड
अंतिम अद्यतन: 01/09/2014, 21:29 यूटीसी
ट्रैक्स इन बेंचमार्क: 25
टाई-ब्रेकर आकार: 290, 440
- 6.86688 - कुरोई नेको
- 8.73108 - user2357112 - दूसरा सबमिशन
- 9.86627 - nneonneo
- 10.66109 - user2357112 - पहला सबमिशन
- 12.49643 - रे
- 40.0759 - छद्म नाम 117 (संभाव्य)
विस्तृत परीक्षण के परिणाम । (संभाव्य प्रस्तुतियाँ के लिए स्कोर अलग-अलग निर्धारित किए गए हैं।)