ドクター!


11

医師は、ダレック軍から脱出しようとする際に、さまざまな空間のポケットを螺旋運動で移動することにより、彼らをスピンさせて送ることにしました。

利用可能な時空の性質に応じて、医師はTARDISに入る必要があり、空間のセクションの高さと幅、およびスパイラルを開始するための入口点を制御します。

空間のセクションは、左から右、上から下へ、1から始まる連続した整数で満たされたh x wグリッドとして想定できます。

開始位置は、行と列のrcとして提供されます...これから、TARDISのソフトウェアは、行r列cから上に向かって反時計回りに外側にらせん状になった整数の順序付きリストを吐き出す必要があります...

あなたの仕事は、医師の仲間として、TARDISをプログラムして4つの数字をフォーマットで取得しheight width row column、TARDISが移動する必要がある空間のセクターを決定することです。

入力1

5 5 3 3

(5、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

(位置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

@ edc65メイト、あなたと私はCGでここに戻って、これにS(h、w、r、c)などの機能を許可します... :)
— WallyWest

回答:


3

JavaScriptの(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

いいね!私の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 

1ターンごとに辺の長さを増やして、らせんに沿って移動します。位置が指定されたグリッド内にある場合、対応する番号を出力します。

変数は次のとおりです。

  • pは複素位置です
  • xとyは位置座標です
  • rは方向
  • sは現在の側の位置です
  • lは現在の辺の長さ
  • hは現在の側の序数のパリティです
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.