हम नियंत्रण से बाहर सर्पिल कर रहे हैं, डॉक्टर!


11

डॉक्टर, डेलक बलों से बचने की कोशिश में उन्हें एक सर्पिल गति में अंतरिक्ष के विभिन्न जेबों में यात्रा करके एक स्पिन में भेजने का फैसला किया है।

उपलब्ध स्थान-समय की प्रकृति के आधार पर, डॉक्टर को TARDIS में प्रवेश करने की आवश्यकता होती है जो अंतरिक्ष के अनुभाग की ऊंचाई और चौड़ाई और उसके प्रवेश बिंदु को नियंत्रित करता है जिसके साथ सर्पिल शुरू करना है।

अंतरिक्ष के अनुभाग को 1 से शुरू करके बाएं से दाएं, ऊपर से नीचे तक क्रमिक पूर्णांकों से भरे h x w ग्रिड के रूप में कल्पना की जा सकती है ।

प्रारंभिक स्थिति को पंक्ति और स्तंभ के लिए आरसी के रूप में प्रदान किया जाता है ... इससे टैर्डिस के सॉफ़्टवेयर को पंक्ति आर कॉलम सी से एंटी-क्लॉकवाइज़ दिशा में बाहर की ओर निर्देशित करने वाले पूर्णांकों की क्रमबद्ध सूची को थूकना पड़ता है , ऊपर की ओर शुरू होता है ...

आपका काम, डॉक्टर के साथी के रूप में TARDIS को चार नंबर लेने के लिए, प्रारूप में प्रोग्राम करना है height width row columnऔर यह निर्धारित किया है कि TARDIS को किस क्षेत्र में नीचे वर्णित सर्पिल आंदोलन से मिलान करने के लिए यात्रा करने की आवश्यकता है ...

इनपुट 1

5 5 3 3

(5 x 5 ग्रिड, स्थिति 3,3 से शुरू)

आउटपुट 1

13 8 7 12 17 18 19 14 9 4 3 2 1 6 11 16 21 22 23 24 25 20 15 10 5

उत्पादन के बारे में बताते हुए

मूल ग्रिड यहाँ छवि विवरण दर्ज करें

सर्पिल उत्पन्न यहाँ छवि विवरण दर्ज करें

इनपुट 2

2 4 1 2

(2 x 4 ग्रिड स्थिति 1,2 पर शुरू)

आउटपुट 2

2 1 5 6 7 3 8 4

उत्पादन के बारे में बताते हुए

सर्पिल के रूप में थोड़ा अलग अब संबंधित उत्पादन उत्पन्न करने के लिए ग्रिड के चारों ओर चक्र होना चाहिए ...

मूल ग्रिड यहाँ छवि विवरण दर्ज करें

सर्पिल उत्पन्न यहाँ छवि विवरण दर्ज करें

नियम:

  1. यह कोड-गोल्फ है, इसलिए सबसे छोटी कोड लंबाई को स्वीकृति का टिकट मिल जाता है।

  2. आपके कोड का परीक्षण करने के लिए उपरोक्त उदाहरणों का उपयोग किया जाना चाहिए। यदि यह संबंधित आउटपुट प्रदान नहीं करता है, तो कुछ गलत है ...

  3. आपके उत्तर में दोनों गोल्फ और कोड के गोल्फ संस्करण उपलब्ध कराए जाने चाहिए ...

सौभाग्य!


मैं आपको आकर्षित करने के लिए इंगित करता हूं। जहां आप जल्दी से उचित चित्र बना सकते हैं (आपको अपने हाथ से तैयार किए गए संस्करण के साथ उत्कृष्ट विरासत मिल गई है ... बस मुझे कोई लाल घेरा नहीं दिखता है)। I.stack.imgur.com/xbLSA.png पर विचार करें कि क्या किया जा सकता है। ध्यान दें कि इसमें xml एम्बेड किया गया है, इसलिए यदि आप draw.io पर जाते हैं तो आप url से आयात कर सकते हैं।

मैं एक ड्राइंग के लिए मेरी अगली जरूरत को ध्यान में रखूंगा, @MichaelT, धन्यवाद ...
4

1
मैं आउटपुट के रूप में एक फ़ंक्शन रिटर्निंग सरणी के साथ एक उत्तर देता हूं। क्या यह स्वीकार्य है?
edc65

@ edc65 मेट, आप और मैं सीजी पर यहां वापस जाते हैं, मैं इसके लिए एस (एच, डब्ल्यू, आर, सी) या इस तरह का एक फ़ंक्शन की अनुमति दूंगा ... :)
वैलीवेस्ट

जवाबों:


3

जावास्क्रिप्ट (ईएस 6) 124 163 177

