रोगेलुइक पाथफाइंडिंग


21

रोगेलुइक पाथफाइंडिंग

आपका कार्य नीचे दिए गए तत्वों का द्वि-आयामी सरणी दिया जाएगा, जो एक कालकोठरी का प्रतिनिधित्व करता है, एक एकल संख्या को आउटपुट या वापस करने के लिए सोने के टुकड़ों की मात्रा का प्रतिनिधित्व करता है जो दुष्ट किसी भी राक्षस को जगाए बिना एकत्र कर सकता है।

सरणी के तत्व इस प्रकार हैं:

  1. रिक्त स्थान .या तो या एक स्थान, आपके कॉल द्वारा दर्शाए जाते हैं ;
  2. दुष्ट की शुरुआती स्थिति का प्रतिनिधित्व, निश्चित रूप से, द्वारा किया जाता है @;
  3. एक सोने के टुकड़े द्वारा दर्शाया गया है $;
  4. दीवारों का प्रतिनिधित्व करते हैं #;
  5. राक्षसों का प्रतिनिधित्व निम्न regexp के पात्रों द्वारा किया जाता है [a-zA-Z*&]:।

सरणी में ऊपर सूचीबद्ध कोई भी वर्ण नहीं होगा, इसलिए आप मान सकते हैं कि कोई भी चीज़ जो दीवार नहीं है, खाली जगह है, बदमाश या सोने का टुकड़ा एक राक्षस है।

पाथफाइंडिंग के नियम हैं:

  1. दुष्ट केवल खाली कोशिकाओं या कोशिकाओं से चल सकता है जिसमें सोना होता है;
  2. यह एक आसन्न या तिरछे आसन्न सेल में जाने के लिए एक मोड़ लेता है;
  3. सोना उठाना तत्काल है;
  4. दुष्ट एक राक्षस से सटे या तिरछे नहीं रह सकता है, एक से अधिक बारी के लिए इसे जागने के बिना, जो निषिद्ध है;
  5. दुष्ट किसी भी समय एक राक्षस के जागरूकता क्षेत्र में प्रवेश कर सकता है, राक्षस केवल तभी उठेगा जब बदमाश उसके साथ लगातार दो बार घूमेगा।

इनपुट और आउटपुट नियम

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

यह गारंटी है कि बदमाश शुरुआत में एक राक्षस के पास नहीं होंगे।

एक पूर्ण कार्यक्रम या एक समारोह ठीक है।

स्कोरिंग

यह , यह स्कोर आपके सबमिशन का बाइट्स काउंट कम बेहतर है।

परीक्षण के मामलों

मैं पठनीय उद्देश्यों के लिए यहां रिक्त स्थानों के लिए डॉट्स का उपयोग करता हूं, यदि आप चाहें तो आप रिक्त स्थान का उपयोग कर सकते हैं (ऊपर देखें)। यह भी ध्यान दें कि यह एक शुद्ध संयोग है कि दुष्ट हमेशा ऊपरी-बाएँ कोने में होता है, आपके कोड को किसी अन्य मान्य स्थिति को भी संभालना चाहिए।

1)
@..
.$.
...  -> 1

बस एक स्वच्छता परीक्षण।

2)
@....
...g$
.....  -> 0

फिर से, एक विवेक परीक्षण।

3)
@....
...$g
.....  -> 1

बदमाश सोने को बाईं ओर घुमाकर पकड़ सकता है।

4)
@....g..
.......$
........
.....h..  -> 1

बदमाश राक्षसों के बीच झग-झग कर सकते हैं, कभी भी एक के पास एक से अधिक मोड़ के लिए नहीं रुक सकते।

5)
@....z..
.......$
.....b..  -> 0

पिछले परीक्षण मामले की रणनीति यहां काम नहीं करती है - राक्षस संवेदनशीलता क्षेत्र ओवरलैप।

6)
@$#.
###$
....  -> 1

चेतना जांच।

7)
@..#..
$.$g.$
...#..  -> 2

डिट्टो।

8)
@#.d#$
$...##
e.....
..$...
##..$b
.#..g$  -> 3

यहां सभी सोने में से, केवल तीन तक ही सुरक्षित रूप से पहुंचा जा सकता है: शुरुआती स्थिति के पास सोना एक को नीचे ले जाने और फिर शुरुआती स्थिति में वापस आ सकता है। शीर्ष बाएं कोने से भागने के लिए बदमाश को तिरछे डाउन-राइट को दो बार घुमाना पड़ता है। बीच में सोना कोई चुनौती नहीं है। बाहरी सोने की रखवाली की जाती है gऔर bइसे बीच सोने के स्थान से तिरछे स्थान पर घुमाकर और फिर वापस प्राप्त किया जा सकता है। बाकी नहीं मिल सकता है: शीर्ष-दाहिने सोने को दीवारों द्वारा अवरुद्ध किया जाता है, और नीचे-दाहिने सोने को राक्षस संवेदनशीलता क्षेत्रों में दो मोड़ की आवश्यकता होती है।

निम्नलिखित परीक्षण मामलों को उदारतापूर्वक mbomb007 द्वारा दान किया गया था।

9)
  12345678
a @....g.D
b .......$
c ......#.
d .....h..  -> 1

यह एक मुश्किल है। एक रास्ता है b4-b5-c6-b7-c8-b8(grab)

