เรากำลังควบคุมไม่ได้หมอ!


11

หมอในความพยายามที่จะหลบหนีจากกองกำลังดาได้ตัดสินใจที่จะส่งพวกเขาในการหมุนโดยการเดินทางในกระเป๋าหลายช่องว่างในการเคลื่อนไหวเกลียว

ขึ้นอยู่กับลักษณะของพื้นที่ว่างเวลาหมอต้องเข้าสู่ควานหาควบคุมความสูงและความกว้างของส่วนของพื้นที่และจุดเข้าของเขาที่จะเริ่มเกลียว

ส่วนของพื้นที่สามารถมองเห็นเป็นกริดh x w ที่เต็มไปด้วยจำนวนเต็มตามลำดับจากซ้ายไปขวาบนลงล่างเริ่มต้นด้วย 1

ตำแหน่งเริ่มต้นให้เป็นRCสำหรับแถวและคอลัมน์ ... จากนี้ซอฟแวร์ควานหาของความต้องการที่จะคายออกรายการสั่งซื้อของจำนวนเต็มได้โดยการลอยออกไปในทิศทางทวนเข็มนาฬิกาจากแถวRคอลัมน์เริ่มต้นขึ้น ...

งานของคุณในฐานะเพื่อนร่วมงานของหมอคือการเขียนโปรแกรมควานหาเพื่อให้ได้ตัวเลขสี่ตัวในรูปแบบheight width row columnและกำหนดให้ภาคส่วนของพื้นที่ที่ควานหาจำเป็นต้องเดินทางเพื่อให้ตรงกับการเคลื่อนไหวหมุนวนที่อธิบายไว้ด้านล่าง ...

อินพุต 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. คำตอบของคุณจะต้องระบุโค้ดทั้งเวอร์ชัน golfed และ in-golfed

โชคดี!


ฉันขอชี้ให้คุณวาดได้ไหมที่หนึ่งสามารถสร้างภาพวาดที่ค่อนข้างสมเหตุสมผลได้อย่างรวดเร็ว (คุณมีรูปแบบที่ชัดเจนด้วยมือที่วาดเอง ... ฉันแค่ไม่เห็นวงกลมสีแดง) พิจารณาi.stack.imgur.com/xbLSA.pngเป็นตัวอย่างของสิ่งที่สามารถทำได้ โปรดทราบว่ามี xml ฝังอยู่ในนั้นดังนั้นหากคุณไปที่ draw.io คุณสามารถนำเข้าจาก url

ฉันจะจำไว้ในใจสำหรับความต้องการวาดภาพต่อไปของฉัน
@MichaelT

1
ฉันโพสต์คำตอบด้วยฟังก์ชั่นที่กลับอาร์เรย์เป็นผลลัพธ์ เป็นที่ยอมรับหรือไม่?
edc65

@ edc65 Mate คุณกับฉันกลับไปที่ CG แล้วฉันจะอนุญาตฟังก์ชั่นของ S (h, w, r, c) หรือสิ่งที่คล้ายกันในเรื่องนี้ ... :)
WallyWest

คำตอบ:


3

JavaScript (ES6) 124 163 177

แก้ไขวิธีที่ต่างกันโดยสิ้นเชิงไม่ต้องใช้อาร์เรย์เพื่อจัดเก็บเซลล์ที่เยี่ยมชม การใช้ความจริงที่ว่าด้านข้างของเกลียวเพิ่มขึ้น 1 หลังจากทุก 2 รอบ

// 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 ... ฉันถอดหมวกของคุณออก ...
WallyWest

1
@WallyWest กับความคิดเห็นที่คุณผลักดันให้ฉันทำดีกว่า ขอบคุณ
edc65

ดี! Python ของฉันใช้งานได้นานขึ้น แต่ฉันชอบมันก็ดีคุณใช้วิธีที่ดีกว่า ตอนนี้คุณใช้สิ่งเดียวกันและมันสั้นกว่านี้ ... ฉันมีงานต้องทำ :)
randomra

@randomra ฉันยังรักที่จะดู ...
WallyWest

2

Python 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 เป็นพิกัดตำแหน่ง
  • r คือทิศทาง
  • s คือตำแหน่งทางด้านปัจจุบัน
  • l คือความยาวด้านปัจจุบัน
  • h คือความเท่าเทียมกันของอันดับปัจจุบันของด้าน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.