पूरी तरह से अलग तरीके से संपादित करें , विज़िट की गई कोशिकाओं को संग्रहीत करने के लिए किसी सरणी की आवश्यकता नहीं है। इस तथ्य का उपयोग करना कि हर 2 मोड़ के बाद 1 के सर्पिल वृद्धि का पक्ष।

// New way
f=(h,w,y,x)=>
  (e=>{
    for(o=[],d=i=t=l=0;l<w*h;i<t?i+=2:[i,d,e]=[1,-e,d,++t])
      o[l]=y*w-w+x,l+=x>0&x<=w&y>0&y<=h,x+=d,y-=e
  })(1)||o


// Golfed
g=(h,w,y,x)=>
  (g=>{
    for(e=n=0;n<h*w;)g[[n%w+1,-~(n/w)]]=++n;
    for(o=[g[[x,y]]],l=d=1;l<n;l+=!!(o[l]=g[[x+=d,y+=e]]))
      g[[x,y]]=0,
      g[[x+e,y-d]]!=0&&([d,e]=[e,-d])
  })([])||o



// Not golfed
u=(h,w,y,x)=>{
  var i,j,dx,dy,kx,ky,o,n,
    g={} // simulate a 2dimensional array using a hashtable with keys in the form 'x,y'

  for(n=i=0; i++<h;) // fill grid (probably better done in a single loop)
    for(j=0; j++<w;)
      g[[j,i]] = ++n;
  o=[g[[x,y]]] // starting point in output
  dx=1, dy=0 // start headed right
  
  for(; !o[w*h-1]; ) // loop until all w*h position are put in output
  {
    g[[x, y]] = 0 // mark current position to avoid reusing
    kx=dy, ky=-dx // try turning left
    if(g[[x+kx, y+ky]] != 0) // check if position marked
    { // found a valid position
      dx=kx, dy=ky // change direction
    }
    x+=dx, y+=dy // move
    k=g[[x, y]] // get current value
    if (k) o.push(k) // put in output list if not 'undefined' (outside grid)
  }
  return o
}

// TEST - In FireFox

out=x=>O.innerHTML+=x+'\n';
[
 [[5,5,3,3],'13 8 7 12 17 18 19 14 9 4 3 2 1 6 11 16 21 22 23 24 25 20 15 10 5'],
 [[2,4,1,2],'2 1 5 6 7 3 8 4']
].forEach(t=>out(t[0] + '\n Result: ' + f(...t[0])+'\n Check:  ' + t[1]))

test=()=>
{
  var r, i=I.value.match(/\d+/g), h=i[0]|0, w=i[1]|0, y=i[2]|0, x=i[3]|0
  if (y>h||x>w) r = 'Invalid input'
  else r = f(h,w,y,x)
  out(i+'\n Reault: ' +r)
}
<pre id=O></pre>
Your test:<input id=I><button onclick="test()">-></button>


अद्भुत गोल्फ! 300 से 163 तक ... मैं अपनी टोपी आपसे दूर करता हूं ...
वैलेस्ट

1
@ उस टिप्पणी के साथ आप मुझे बेहतर करने के लिए धक्का दें। Thnx
edc65

अच्छा! मेरा पायथन समाधान बहुत लंबा था लेकिन मैं पसंद था, यह सब ठीक है, आप एक बेहतर विधि का उपयोग करते हैं। अब आप उसी का उपयोग करते हैं और यह और भी छोटा है ... मुझे कुछ काम करना है। :)
रैंडम

@randomra मैं अब भी इसे देखना पसंद
करूंगा

2

पायथन 3, 191

शायद एक महान स्कोर नहीं है, लेकिन यहाँ यह जाता है:

def f(b,a,d,c):
 p,r,l,s,h=c+1j*d,-1j,1,0,0
 for _ in [0]*((a+b)**2):x,y=p.real,p.imag;0<x<a+1and 0<y<b+1and print(int((y-1)*a+x),end=' ');p+=r;s=(s+1)%l;t=s==0;h=(h+t)%2;l+=h<t;r*=(-1j)**t 

हम हर दूसरे मोड़ के बाद साइड-लेंथ बढ़ाकर सर्पिल के साथ आगे बढ़ते हैं। यदि हमारी स्थिति दी गई ग्रिड के अंदर है तो हम इसकी संख्या को प्रिंट करते हैं।

चर हैं:

  • p जटिल स्थिति है
  • x और y स्थिति निर्देशांक हैं
  • आर दिशा है
  • s वर्तमान पक्ष पर स्थिति है
  • एल वर्तमान पक्ष लंबाई है
  • h वर्तमान पक्ष के क्रम की समता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.