シェルピンスキーの三角形を 描くことは死ぬまで行われ た。ただし、他にも面白いことがあります。三角形をよく見ると、逆さまの三角形をフラクタルグラフのノードとして見ることができます。そのグラフの周りの方法を見つけましょう!
まず、各ノードに番号を割り当てましょう。最大の上下逆三角形はノード0になり、レイヤーごとに(幅が最初に)下降し、連続した番号を左上から右の順に割り当てます。
小さい数字が少しぼやけていない大きなバージョンをクリックします。
ナンバリングを定義する別の方法は、センタノードがインデックスを有することである(もちろん、このパターンは、青色三角形内部無限に継続)0
、およびノードの子i
(次のより小さなスケールの隣接する三角形)がインデックスを有する3i+1
、3i+2
および3i+3
。
このグラフをどのように移動しますか?任意の三角形から実行できる最大6つの自然なステップがあります。
- 常に、エッジの1つの中点を通って、現在のノードの3つの子の1つに移動できます。これらの動きを
N
、SW
およびとして指定しますSE
。例えば、我々はノード上で現在している場合2
、これらのノードにつながる7
、8
、9
それぞれ。エッジを介した(間接的な子孫への)他の移動は許可されません。 - また、三角形のエッジに触れない限り、3つの角のいずれかを介して、直接の親または2つの間接的な祖先のいずれかに移動できます。これらの動きを
S
、NE
およびとして指定しますNW
。例えば、我々はノード上で現在している場合31
、S
につながる10
、NE
無効になりますとNW
につながります0
。
挑戦
2つの負でない整数x
とが与えられた場合、上記の6つの動きのみを使用y
しx
てy
、からまでの最短経路を見つけます。最短経路が複数ある場合は、いずれかを出力します。
コードは、上の図に示されている5つのレベル以外にも機能するはずです。あなたはそれを仮定するかもしれませんx, y < 1743392200
。これにより、32ビット符号付き整数内に収まることが保証されます。これは、ツリーの20レベルに対応することに注意してください。
コードは有効な入力を5秒未満で処理する必要があります。これはブルートフォース幅優先検索を除外しますが、かなり緩やかな制約である必要があります。私の参照実装は、深さ1000の任意の入力を0.5秒で処理します(ノードの場合は480桁の数値です)。
プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。
出力は、フラット、文字列の明確なリストでなければならないN
、S
、NE
、NW
、SE
、SW
、任意の合理的なセパレータを使用して(スペース、改行、コンマ、","
...)。
標準のコードゴルフ規則が適用されます。
テストケース
最初のいくつかのテストケースは、上の図を使用して手動で作成できます。その他は、回答が十分に効率的であることを保証します。それらについては、リストされていない同じ長さの他のソリューションがあるかもしれません。
0 40 => N N N N
66 67 => S SW N N N
30 2 => NW NW -or- NE SW
93 2 => NE SW
120 61 => NW NW NW NW N SE SW N
1493682877 0 => S S NW NW
0 368460408 => SW SW N N SW SW SE SW SW N SE N N SW SW N SE SE
1371432130 1242824 => NW NW NE NW N SE SW SW SW SE SE SW N N N N SW
520174 1675046339 => NE NW NE NE SE SE SW SW N SE N SW N SW SE N N N N SE SE SW SW
312602548 940907702 => NE NW S SW N N SW SE SE SE SW SE N N SW SE SE SE SW
1238153746 1371016873 => NE NE NE SE N N SW N N SW N SE SE SW N SW N N SE N SE N
547211529 1386725128 => S S S NE NW N N SE N SW N SE SW SE SW N SE SE N SE SW SW N
1162261466 1743392199 => NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE NE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE SE