दीवारों में चलना बंद करो!


16

कुछ पाठ-आधारित दुष्ट-पसंद आपको दीवारों में नहीं चलने देते हैं, और यदि आप कोशिश करते हैं तो आपको अपना कदम वापस देते हैं। जब आप खिलाड़ी को निकटतम वैध दिशा में ले जा सकते हैं तो ऐसा क्यों करें?

चुनौती

फ़ंक्शन का एक प्रोग्राम लिखें, जिसमें एक दिशा और 3 बाय 3 ग्रिड वर्ण दिए गए हैं, खिलाड़ी द्वारा एक कदम उठाए जाने के बाद उसी ग्रिड को आउटपुट करता है।

उदाहरण के लिए,

9
#..
.@#
#.#

हो जाता है

#.@
..#
#.#

इनपुट

  • दिशा 1 से 9 तक के एकल अंक द्वारा दी जाती है, प्रत्येक 8 कार्डिनल दिशाओं के अनुरूप होती है और स्थिर रहती है। यह कीपैड पर संख्याओं के सापेक्ष स्थानों से लिया गया है:

    एनडब्ल्यू एन एनई
    .. \ _ | /
    ... ... 8 ९
    डब्ल्यू- ४ ५ ६ -ई
    ... १ २ ३
    ../ | \
    एसडब्ल्यू एस एसई
    
    हालाँकि, आप संख्या का उपयोग 123, 456, 789 के बजाय 789, 456, 123 से कर सकते हैं। दूसरे शब्दों में, यदि आप ऐसा चुनते हैं तो आप ऊपर और नीचे की 2 पंक्तियों या संख्याओं को स्वैप कर सकते हैं। ये केवल 2 स्वीकार्य सूचकांक संयोजन हैं।

  • 3 बाय 3 ग्रिड में 3 अलग-अलग, प्रिंट करने योग्य एएससीआईआई अक्षर शामिल होंगे जो वॉक करने योग्य फर्श, दीवारों और खिलाड़ी का प्रतिनिधित्व करते हैं। (परीक्षण मामलों में, .फर्श के लिए उपयोग किया जाता है, #एस दीवारें हैं, और @खिलाड़ी है)

  • आप यह चुन सकते हैं कि आपके प्रोग्राम में कौन से पात्र हैं, लेकिन आपको उन्हें अपने उत्तर में बताना होगा और उन्हें कई परीक्षणों के अनुरूप होना चाहिए।
  • चरित्र का प्रतिनिधित्व करने वाला चरित्र हमेशा 3 से 3 ग्रिड के बीच में होगा, और दिशा हमेशा 1 और 9 (incl) के बीच होगी।
  • आप किसी भी क्रम में इनपुट ले सकते हैं
  • 3 बाय 3 ग्रिड एक चार सरणी, एक स्ट्रिंग सरणी, एक 9 लंबाई स्ट्रिंग, या एक अन्य उचित विकल्प के रूप में इनपुट हो सकता है।

उत्पादन

  • किसी फ़ंक्शन, या आउटपुट से StdOut या निकटतम वैकल्पिक पर लौटें
  • अनुगामी रिक्त स्थान और newlines की अनुमति है
  • आपको इनपुट के समान वर्ण अभ्यावेदन का उपयोग करना चाहिए
  • आउटपुट के लिए इनपुट के लिए अनुमत समान प्रारूप की अनुमति है

खिलाड़ी कैसे चलता है

यदि निर्दिष्ट दिशा एक दीवार से अवरुद्ध है (जैसे यदि उपरोक्त उदाहरण में दिशा 6 थी), तो 2 निकटतम दिशाओं को देखें:

  • यदि एक (और केवल एक) दिशा मुक्त है, तो खिलाड़ी को उस दिशा में ले जाएं।
  • यदि कोई निर्देश मुक्त नहीं हैं, तो अगले निकटतम 2 दिशाओं (दिशा 5 को छोड़कर) को देखें। यदि आपने चारों ओर से लपेट लिया है और कोई खुली दिशा नहीं देखी है (खिलाड़ी दीवारों से घिरा हुआ है), तो खिलाड़ी को स्थानांतरित न करें
  • यदि दोनों दिशाएं खुली हैं, तो यादृच्छिक पर स्थानांतरित करने के लिए एक को चुनें (हालांकि जरूरी नहीं कि समान रूप से)।

यदि दी गई दिशा 5 है, तो खिलाड़ी को स्थानांतरित न करें

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

( #= दीवार, .= तल, @= खिलाड़ी)

इनपुट:

9
# ..
। @ #
#। #

आउटपुट:

#। @
.. #
#। #


इनपुट:

3
# ..
। @ #
#। #

आउटपुट:

# ..
.. #
# @ #


इनपुट:

7
##।
# @ #
.. #

आउटपुट:

## @ ##।
#। # या #।
.. # @। #


इनपुट:

5
...
। @।
...

आउटपुट:

...
। @।
...


इनपुट:

2
###
# @ #
###

आउटपुट:

###
# @ #
###

स्कोरिंग

यह , इसलिए बाइट्स जीत में सबसे छोटा जवाब है।


उपयोग नहीं कर रहे हैं yuhjklbn? आरआईपी।
R

इसके अलावा, मैं वास्तव में "एक वैकल्पिक दिशा चुनें" भाग को ज्यादा पसंद नहीं करता। यह चुनौती के दूसरे हिस्से से अलग है, जो "एक निर्दिष्ट दिशा और आउटपुट में खिलाड़ी को स्थानांतरित करता है" है। हालांकि यह सिर्फ व्यक्तिगत पसंद है।
R

1
यह हिस्सा भ्रामक है: "यदि कोई निर्देश मुक्त नहीं है, तो अगले निकटतम 2 दिशाओं को देखें।"
लीक नून

1
क्या हम प्रत्येक तत्व के लिए ASCII वर्ण के बजाय एक संख्या निर्दिष्ट कर सकते हैं, फिर इनपुट को 2-आयामी सूची के रूप में ले सकते हैं? या उन्हें तार होना है?
स्कॉट मिलनर

2
क्या मैं 123;456;789इसके बजाय निर्देशों का उपयोग कर सकता हूं 789;456;123?
लीक नून

जवाबों:


2

पायथ - 73 70 बाइट्स

Kmsd"78963214"DPGJXXYt@K+xKQG\@4\.R?q/J\#/Y\#Jk=YwV5=GflTmPd(N_N)IGOGB

कोशिश करो

इनपुट में दो लाइनें हैं:

पहली पंक्ति: चाल की दिशा

दूसरी पंक्ति: बोर्ड (123456789 स्थान, 123 शीर्ष पंक्ति के साथ)


3

जावास्क्रिप्ट (ईएस 6), 192 163 बाइट्स

a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

टिप्पणियाँ

यह फ़ंक्शन एक विशेष इनपुट प्रारूप का उपयोग करता है। पहले इनपुट (पूर्णांकों की एक सरणी है 0के लिए floor, 1के लिए wallऔर 2के लिए player) मानचित्र का प्रतिनिधित्व। दूसरा इनपुट है (फ़्लिप किया गया) दिशा: 1उत्तर-पश्चिम है, 2उत्तर है, 3उत्तर-पूर्व है, 4पश्चिम है आदि। इनपुट को क्युरिंग सिंटैक्स ( Z(a)(b)) के माध्यम से दिया जाना चाहिए ।

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

मेरे इनपुट प्रारूप के अनुरूप नक्शे और दिशाओं को संशोधित किया गया है।

Z=
a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

testcases = [
    [[1,0,0,0,2,1,1,0,1], 3],
    [[1,0,0,0,2,1,1,0,1], 9],
    [[1,1,0,1,2,1,0,0,1], 1],
    [[0,0,0,0,2,0,0,0,0], 5],
    [[1,1,1,1,2,1,1,1,1], 2]
]
for (test of testcases) {
    console.log(Z(test[0])(test[1]))
}


1

पायथन 3, 120 104 153 176 175 बाइट्स

def f(n,l):
 n-=1
 if n!=4and'.'in l:l[sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)[1][0]],l[4]='@.'
 return l

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

इस पद्धति को '।', '#' और '@' की दिशा और सूची मिलती है। इंडेक्स 1 से 9 के साथ शुरू होते हैं (वास्तव में सूची में 0 से 8 के साथ)। तो इसका रूप है

123 
456
789 

विधि नए पदों के साथ नई सूची लौटाती है।

यह रेखा

sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)

