गोल्फ पैटरसन के कीड़े


11

पैटरसन के कीड़े एक प्रकार के सेलुलर ऑटोमोबोन हैं जो एक अनंत त्रिकोणीय ग्रिड पर मौजूद हैं और, हर कदम, वे किसी दिशा में मुड़ते हैं और एक इकाई को स्थानांतरित करते हैं। उनके परिभाषित गुण यह हैं कि वे कभी भी एक ही स्थान पर दो बार नहीं जा सकते हैं, और जब भी वे एक ही परिवेश का सामना करते हैं, तो वे एक ही निर्णय लेते हैं। एक कीड़ा हमेशा 3 से स्थित अपनी पूंछ के साथ अपने दृष्टिकोण से "देखता है" और इस षट्भुज के केंद्र में स्थित उसका सिर:

विकिपीडिया से छवि

उदाहरण के लिए, नियमों के साथ कृमि पर विचार करें:

  1. यदि 0, 1, 2, 4, और 5 सभी खाली हैं, तो दिशा 2 में चलें
  2. यदि 0, 1, 4 और 5 खाली हैं, और 2 भरा हुआ है, तो दिशा 0 में चलें
  3. यदि 0, 1, और 5 रिक्त हैं, और 2 और 4 भरे हुए हैं, तो दिशा 0 में चलें

इसके परिणामस्वरूप निम्न पथ (विकिपीडिया से) है:

कृमि पथ

यदि कीड़ा खुद को ऐसी स्थिति में पाता है जहां सभी परिवेश भरे होते हैं, तो यह समाप्त हो जाता है।

इनपुट

संख्याओं की एक सूची। Nth संख्या इंगित करती है कि कृमि को nth की नई स्थिति पर क्या निर्णय लेना चाहिए, जिससे उसका सामना होता है जहां उसे निर्णय लेना होता है। ध्यान दें कि यदि सभी लेकिन इसका एक परिवेश भरा हुआ है, तो इसे केवल उसी दिशा में बढ़ना चाहिए जो खाली है। यह "निर्णय" के रूप में नहीं गिना जाता है और एक संख्या का उपभोग नहीं करता है। ऊपर दिखाए गए उदाहरण कृमि को उत्पन्न करने के लिए, इनपुट होगा [2, 0, 0]। इनपुट को एक कीड़ा पैदा करने की गारंटी दी जाती है, जो समाप्त हो जाता है और उसका पथ नहीं देता है, और इनपुट कभी कम नहीं होगा।

उत्पादन

निर्देशांक की एक सूची का उत्पादन जहां यह दर्शाता है कि कृमि का सिर कहां से शुरू होता है (1, 0)। हम केवल y- मूल्य में कमी करने के लिए ऊपर और दाईं ओर बढ़ने पर विचार करेंगे, लेकिन x- मूल्य में कमी और y- मूल्य में कमी होने के लिए ऊपर और बाईं ओर बढ़ना। उदाहरण के लिए, उदाहरण इनपुट के लिए पथ का आउटपुट है

(1, 0), (1, 1), (0, 0), (-1, -1), (0, -1), (0, 0), (0, 1), (-1, 0), (0, 0)

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

आप परीक्षण चलाने के लिए जावास्क्रिप्ट स्निपेट का भी उपयोग कर सकते हैं।

