Niedawno czytałem teorię grafów, zwłaszcza hipersześcianów i myślałem o interesujących sposobach budowania na nich ścieżek. Oto, co wymyśliłem.
Jak zapewne wiesz, możesz zbudować n-wymiarową hipersześcię, biorąc wszystkie n-krotki składające się z 1
i 0
jako wierzchołki i łącząc je, jeśli różnią się one jedną cyfrą. Jeśli interpretujesz te cyfry binarne jako liczbę całkowitą, powstaje wykres z ładnie numerowanymi wierzchołkami. Na przykład dla n=3
:
Powiedzmy, że chcesz przejść się po tej hipersześcianie i zacząć od wierzchołka 0
. Jak ustalić, który wierzchołek chcesz odwiedzić w następnej kolejności? Zasada, którą wymyśliłem, to wziąć numer a
wierzchołka, na którym jesteś, odwrócić jego mod(a,n)
bit (indeksowanie od zera) i przejść do wynikowego wierzchołka. Formalnie tę regułę można rekurencyjnie zdefiniować jako
a[m+1] = xor(a[m], 2^mod(a[m],n)).
Przestrzegając tej zasady, zawsze pozostaniesz na sześcianie i będziesz podróżował wzdłuż krawędzi. Powstała ścieżka wygląda następująco
Jak widać, będziesz chodzić w kółko! W rzeczywistości we wszystkich wymiarach i dla wszystkich punktów początkowych twoja ścieżka skończy się w pętli. Na przykład dla n=14
i a[0]=0
wygląda to tak
Dla zapalonego amblera długość jego planowanej trasy jest dość istotną informacją. Twoim zadaniem jest napisanie funkcji lub programu, który przyjmuje wymiar hipersześcianu jako n
wierzchołek początkowy a[0]
jako dane wejściowe i wyprowadza liczbę wierzchołków w wynikowej pętli.
Przypadki testowe
n a[0] Output
-----------------
3 0 6
14 0 50
5 6 8
17 3 346
Zasady
- Standardowe luki są zabronione
- Dane wyjściowe / wejściowe mogą być w dowolnym odpowiednim formacie
- Możesz założyć,
a[0]
że jest poprawnym wierzchołkiem
Punktacja
Najkrótszy kod w bajtach wygrywa.
Jeśli masz dodatkowe informacje na ten temat, z przyjemnością usłyszę!
źródło
a[m+1] = xor(a[m], 2^mod(a[m],n))
, nie ma znaczenia, czy wierzchołki należą do hipersześcianu, prawda?a[m]
był na hipersześcianie, teża[m+1]
będzie. A ponieważ możesz założyć,a[0]
że jest to prawidłowy wierzchołek, właściwie nie musisz przejmować się żadnymi rzeczami związanymi z hipersześcianami i po prostu przestrzegaj reguły.Odpowiedzi:
Galaretka, 9 bajtów
Bierze dwa argumenty wiersza polecenia.
Wypróbuj tutaj .
źródło
Haskell, 124
Znajduje to koło za pomocą algorytmu dwupunktowego zmieniającego prędkość w różnych prędkościach i mocno wykorzystuje / nadużywa podejścia Haskella do list (na przykład dwa wskaźniki są w rzeczywistości listami).
g
to funkcja, która oblicza odpowiedź. podaj go,n
a następniea[0]
zwróci ci numer (pamiętaj, żen
należy zdefiniować typ,Int
aby uniknąć niejednoznaczności typu).źródło
JavaScript (ES6), 69 bajtów
Zwraca 18812 dla (23, 10).
źródło
MATL ,
383728 bajtówDziała to w bieżącej wersji (15.0.0) języka.
Wypróbuj online !
Wyjaśnienie
źródło
Pyth,
2217 bajtówWyjaśnienie:
Wypróbuj tutaj .
źródło