10)
  12345678
a @....g.D
b .......$
c .......#
d .....h..  -> 1

एक रास्ता है [bc]4-c5-b6-c7-b8(grab)

11)
  12345678
a @....g.D
b ......#$
c .......#
d .....h..  -> 1

अतिरिक्त दीवार वास्तव में कुछ भी नहीं बदलती है, [bc]4-c5-b6-c7-b8(grab)अभी भी एक समाधान है।


आपको एक बड़ा और अधिक जटिल उदाहरण जोड़ना चाहिए। इसके अलावा, कालकोठरी के न्यूनतम और अधिकतम आयाम क्या हैं? 1x1 कालकोठरी @एक वैध इनपुट है?
mbomb007


@ mbomb007 मैंने एक नया उदाहरण जोड़ा है। ग्रिड के आकार के अनुसार, मुझे लगता है कि इसे कम से कम 3x3 तक सीमित करना उचित है।
मिखाइल

अगर मैं आपके उदाहरणों को संपादित करूं तो mbomb007 मन? वे, एक बार समझने के बाद, तर्क को बहुत अच्छे से दिखाते हैं।
मिखाइल

स्वतंत्र महसूस करना। यही मैंने उनके लिए बनाया है। यह भी ध्यान दिया जा सकता है कि परीक्षण मामले को घुमाने से इसके परिणाम पर कोई प्रभाव नहीं पड़ना चाहिए।
mbomb007

जवाबों:


5

पिछले समाधान (उनमें से भाग) पाद कंटेनर में टियो लिंक में पाए जा सकते हैं (वे शायद अधिक पठनीय हैं)

जावास्क्रिप्ट (Node.js) , 883 436 411 360,345 311 बाइट्स

g=>g.map((r,y)=>[...r].map((c,x)=>A+=c=="$"&&P(g,x,y)),A=0)|A
P=(g,x,y,m={},p={},I=i=9,M={})=>{if(/[.$]/.test(c=(g[y]||0)[x])){for(;i--;)if(/^[^.@$#]$/.test(C=(g[y+~-(i/3)]||0)[x+i%3-1])){if(m[C])return
M[C]=1}for(;I--;)if(!p[(X=x+~-(I/3))+","+(Y=y+I%3-1)]&&P(g,X,Y,M,{...p,[x+","+y]:1}))return 1}return c=="@"}

इसे ऑनलाइन आज़माएं!

स्पष्टीकरण -

खिलाड़ी से नकद में जाने के बजाय मैं मामले से @ के पास गया। मुझे लगता है कि मुझे तेज होना चाहिए क्योंकि मुझे पता है कि कब दिखना बंद करना है (@ तक पहुंचना), और जब आप नकदी की तलाश करते हैं तो आपको हमेशा तब तक चलते रहना चाहिए जब तक आप सभी स्पॉट (और उन्हें प्राप्त करने के तरीके) को कवर नहीं करते। इसलिए अहंकार इस तरह से बहुत सरल है - मुख्य कार्य g.map((r,y)=>[...r].map((c,x)=>A+=c=="$"&&P(g,x,y)),A=0)|A: नकदी खोजें -> यदि आपको यह मिल गया है -> खिलाड़ी की तलाश शुरू करें -> यदि आप उसे ढूंढते हैं -> वेतन वृद्धि अब पथ खोजक उर्फ ​​पी को मिल गया है if(/[.$]/.test(c=(g[y]||[])[x]))तो बस देखें वर्तमान सेल "विशेष" है -> यदि ऐसा है तो हम यदि इसके खिलाड़ी चाहते हैं तो वापस आ सकते हैं। विशेष मामले: @ # (राक्षस)

for(;i--;) if(/^[a-zA-Z*&]$/.test(C=(g[y+~-(i/3)]||0)[x+i%3-1])) -> if my neighbor is a monster {if(m[C])return false -> and it already was in the previous turn - this path is not value M[C]=1} -> if not just add it to the neighbors monsters for(;I--;) if(!p[(X=x+~-(I / 3))+","+(Y=y+I%3-1)]&&P(g,X,Y,M,{...p,[x+","+y]:1}))return true फिर से पड़ोसियों को सूचित करें - अगर मैं पहले से ही वहां नहीं था (p पथ लिया गया है) पथ जारी रखें (P को कॉल करें)


अच्छा गोल्फ! कुछ बातें जिन पर मैंने गौर किया: (1) आपके कोड में 2 और 7 वीं लाइनों पर शानदार ट्रेलिंग व्हाट्सएप है, और अधिकांश लाइन ब्रेक अनावश्यक हैं (केवल लाइनों 1 और 6 को ब्रेक की आवश्यकता है), और I / 3इसमें अनावश्यक स्थान है। उस व्हाट्सएप को हटा दें और आपका स्कोर वास्तव में है 324! (2) return true हो सकता है return 1(एक truthy मूल्य) और return falseबस किया जा सकता है return(निहित undefined, एक falsey मूल्य)। (३) ^[^.@$#]$बिना किसी गैर-राक्षस के जाँच करने के लिए रेगेक्स ^[a-zA-Z*&]$, राक्षसों की जाँच करने के लिए कम है । अच्छा काम!
अप्सिलर्स

हाँ, मैं जानता हूँ कि मैं इसे बहुत छोटा बना सकता हूँ :)
डैनियलइंडी

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