우린 통제 불능 상태에 빠졌어, 박사!


11

닥터는 달렉 부대에서 탈출하기 위해 나선형의 움직임으로 다양한 공간의 주머니를 여행하여 스핀으로 보내기로 결정했습니다.

이용 가능한 시공간의 특성에 따라, 닥터는 공간의 높이와 너비 및 나선을 시작하는 그의 진입 점을 TARDIS에 입력해야합니다.

공간 섹션은 1부터 시작하여 왼쪽에서 오른쪽으로, 위에서 아래로 순차적 인 정수로 채워진 h x w 그리드 로 구상 될 수 있습니다 .

시작 위치는 행과 열에 대해 rc 로 제공됩니다 ... 이로부터 TARDIS의 소프트웨어는 rc 에서 시계 반대 방향으로 바깥쪽으로 나선으로 얻은 정수 목록을 위쪽으로 시작하여 추출해야 합니다 ...

의사의 동반자는 TARDIS를 프로그래밍하여 형식으로 4 개의 숫자를 가져 와서 height width row column아래 설명 된 나선형 움직임에 맞게 TARDIS가 이동해야하는 공간을 결정하도록하는 것입니다.

입력 1

5 5 3 3

(3,3 위치에서 시작하는 5 x 5 그리드)

출력 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

(1,2 위치에서 시작하는 2 x 4 그리드)

출력 2

2 1 5 6 7 3 8 4

출력 설명

나선형이 그리드 주위를 돌면서 각각의 출력을 생성해야하므로 약간 다릅니다.

원본 그리드 여기에 이미지 설명을 입력하십시오

생성 된 나선 여기에 이미지 설명을 입력하십시오

규칙 :

  1. 이것은 코드 골프이므로 코드 길이가 가장 짧아 승인 표시가 나타납니다.

  2. 위의 예제를 사용하여 코드를 테스트해야합니다. 해당 출력을 제공하지 않으면 문제가있는 것입니다.

  3. 골프 및 골프화 된 코드 버전 모두 귀하의 답변에 제공되어야합니다 ...

행운을 빕니다!


좀 더 합리적인 그림을 빨리 만들 수있는 draw.io소개해 드리겠습니다 (손으로 그린 ​​버전으로 가독성이 뛰어납니다 ... 빨간색 원이 보이지 않습니다). 수행 할 수있는 작업의 예로 i.stack.imgur.com/xbLSA.png 를 고려하십시오 . xml이 포함되어 있으므로 draw.io로 이동하면 url에서 가져올 수 있습니다.

@MichaelT, 다음 드로잉에 대한 다음 필요를 염두에 두겠습니다.
WallyWest

1
배열을 출력으로 반환하는 함수로 답변을 게시합니다. 괜찮습니까?
edc65 10

@ edc65 Mate, 당신과 저는 CG로 돌아가서, 이것에 대해 S (h, w, r, c) 등의 기능을 허용합니다 ... :)
WallyWest

답변:


3

자바 스크립트 (ES6) 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까지 ... 나는 당신에게 모자를 벗습니다 ...
WallyWest

1
@WallyWest는 그 의견으로 나를 더 잘하게 만듭니다. Thnx
edc65

좋은! 내 파이썬 솔루션은 훨씬 길었지만 좋아졌습니다. 더 나은 방법을 사용하십시오. 이제 당신은 같은 것을 사용하고 그것은 더 짧습니다 ... 나는 할 일이 있습니다. :)
randomra

@randomra 나는 아직도 그것을보고 싶어요 ...
WallyWest

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는 위치 좌표입니다
  • r은 방향이다
  • s는 현재 측의 위치입니다
  • l는 현재 길이입니다
  • h는 현재 측 서수의 패리티입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.