Ihre Aufgabe wird es sein, eine Funktion oder ein Programm zu schreiben, das eine ganze Zahl n>0
als Eingabe und Ausgabe einer Liste der Kanten des n
eindimensionalen Hyperwürfels verwendet . In der Graphentheorie wird eine Kante als ein 2-Tupel von Eckpunkten (oder Ecken, wenn Sie dies bevorzugen) definiert, die verbunden sind.
Beispiel 1
Ein eindimensionaler Hyperwürfel ist eine Linie mit zwei Eckpunkten, die wir als a
und bezeichnen b
.
Daher lautet die Ausgabe:
[[a, b]]
Beispiel 2
Der 4-dimensionale Hyperwürfel (oder Tesseract) besteht aus 32 Kanten und sein Graph sieht so aus
und die Ausgabe könnte so aussehen
[[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]]
Regeln
- Sie können die Eckpunkte beliebig benennen, solange der Name eindeutig ist.
- Die Kanten sind ungerichtet, dh
[a, b]
und[b, a]
gelten als dieselbe Kante. - Ihre Ausgabe darf keine doppelten Kanten enthalten.
- Die Ausgabe kann in jedem vernünftigen Format erfolgen.
- Standardlücken sind verboten.
Wertung
Kürzester Code gewinnt.
code-golf
math
graph-theory
Murphy
quelle
quelle
Antworten:
Gelee, 13 Bytes
Probieren Sie es hier aus. Für die Eingabe
3
ist die Ausgabe:Ich hoffe,
[1, 1, 1]
etc. ist ein okay "Name".Erläuterung
Die erste Zeile ist ein „Prädikat“ für ein Kantenpaar:
[A, B] ạ/S’
ist gleichsum(abs(A - B)) - 1
, ist null (false-y) iffA
undB
unterscheidet sich in genau einer Koordinate.Die zweite Zeile ist das Hauptprogramm:
2ṗ
(Kartesische Potenz von[1, 2]
).œc2
(Kombinationen der Größe zwei ohne Ersatz).ÐḟÇ
) entsprechen.quelle
ạ/S’
und2ṗœc2ÇÐḟ
sparen Sie ein paar Bytes.c/P=2
,2ṗṗ2ÇÐf
Funktioniert auch.Python 2, 54
5662BytesDoppelte Kanten werden durch Erstellen einer Menge von Mengen entfernt, mit der Ausnahme, dass Python erfordert, dass Mengenelemente hashbar sind, sodass sie in Tupel konvertiert werden. Beachten Sie, dass die Mengen
{a,b}
und{b,a}
gleich sind und in dasselbe Tupel konvertiert werden. xsot speicherte 2 Bytes mitn<<n
.Dies kann auf 49 Byte reduziert werden, wenn Zeichenfolgen von Sätzen ein OK-Ausgabeformat haben
was gibt Ausgabe wie
Schauen wir uns zunächst eine ältere Version der Lösung an.
Jede Zahl im Intervall
[0,2^n)
entspricht einem Scheitelpunkt mit Koordinaten, die durch dien
-bit-Binärzeichenfolgen angegeben werden . Scheitelpunkte sind benachbart, wenn sie sich in einem einzelnen Bit unterscheiden, dh wenn eines durch X oder eine Potenz von 2 vom anderen erhalten wird.Diese anonyme Funktion generiert alle möglichen Kanten, indem jeder Scheitelpunkt und jede Bitposition zum Kippen verwendet wird. Um zu vermeiden, dass eine Kante in beide Richtungen dupliziert wird, werden nur Einsen auf Nullen gekippt.
In der mehr Golf-Lösung
k
wird verwendet, um sowohli
als auchj
überk=n*i+j
, aus denen(i,j)
extrahiert werden kann, zu codieren(k/n,k%n)
. Dies erspart eine Schleife im Verständnis. Die Befugnisse von2
werden so ausgeübt1<<
, dass der richtige Operator Vorrang hat.Ein alternativer Ansatz zum Generieren jedes Scheitelpunktpaars und zum Überprüfen, ob die Scheitelpunkte ein bisschen auseinander liegen, erscheint länger (70 Byte):
quelle
n*2**n
ist geraden<<n
lambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}
wechseln, wird ein Byte gespeichert. (Der mit einem Stern versehene Ausdruck speichert drei, aber die Divisionssyntax verliert zwei.) Ich bin mir jedoch ziemlich sicher, dass die 49-Byte-Lösung, die Sie haben, in Ordnung ist.Mathematica,
4824 BytesNur eine anonyme Funktion, die integrierte Funktionen verwendet.
quelle
FromLetterNumber
. Ich denke sogar,EdgeList@*HypercubeGraph
ist eine gültige Antwort.JavaScript (SpiderMonkey 30+),
6964 ByteDies begann als Port von @ xnors Python 2-Lösung, aber ich konnte 9 Bytes einsparen, indem ich den Code so umschrieb, dass eine einzelne Schleife verwendet wurde. Bearbeiten: Weitere 5 Byte durch
i
umgekehrtes Aufteilen gespeichert, wie in der aktualisierten Lösung von @ xnor, die jetzt auch eine einzelne Schleife verwendet.quelle
MATL , 20 Bytes
Das funktioniert mit aktuellen Version (14.0.0) der Sprache / des Compilers.
Probieren Sie es online!
Erläuterung
Dies entspricht in etwa der Antwort von @ xnor .
quelle
Pyth, 13 Bytes
Ausgang an Eingang 3 :
Erläuterung:
quelle
Python 2: 59 Bytes
quelle