私は最近、グラフ理論、特にハイパーキューブについて読み、それらのパスを構築する興味深い方法について考えました。これが私が思いついたものです。
あなたが知っているかもしれませんが、あなたは、以下からなるすべてのnタプルを取ることによってn次元ハイパーキューブを構築することができます1
し、0
彼らは一桁が異なる場合に限っ、それらを頂点とし、接続します。これらの2進数を整数として解釈すると、頂点が適切に番号付けされたグラフになります。たとえばn=3
:
このハイパーキューブを散歩して、頂点から始めたいとしましょう0
。次に、どの頂点を次に訪問するかをどのように決定しますか?私が思いついたルールa
は、あなたがいる頂点の番号を取り、そのmod(a,n)
ビットを反転させ(ゼロベースのインデックス付け)、結果の頂点に移動することです。正式には、このルールは次のように再帰的に定義できます。
a[m+1] = xor(a[m], 2^mod(a[m],n)).
このルールに従うことで、常にキューブにとどまり、エッジに沿って移動します。結果のパスは次のようになります
ご覧のとおり、円を描くように歩きます!実際、すべての次元で、すべての開始点で、パスはループになります。以下のための例えばn=14
とa[0]=0
、それは次のようになります
熱心なアンブラーにとって、彼の計画されたルートの長さは非常に重要な情報です。したがって、あなたの仕事は、入力としてハイパーキューブの次元n
と開始頂点を取りa[0]
、結果のループ内の頂点の数を出力する関数またはプログラムを作成することです。
テストケース
n a[0] Output
-----------------
3 0 6
14 0 50
5 6 8
17 3 346
ルール
- 標準の抜け穴は禁止されています
- 出力/入力は任意の適切な形式にすることができます
a[0]
有効な頂点であると想定できます
得点
バイト単位の最短コードが優先されます。
このトピックに関する追加情報がありましたら、お聞かせください。
a[m]
ハイパーキューブ上にあった、a[m+1]
あまりにもなります。そしてa[0]
、有効な頂点であると想定できるので、ハイパーキューブのことを気にする必要はほとんどなく、ルールに従うだけです。
a[m+1] = xor(a[m], 2^mod(a[m],n))
頂点がハイパーキューブに属しているかどうかは関係ありませんよね?