Tugas Anda adalah untuk menulis fungsi atau program, yang akan membawa integer n>0
sebagai input dan output daftar tepi n
berdimensi hypercube . Dalam teori graph, sebuah edge didefinisikan sebagai 2-tuple dari simpul (atau sudut, jika Anda mau), yang terhubung.
Contoh 1
Hypercube 1 dimensi adalah garis dan fitur dua simpul, yang akan kita panggil a
dan b
.
Oleh karena itu, hasilnya adalah:
[[a, b]]
Contoh 2
Hypercube 4-dimensi (atau tesseract) terdiri dari 32 sisi dan grafiknya terlihat seperti ini
dan hasilnya bisa seperti ini
[[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]]
Aturan
- Anda dapat memberi nama simpul dengan cara apa pun yang Anda suka, asalkan namanya unik.
- Tepi tidak diarahkan, yaitu
[a, b]
dan[b, a]
dianggap sebagai tepi yang sama. - Output Anda tidak boleh mengandung duplikat tepi.
- Outputnya mungkin dalam format yang masuk akal.
- Celah standar dilarang.
Mencetak gol
Kode terpendek menang.
code-golf
math
graph-theory
murphy
sumber
sumber
Jawaban:
Jelly, 13 byte
Coba di sini. Untuk input
3
, outputnya adalah:Saya harap
[1, 1, 1]
dll adalah "nama" yang oke.Penjelasan
Baris pertama adalah "predikat" pada sepasang tepi:
[A, B] ạ/S’
sama dengansum(abs(A - B)) - 1
, yang nol (salah-y) jikaA
danB
berbeda dalam satu koordinat.Baris kedua adalah program utama:
2ṗ
(kekuatan Cartesian[1, 2]
).œc2
(kombinasi ukuran dua tanpa penggantian).ÐḟÇ
).sumber
ạ/S’
dan2ṗœc2ÇÐḟ
simpan beberapa byte.c/P=2
,2ṗṗ2ÇÐf
Bekerja juga.Python 2, 54
5662byteTepi duplikat dihapus dengan membuat satu set set, kecuali Python membutuhkan elemen set yang hashable, sehingga mereka dikonversi menjadi tupel. Perhatikan bahwa set
{a,b}
dan{b,a}
sama dan dikonversi ke tuple yang sama. xsot menyimpan 2 byte dengann<<n
.Ini dapat dikurangi menjadi 49 byte jika rangkaian set adalah format output OK
yang memberikan output seperti
Pertama, mari kita lihat versi solusi yang lebih lama.
Setiap angka dalam interval
[0,2^n)
sesuai dengan sebuah titik dengan koordinat yang diberikan olehn
string biner - bitnya. Ke simpul berdekatan jika mereka berbeda dalam satu bit, yaitu jika satu diperoleh dari yang lain dengan xor-ing kekuatan 2.Fungsi anonim ini menghasilkan semua tepi yang mungkin dengan mengambil setiap titik dan setiap posisi bit untuk flip. Untuk menghindari duplikasi tepi di kedua arah, hanya 1 yang dibalik ke 0.
Dalam solusi yang lebih golf,
k
digunakan untuk menyandikan keduanyai
danj
melaluik=n*i+j
, dari mana(i,j)
dapat diekstraksi sebagai(k/n,k%n)
. Ini menghemat satu lingkaran dalam pemahaman. Kekuatan2
dilakukan1<<
agar memiliki hak operator yang diutamakan.Pendekatan alternatif untuk menghasilkan setiap pasangan simpul dan memeriksa jika keduanya agak terpisah tampaknya lebih lama (70 byte):
sumber
n*2**n
hanyan<<n
lambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}
menyimpan satu byte. (Ekspresi berbintang menyimpan tiga, tetapi sintaks pembagian kehilangan dua.) Namun, saya cukup yakin solusi 49-byte yang Anda miliki baik-baik saja.Mathematica,
4824 byteHanya fungsi anonim yang menggunakan bawaan.
sumber
FromLetterNumber
. Saya bahkan berpikir ituEdgeList@*HypercubeGraph
adalah jawaban yang valid.JavaScript (SpiderMonkey 30+),
6964 byteIni dimulai sebagai port dari solusi Python 2 @ xnor tetapi saya dapat menyimpan 9 byte dengan menulis ulang kode untuk menggunakan satu loop. Sunting: Menyimpan 5 byte lebih lanjut dengan
i
memisah-misahkan, sesuai per pembaruan solusi @ xnor, yang sekarang juga menggunakan satu loop.sumber
MATL , 20 byte
Ini berfungsi dengan versi saat ini (14.0.0) dari bahasa / kompiler.
Cobalah online!
Penjelasan
Ini menggunakan ide yang kurang lebih sama dengan jawaban @ xnor .
sumber
Pyth, 13 byte
Output pada input 3 :
Penjelasan:
sumber
Python 2: 59 byte
sumber