「カタツムリ」番号シーケンスの検索


8

整数NとM、1 <= N,M <= 10^6インデックスiとが与えられますj。あなたの仕事は位置で整数を見つけること[i][j]です。シーケンスは次のようになります(N=M=5, i=1, j=3結果は23):

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

最短のコードが勝ちます。幸運を!




1
Mが幅と高さのどちらであるかを明確にしたい場合があります。
— マーティンエンダー2014年

@MartinBüttner:Nはiに、Mはjに対応すると思います。次に、カタツムリが始まりi=j=0、j=0方向に続くことを指定するだけです。
— M.Herzkamp 2014年

6
コードは、指定された制限に対して妥当な量のメモリを使用して、妥当な時間内に完了する必要がありますか?スパイラルを生成して値を検索するだけで、これらのパラメーターの有効なコードを間違いなく書くことができますが、実際には4 TBのメモリがありません。
— マーティンエンダー2014年

回答:


6

Mathematica、63 55バイト

f=If[#5<1,#+#4,f[#+#2,#3-1,#2,#5-1,#2-1-#4]]&;g=1~f~##&

これは次のgように呼び出すことができる関数を定義します

g[5, 5, 1, 3]

私は再帰的なアプローチを使用しています。スパイラルをどれだけ下に向かって結果が見つかるかに応じて、最大2(N + M)回の反復を使用します。g[10^6,10^6,5^5-1,5^5]数秒以内にすべての入力(最大反復を必要とするまで)を処理しますが、入力が大きい場合は、次のようにデフォルトの反復制限を増やす必要があります。

$IterationLimit = 10000000;

あれば基本的には、kスパイラルの開始番号であれば、私がチェックしてるjインデックスがある0私は返すことができ、その場合にはk + i。それ以外の場合は、一番上の行を捨て、らせんを90度(反時計回り)回転させ、kそれに応じて増分し、代わりに残りのらせんを調べます。次のパラメーターのマッピングで次のスパイラルに移動できます。

  • k n + 1 = k n + m n
  • M n + 1 = N n -1
  • N n + 1 = M n
  • i n + 1 = j n -1
  • j n + 1 = n m -i n -1

これは、Mが幅、Nが高さであることを前提としています。


51バイト:If[#5<1,#+#4,#0[#+#2,#3-1,#2,#5-1,#2-1-#4]]&[1,##]&
— LegionMammal978 2016

3

Pyth、25バイト

D(GHYZ)R?+G(tHGtZt-GY)ZhY

これは関数を定義します(。使用例:

D(GHYZ)R?+G(tHGtZt-GY)ZhY(5 5 1 3

プリント23。

これはアルゴリズム的に、MartinBüttnerによるMathematicaの回答と同じですが、独自に開発されました。私の知る限り、それが唯一の良い方法です。

Pythは私のマシンでは入力範囲全体を処理できないことに注意してください。スタックがオーバーフローし、大きな入力でsegfaultが発生して死亡します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.