ハイパーキューブの端に


12

あなたの仕事はn>0、入力または入力として整数を受け取り、- n次元ハイパーキューブのエッジのリストを出力する関数またはプログラムを作成することです。グラフ理論では、エッジは接続された2組の頂点(または必要に応じてコーナー)として定義されます。

例1

1次元の超立方体はラインであり、我々は呼ぶ2つの頂点、特徴aとしますb

ここに画像の説明を入力してください

したがって、出力は次のようになります。

[[a, b]]

例2

4次元のハイパーキューブ(またはtesseract)は32のエッジで構成され、そのグラフは次のようになります

ここに画像の説明を入力してください

出力は次のようになります

[[a, b], [a, c], [a, e], [a, i], [b, d], [b, f], [b, j], [c, d], [c, g], [c, k], [d, h], [d, l], [e, f], [e, g], [e, m], [f, h], [f, n], [g, h], [g, o], [h, p], [i, j], [i, k], [i, m], [j, l], [j, n], [k, l], [k, o], [l, p], [m, n], [m, o], [n, p], [o, p]]

ルール

  • 名前が一意である限り、任意の方法で頂点に名前を付けることができます。
  • エッジは無向すなわちさ[a, b][b, a]同じエッジであると考えられます。
  • 出力に重複したエッジを含めることはできません。
  • 出力は、適切な形式であればどのような形式でもかまいません。
  • 標準的な抜け穴は禁止されています。

得点

最短のコードが優先されます。



[1,2]、[2,3]などは大丈夫ですか?
Rɪᴋᴇʀ

@EasterlyIrkうん。
マーフィー

エッジは任意の順序で出力できますよね?
ルイスメンドー

@DonMuesliそうです。
マーフィー

回答:


4

ゼリー、13バイト

ạ/S’
2ṗœc2ÇÐḟ

ここで試してみてください。入力の3場合、出力は次のとおりです。

[[[1, 1, 1], [1, 1, 2]],
 [[1, 1, 1], [1, 2, 1]],
 [[1, 1, 1], [2, 1, 1]],
 [[1, 1, 2], [1, 2, 2]],
 [[1, 1, 2], [2, 1, 2]],
 [[1, 2, 1], [1, 2, 2]],
 [[1, 2, 1], [2, 2, 1]],
 [[1, 2, 2], [2, 2, 2]],
 [[2, 1, 1], [2, 1, 2]],
 [[2, 1, 1], [2, 2, 1]],
 [[2, 1, 2], [2, 2, 2]],
 [[2, 2, 1], [2, 2, 2]]]

私は願います [1, 1, 1]などが大丈夫な「名前」であるます。

説明

最初の行は、エッジのペアの「述語」です:[A, B] ạ/S’は、等しいsum(abs(A - B)) - 1(ゼロ(false-y)である場合)AおよびBあり、1つの座標が正確に異なる。

2行目はメインプログラムです。

  • 2ṗ(デカルトのべき乗[1, 2])ですべてのエッジを生成します。
  • 使用可能なすべてのペアを取得 œc2(置換せずにサイズ2の組み合わせ)を。
  • 前に定義した述語(ÐḟÇ)を満たす要素のみを保持します。

1
ạ/S’そして2ṗœc2ÇÐḟバイトのカップルを保存します。
デニス

c/P=22ṗṗ2ÇÐf機能します。
デニス

スマートな「命名」スキーム!確かにルール内。
マーフィー

9

Python 2、54 56 62バイト

lambda n:{tuple({k/n,k/n^1<<k%n})for k in range(n<<n)}

重複したエッジはセットのセットを作成することで削除されます。ただし、Pythonではセット要素がハッシュ可能である必要があるため、それらはタプルに変換されます。セット{a,b}{b,a}は等しく、同じタプルに変換されることに注意してください。xsotは2バイトを保存しましたn<<n

セットの文字列がOK出力形式の場合、これは49バイトに削減できます。

lambda n:{`{k/n,k/n^1<<k%n}`for k in range(n<<n)}

次のような出力が得られます

