Twoim zadaniem będzie napisanie funkcji lub programu, który weźmie liczbę całkowitą n>0
jako dane wejściowe i wyprowadza listę krawędzi n
hiperwymiarowego hipersześcianu . W teorii grafów krawędź jest zdefiniowana jako 2-krotna liczba wierzchołków (lub narożników, jeśli wolisz), które są połączone.
Przykład 1
Hipersześcian 1-wymiarowy jest linią i ma dwa wierzchołki, które nazwiemy a
i b
.
Dlatego wynik będzie:
[[a, b]]
Przykład 2
4-wymiarowy hipersześcian (lub tesseract) składa się z 32 krawędzi, a jego wykres wygląda następująco
i wynik może wyglądać tak
[[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]]
Zasady
- Możesz nazwać wierzchołki w dowolny sposób, pod warunkiem, że nazwa jest unikalna.
- Krawędzie nieukierunkowane, IE
[a, b]
i[b, a]
są uznane za samej krawędzi. - Twoje dane wyjściowe nie mogą zawierać zduplikowanych krawędzi.
- Dane wyjściowe mogą mieć dowolny rozsądny format.
- Standardowe luki są zabronione.
Punktacja
Najkrótszy kod wygrywa.
code-golf
math
graph-theory
murphy
źródło
źródło
Odpowiedzi:
Galaretka, 13 bajtów
Wypróbuj tutaj. Dane wejściowe
3
to:Mam nadzieję, że
[1, 1, 1]
itd. To dobre „imię”.Wyjaśnienie
Pierwszy wiersz jest „predykatem” na parze krawędzi:
[A, B] ạ/S’
jest równysum(abs(A - B)) - 1
, co oznacza zero (false-y) iffA
iB
różni się dokładnie jedną współrzędną.Druga linia to program główny:
2ṗ
(potęgi kartezjańskiej[1, 2]
).œc2
(kombinacje rozmiaru drugiego bez wymiany).ÐḟÇ
).źródło
ạ/S’
i2ṗœc2ÇÐḟ
zaoszczędzić kilka bajtów.c/P=2
,2ṗṗ2ÇÐf
też działa.Python 2, 54
5662bajtówZduplikowane krawędzie są usuwane przez utworzenie zestawu zestawów, z wyjątkiem tego, że Python wymaga, aby elementy zestawu były haszowalne, więc są konwertowane na krotki. Zauważ, że zestawy
{a,b}
i{b,a}
są równe i konwertowane na tę samą krotkę. xsot zapisał 2 bajty za pomocąn<<n
.Można to zmniejszyć do 49 bajtów, jeśli ciągi zestawów są w formacie wyjściowym OK
co daje wynik jak
Najpierw spójrzmy na starszą wersję rozwiązania.
Każda liczba w przedziale
[0,2^n)
odpowiada wierzchołkowi o współrzędnych podanych przezn
-bitowe ciągi binarne. Do wierzchołków przylegają, jeśli różnią się one jednym bitem, tj. Jeśli jeden jest uzyskiwany od drugiego przez moc x 2.Ta anonimowa funkcja generuje wszystkie możliwe krawędzie, przejmując każdy wierzchołek i każdą pozycję bitową. Aby uniknąć powielania krawędzi w obu kierunkach, tylko 1 są odwracane do 0.
W bardziej golfowym rozwiązaniu
k
służy do kodowania zarówno poprzez , jaki
ij
poprzezk=n*i+j
, z którego(i,j)
można wyodrębnić jako(k/n,k%n)
. To zapisuje pętlę w zrozumieniu. Uprawnienia2
są wykonywane tak,1<<
aby mieć właściwy priorytet operatora.Alternatywne podejście do generowania każdej pary wierzchołków i sprawdzania, czy są one nieco rozłożone, wydaje się dłuższe (70 bajtów):
źródło
n*2**n
jest po prostun<<n
lambda n:{(*{k//n,k//n^1<<k%n},)for k in range(n<<n)}
oszczędza bajt. (Wyrażenie oznaczone gwiazdką oszczędza trzy, ale składnia podziału traci dwa). Jestem jednak pewien, że 49-bajtowe rozwiązanie jest w porządku.Mathematica,
4824 bajtówTylko anonimowa funkcja korzystająca z wbudowanych funkcji.
źródło
FromLetterNumber
. Myślę nawet, żeEdgeList@*HypercubeGraph
to poprawna odpowiedź.JavaScript (SpiderMonkey 30+),
6964 bajtówZaczęło się to jako port rozwiązania Python 2 dla @ xnor, ale udało mi się zaoszczędzić 9 bajtów, przepisując kod w celu użycia pojedynczej pętli. Edycja: Zapisano kolejne 5 bajtów, dzieląc
i
na odwrót, zgodnie ze zaktualizowanym rozwiązaniem @ xnor, które teraz używa również pojedynczej pętli.źródło
MATL , 20 bajtów
Działa to z bieżącą wersją języka / kompilatora (14.0.0) .
Wypróbuj online!
Wyjaśnienie
Wykorzystuje to mniej więcej ten sam pomysł, co odpowiedź @ xnor .
źródło
Pyth, 13 bajtów
Dane wyjściowe na wejściu 3 :
Wyjaśnienie:
źródło
Python 2: 59 bajtów
źródło