Chúng tôi đang vượt khỏi tầm kiểm soát, Bác sĩ!


11

Bác sĩ, khi cố gắng trốn thoát khỏi lực lượng Dalek đã quyết định gửi chúng trong một vòng quay bằng cách du hành trong nhiều không gian khác nhau trong một chuyển động xoắn ốc.

Tùy thuộc vào tính chất của thời gian không gian có sẵn, Bác sĩ cần nhập vào TARDIS kiểm soát chiều cao và chiều rộng của phần không gian và điểm vào của anh ta để bắt đầu xoắn ốc.

Phần không gian có thể được hình dung dưới dạng lưới h x w chứa đầy các số nguyên tuần tự từ trái sang phải, từ trên xuống dưới, bắt đầu bằng 1.

Các vị trí bắt đầu được cung cấp như rc cho hàng và cột ... Từ đó phần mềm của TARDIS cần phải nhổ ra danh sách có thứ tự các số nguyên thu được bằng cách theo hình xoắn ốc bên ngoài theo hướng chống chiều kim đồng hồ từ hàng r cột c , bắt đầu lên ...

Nhiệm vụ của bạn, với tư cách là bạn đồng hành của Bác sĩ là lập trình TARDIS lấy bốn số, theo định dạng height width row columnvà xác định khu vực không gian mà TARDIS cần di chuyển để phù hợp với chuyển động xoắn ốc được mô tả dưới đây ...

Đầu vào 1

5 5 3 3

(Lưới 5 x 5, bắt đầu từ vị trí 3,3)

Đầu ra 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

Giải thích đầu ra

Lưới gốc nhập mô tả hình ảnh ở đây

Tạo xoắn ốc nhập mô tả hình ảnh ở đây

Đầu vào 2

2 4 1 2

(2 x 4 lưới bắt đầu từ vị trí 1,2)

Đầu ra 2

2 1 5 6 7 3 8 4

Giải thích đầu ra

Hơi khác một chút khi xoắn ốc bây giờ phải xoay quanh lưới để tạo đầu ra tương ứng ...

Lưới gốc nhập mô tả hình ảnh ở đây

Tạo xoắn ốc nhập mô tả hình ảnh ở đây

Quy tắc:

  1. Đây là môn đánh gôn, vì vậy độ dài mã ngắn nhất sẽ đạt được sự chấp thuận.

  2. Các ví dụ trên phải được sử dụng để kiểm tra mã của bạn. Nếu nó không cung cấp đầu ra tương ứng, có gì đó không ổn ...

  3. Cả hai phiên bản mã được đánh gôn và trong golf phải được cung cấp trong câu trả lời của bạn ...

Chúc may mắn!


Tôi có thể chỉ cho bạn vẽ.io nơi người ta có thể nhanh chóng tạo ra các bản vẽ khá hợp lý (bạn đã có mức độ dễ đọc tuyệt vời với phiên bản vẽ tay của mình ... chỉ là tôi không thấy bất kỳ vòng tròn màu đỏ nào). Hãy xem i.stack.imgur.com/xbLSA.png như một ví dụ về những gì có thể được thực hiện. Lưu ý rằng có xml được nhúng trong đó, vì vậy nếu bạn truy cập draw.io, bạn có thể nhập từ url.

Tôi sẽ ghi nhớ điều đó cho nhu cầu tiếp theo của tôi về một bản vẽ, @MichaelT, cảm ơn bạn ...
WallyWest

1
Tôi gửi một câu trả lời với một hàm trả về mảng như đầu ra. Có chấp nhận được không?
edc65

@ edc65 Mate, bạn và tôi quay trở lại đây trên CG, tôi sẽ cho phép một chức năng của S (h, w, r, c) hoặc tương tự cho điều này ... :)
WallyWest

Câu trả lời:


3

JavaScript (ES6) 124 163 177

Chỉnh sửa hoàn toàn khác nhau, không cần một mảng để lưu trữ các ô đã truy cập. Sử dụng thực tế là cạnh của xoắn ốc tăng 1 sau mỗi 2 lượt.

// 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>


Chơi golf tuyệt vời! Từ 300 đến 163 ... Tôi
ngả mũ chào

1
@WallyWest với nhận xét đó bạn thúc đẩy tôi làm tốt hơn. Thnx
edc65

Đẹp! Giải pháp Python của tôi dài hơn rất nhiều nhưng tôi cũng như vậy, mọi thứ đều ổn, bạn sử dụng một phương pháp tốt hơn. Bây giờ bạn sử dụng tương tự và nó thậm chí còn ngắn hơn ... Tôi có một số việc phải làm. :)
Randomra 17/05/2015

@randomra Tôi vẫn muốn thấy nó ...
WallyWest

2

Trăn 3, 191

Có lẽ không phải là một điểm số tuyệt vời, nhưng ở đây nó đi:

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 

Chúng tôi di chuyển dọc theo vòng xoắn ốc bằng cách tăng chiều dài bên sau mỗi lượt quay. Nếu vị trí của chúng ta nằm trong lưới đã cho, chúng ta sẽ in số tương ứng.

Các biến là:

  • p là vị trí phức tạp
  • x và y là tọa độ vị trí
  • r là hướng
  • s là vị trí ở phía hiện tại
  • l là chiều dài bên hiện tại
  • h là tính chẵn lẻ của thứ tự hiện tại
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.