इस प्रकार की सूची देता है:

>>>n=7
>>> l=['#','#','#','.','@','#','.','#','.']
>>> sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)
[(4, '@'), (8, '.'), (6, '.'), (3, '.'), (7, '#'), (5, '#'), (1, '#'), (0, '#'), (2, '#')]

हम दूरियों की गणना मुक्त बिंदुओं और यादृच्छिकता को जोड़ते हैं। क्योंकि ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')हम कह सकते हैं कि निकटतम '।' n = 7 (सूची में अनुक्रमणिका) के लिए 8 का सूचकांक है।

यहाँ छवि विवरण दर्ज करें

उदाहरण:

>>> f(9, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '.', '.', '#', '#', '@', '#']
>>> f(3, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '@', '.', '.', '#', '#', '.', '#']
>>> f(5, ['.','.','#','.','@','.','#','.','#'])
['.', '.', '#', '.', '@', '.', '#', '.', '#']
>>> f(7, ['#','#','#','#','@','#','#','#','#'])
['#', '#', '#', '#', '@', '#', '#', '#', '#']
>>> f(7, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '@', '.', '#', '#', '.', '#'] or ['#', '.', '.', '.', '.', '#', '#', '@', '#']

1) यह उन परीक्षण मामलों के लिए काम नहीं करता है जहां खिलाड़ी जिस दिशा में बढ़ना चाहता है वह व्याप्त है और सही स्थिति पहली नहीं है ','(जो कि परीक्षण मामलों 2, 3 और 5 के लिए मामला है)। 2) आपका I / O प्रारूप प्रश्न में समान नहीं लगता है। कृपया अपने I / O प्रारूप का उल्लेख करें।
ल्यूक