set(['set([1, 3])', 'set([2, 3])', 'set([0, 2])', 'set([0, 1])'])

lambda n:[(k/n,k/n^1<<k%n)for k in range(n*2**n)if k/n&1<<k%n]

最初に、古いバージョンのソリューションを見てみましょう。

lambda n:[(i,i^2**j)for i in range(2**n)for j in range(n)if i&2**j]

間隔の各数値は、-bitバイナリ文字列で[0,2^n)指定された座標を持つ頂点に対応しnます。頂点が隣接しているのは、ビットが1ビットだけ異なる場合、つまり2のべき乗のxor-ingによって一方が他方から取得される場合です。

この匿名関数は、すべての頂点とすべてのビット位置を反転させることにより、すべての可能なエッジを生成します。エッジが両方向に複製されないように、1のみが0に反転されます。

よりgolfed溶液中で、k両方を符号化するために使用さijを介してk=n*i+j、そこから、(i,j)として抽出することができます(k/n,k%n)。これにより、理解のループが保存されます。パワーはの2ように行われ1<<は、正しい演算子の優先順位を持つにれます。

頂点の各ペアを生成し、それらが少し反転しているかどうかを確認する代替アプローチは、より長いようです(70バイト):

lambda n:[(i,x)for i in range(2**n)for x in range(i)if(i^x)&(i^x)-1<1] 

1
n*2**nはちょうどn<<n
-xsot

Python 3.5に切り替えるとlambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}、バイトが節約されます。(星付きの式は3つを節約しますが、除算構文は2つを失います。)しかし、あなたが持っている49バイトのソリューションは問題ないと確信しています。
リン

4

Mathematica、48 24バイト

EdgeList@*HypercubeGraph

組み込みを使用する単なる匿名関数。


ああ、ビルトイン!頂点にアルファベット順に名前を付ける必要がないため、を省略できますFromLetterNumber。私もEdgeList@*HypercubeGraph有効な答えだと思います。
マーフィー

3

JavaScript(SpiderMonkey 30 +)、69 64バイト

n=>[for(i of Array(n<<n).keys())if(i/n&(j=1<<i%n))[i/n^j,i/n^0]]

これは@xnorのPython 2ソリューションの移植として始まりましたが、単一のループを使用するようにコードを書き直すことで9バイトを節約することができました。編集:i@xnorの更新されたソリューションに従って、別の方法で分割することでさらに5バイトを保存しました。このソリューションは現在、単一のループを使用しています。


2

MATL、20バイト

2i^:qt!Z~Zltk=XR2#fh

これは、現在のバージョン(14.0.0)の言語/コンパイラーで動作します。

オンラインでお試しください!

説明

これは、@ xnorの答えとほぼ同じ考え方を使用しています

2i^    % take input n and compute 2^n
:q     % range [0,1,...,2^n-1] (row vector)
t!     % duplicate, transpose into a column vector
Z~     % bitwise XOR with broadcast
Zl     % binary logarithm
tk     % duplicate and round down
=      % true if equal, i.e. for powers of 2
XR     % upper triangular part, above diagonal
2#f    % row and index columns of nonzero values
h      % concatenate vertically

2

Pyth、13バイト

fq1.aT.c^U2Q2

入力3の出力

[[[0, 0, 0], [0, 0, 1]], [[0, 0, 0], [0, 1, 0]], [[0, 0, 0], [1, 0, 0]], [[0, 0, 1], [0, 1, 1]], [[0, 0, 1], [1, 0, 1]], [[0, 1, 0], [0, 1, 1]], [[0, 1, 0], [1, 1, 0]], [[0, 1, 1], [1, 1, 1]], [[1, 0, 0], [1, 0, 1]], [[1, 0, 0], [1, 1, 0]], [[1, 0, 1], [1, 1, 1]], [[1, 1, 0], [1, 1, 1]]]

説明:

fq1.aT.c^U2Q2
                  Implicit: input = Q
        ^U2Q      All Q entry lists made from [0, 1].
      .c    2     All 2 element combinations of them.
f                 Filter them on
   .aT            The length of the vector
 q1               Equaling 1.

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