[2,0,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(0,1),(-1,0),(0,0)
[1,0,4,0,1,5]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,1),(4,2),(4,3),(3,3),(2,2),(1,1),(1,0),(2,0),(3,1),(3,0),(4,0),(5,1),(5,2),(4,2),(3,2),(2,1),(1,1),(0,0),(-1,0),(-2,-1),(-2,-2),(-1,-2),(0,-1),(1,0),(1,-1),(2,-1),(3,0),(4,1),(4,2),(5,3),(5,4),(4,4),(3,3),(3,4),(2,4),(1,3),(1,2),(1,1),(0,1),(-1,0),(-1,1),(-2,1),(-3,0),(-3,-1),(-2,-1),(-1,-1),(0,0)
[1,0,5,1]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,2),(3,3),(2,3),(1,2),(0,2),(-1,1),(-1,0),(0,0),(1,1),(1,2),(1,3),(0,3),(-1,2),(-1,1),(-2,0),(-2,-1),(-1,-1),(0,0)
[2,0,1,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(-1,0),(-1,-1),(-1,-2),(0,-1),(1,0),(2,1),(1,1),(0,1),(0,0)

निम्नलिखित जल्दबाजी में इकट्ठे (संभवतः छोटी गाड़ी) कार्यक्रम में कीड़े दिखाई देंगे:



क्या हम इनपुट को रिवर्स ऑर्डर में ले सकते हैं?
अरनुलद

1
@Arnauld यकीन है कि ठीक लगता है
soktinpk

जवाबों:


4

जावास्क्रिप्ट (ईएस 6),  261 250  249 बाइट्स

[एक्स,y]

a=>(G=[[[x=1]]],v=[0,1,1,0,-1,-1],F=y=>[[x,y],...v.every((_,i)=>k^=g(o+i)[q%3]<<i,k=63,g=o=>(r=G[Y=y-o%2*v[q=(o+3)%6]]=G[Y]||[])[X=x-o%2*v[-~q%6]]=r[X]||[])?F(y+v[g(o+=F[k]|=1/F[k]?0:k&~-k?a.pop():31-Math.clz32(k))[q%3]=1,o%6],x+=v[-~o%6]):[]])(o=0)

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

यह अनिवार्य रूप से डेमो स्निपेट का एक बंदरगाह है।


4

के (ngn / k) , 115 बाइट्स

D,:-D:2\6 3;f:{d::0;m::2/=6;X::(!6),x;{m::?m,p:2/^(+':x)?(2*h:*|x)+/:D 6!d+!6;$[(~p)|^c:X m?p;x;x,,h+D 6!d+:c]}/,1 0}

(नामकरण भाग की गिनती नहीं, f:)

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

D,:-D:2\6 3 छह कार्डिनल दिशाओं को उत्पन्न करता है (1 0;1 1;0 1;-1 0;-1 -1;0 -1)

d::0 वर्तमान दिशा है, जिसका उपयोग इंडेक्स मॉड 6 इन के रूप में किया जाता है D

m::2/=6प्रारंभिक कृमि स्मृति उत्पन्न करता है 32 16 8 4 2 1। प्रत्येक संख्या की बिट्स परिवेश को घेरती हैं (0 = विज़िट किए गए सेगमेंट; 1 = अप्रकाशित)। शुरू mमें केवल अस्पष्ट परिवेश होता है - वे जिनमें एक एकल निकास उपलब्ध है।

X::(!6),xकृमि के नियम हैं। हम अंदर के आंतरिक 0 1 2 3 4 5परिवेश से मेल खाने का इरादा रखते हैं m

{... }/,1 0अभिसरण तक लागू करें जिसमें फ़ंक्शन { }1-तत्व सूची के साथ शुरू हो रहा है 1 0। सूची में कृमि द्वारा देखे गए निर्देशांक के जोड़े होंगे।

D 6!d+!6छह कार्डिनल दिशाओं से शुरू होकर dदक्षिणावर्त घूमते हैं

h:*|x तर्क के अंतिम, कृमि के सिर की स्थिति

(2*h:*|x)+/:D 6!d+!6सिर के निर्देशांक को 2 से गुणा करें और कार्डिनल दिशाओं को जोड़ें। यह अंकों के बीच के खंडों का प्रतिनिधित्व करने का हमारा तरीका है।

+':x आसन्न विज़िट किए गए बिंदुओं के जोड़े जोड़ें - यह हमें उनके बीच के सेगमेंट का प्रतिनिधित्व देता है

^(... )?... पता करें कि सिर के आसपास के क्षेत्रों में से कौन सा अभी तक दौरा नहीं किया गया है

p:2/ बाइनरी एनकोड और असाइन करें p

m::?m,pअप करने के लिए mऔर अलग रखने के लिए, यानी pमें mही pनहीं होता है तो अपील करते हैंm

$[... ;... ;... ]अगर-तब-तब

c:X m?pके सूचकांक को खोजने pमें mऔर में एक सूचकांक के रूप में उपयोग X। आउट-ऑफ-बाउंड्स अनुक्रमण परिणाम 0N("नल") में

$[(~p)|^c:X m?p;x;... ]यदि p0 है (कोई निकास पथ नहीं है) या cहै 0N, तो लौटें xजो अभिसरण को मजबूर करेगा और लूप को रोक देगा

x,,h+D 6!d+:cनए सिर को xदोहराएं और दोहराएं

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