आपका उदाहरण f(9, ...काम नहीं करता है - यह चरित्र को 2 पर रखता है लेकिन 9 के निकटतम स्थान 6 और 8 हैं, इसलिए उनमें से एक को यादृच्छिक पर चुना जाना चाहिए (आपके कोड में कोई यादृच्छिकता नहीं है)। इसके अलावा इसे तब परिधि के आसपास जाना चाहिए, जिससे f(9,list("####@#.##"))यह निकटतम हो, इसलिए चरित्र को एकमात्र संभावित स्थान (7 यहां) में रखना चाहिए।
जोनाथन एलन

गलतियों को इंगित करने के लिए धन्यवाद, मेरे लिए, समाचार यह है कि कोड l [4], l [l.index ('' ')] =' '@ @ @ और l [l.index ('। ')], l [4 ] = '@।' अलग
Кирилл Малышев 14

@JonathanAllan, पहले तो मैं नियमों को काफी नहीं समझता था। मुझे उम्मीद है कि मैं कोड को सही ढंग से सही कर सकता हूं।
Кирилл Малышев

फिर भी सही नहीं, नहीं। 1. उदाहरण f(9, ...को वापस लौटना चाहिए list("#....##@#")(क्योंकि 8 स्वतंत्र है और 9 के बगल में है)। 2. कुछ ऐसा f(9,list("####@.#.#"))होना चाहिए जिसमें निर्दिष्ट के रूप में वापसी list("####..#@#")(हमेशा नहीं list("####.@#.#")) का कुछ मौका हो "यदि दोनों दिशाएं खुली हैं, तो यादृच्छिक पर जाने के लिए एक को चुनें"।
जोनाथन एलन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.