Biorąc pod uwagę oznaczenie węzła i znaki przecięcia przez Dowkera, oblicz jego wielomian nawiasu.
Chociaż istnieją bardziej techniczne definicje, do tego wyzwania wystarczy pomyśleć o węźle jako o czymś fizycznie wykonanym przez połączenie dwóch końców sznurka razem. Ponieważ sęki istnieją w trzech wymiarach, kiedy rysujemy je na papierze, używamy diagramów węzłów - dwuwymiarowych rzutów, w których skrzyżowania mają dokładnie dwie linie, jeden nad i jeden pod spodem.
Tutaj (b) i (c) są różnymi schematami tego samego węzła.
Jak przedstawiamy schemat węzłów na papierze? Większość z nas nie jest Rembrandtem, więc polegamy na notacji Dowkera , która działa w następujący sposób:
Wybierz dowolny punkt początkowy węzła. Poruszaj się w dowolnym kierunku wzdłuż węzła i numeruj napotkane skrzyżowania, zaczynając od 1, z następującą modyfikacją: jeśli jest to liczba parzysta i aktualnie przechodzisz przez skrzyżowanie, zaneguj tę liczbę parzystą. Na koniec wybierz liczby parzyste odpowiadające 1, 3, 5 itd.
Spróbujmy przykładu:
W tym węźle wybraliśmy „1” jako punkt wyjścia i ruszyliśmy w górę i w prawo. Za każdym razem, gdy przechodzimy nad lub pod innym kawałkiem liny, wyznaczamy punkt przecięcia kolejnej liczby naturalnej. Negujemy liczby parzyste odpowiadające pasmom przechodzącym przez skrzyżowanie, na przykład [3,-12]
na schemacie. Tak więc ten diagram byłby reprezentowany przez [[1,6],[2,5],[3,-12],[-4,9],[7,8],[-10,11]]
. Lista znajomych 1, 3, 5, 7 itd. Daje nam [6,-12,2,8,-4,-10]
.
Należy tutaj zwrócić uwagę na kilka rzeczy. Po pierwsze, notacja Dowkera nie jest unikalna dla danego węzła, ponieważ możemy wybrać dowolny punkt początkowy i kierunek. Ale biorąc pod uwagę zapis, można w pełni określić strukturę węzła (technicznie, aż do odzwierciedlenia jego głównych składników węzła). Chociaż nie wszystkie notacje Dowkera mogą tworzyć możliwe węzły, w tym problemie można założyć, że dane wejściowe reprezentują rzeczywisty węzeł.
Aby uniknąć niejednoznaczności między odbiciami węzła i ułatwić zadanie do rozwiązania, otrzymasz również listę znaków przejścia .
W dodatnim przejściu dolna linia idzie w lewo z punktu widzenia górnej linii. Na skrzyżowaniu ujemnym idzie w prawo. Zauważ, że odwrócenie kierunku owijania się wokół węzła (tj. Odwrócenie zarówno linii ponad i pod linią) nie zmienia znaków przecięcia. W naszym przykładzie są to znaki skrzyżowania [-1,-1,-1,1,-1,1]
. Są one podane w tej samej kolejności co notacja Dowkera, tzn. Dla skrzyżowań o numerach 1, 3, 5, 7 itd.
Na powyższym obrazie zarysowane skrzyżowanie na pierwszym schemacie, które jest w formie , można przekształcić tak, jak na drugiej figurze (inaczej wygładzanie dodatnie ) lub na trzeciej figurze ( wygładzanie ujemne ).
Zdezorientowany? Zróbmy przykład, próbując znaleźć nawias klamrowy (Uwaga: są to dwa węzły połączone razem. Ten rodzaj diagramu nie będzie potencjalnym wkładem w to wyzwanie, ponieważ wejściowe będą tylko pojedyncze węzły, ale mogą wyglądać jak wynik pośredni w algorytmie).
Najpierw używamy zasady 3
Używamy ponownie reguły 3 w obu nowych węzłach
Zastępujemy te 4 nowe węzły pierwszym równaniem.
Zastosowanie zasad 1 i 2 do tych 4 mówi nam
To nam powiedz
Gratulujemy ukończenia krótkiego wstępu do teorii węzłów!
Wkład
Dwie listy:
Notacja Dowker, np
[6,-12,2,8,-4,-10]
. Numeracja skrzyżowań musi zaczynać się od 1. Odpowiednie liczby nieparzyste[1,3,5,7,...]
są niejawne i nie mogą być podawane jako dane wejściowe.Znaki (
1
/-1
lub jeśli wolisz0
/1
lubfalse
/true
lub'+'
/'-'
) dla skrzyżowań odpowiadających notacji Dowker, np[-1,-1,-1,1,-1,1]
.
Zamiast pary list możesz mieć listę par, np [[6,-1],[-12,-1],...
Wydajność
[[1,-2],[5,0],[1,1],[-1,3]]
[0,1,0,5,1,0,-1]
Zasady
To wyzwanie dla golfa . Nie można użyć żadnej ze standardowych luk, a biblioteki, które mają narzędzia do obliczania notacji Dowkera lub wielomianów wspornika, nie mogą być używane. (Nadal można używać języka zawierającego te biblioteki, ale nie bibliotek / pakietów).
Testy
// 4-tuples of [dowker_notation, crossing_signs, expected_result, description]
[
[[],[],[[1,0]],"unknot"],
[[2],[1],[[-1,3]],"unknot with a half-twist (positive crossing)"],
[[2],[-1],[[-1,-3]],"unknot with a half-twist (negative crossing)"],
[[2,4],[1,1],[[1,6]],"unknot with two half-twists (positive crossings)"],
[[4,6,2],[1,1,1],[[1,-7],[-1,-3],[-1,5]],"right-handed trefoil knot, 3_1"],
[[4,6,2,8],[-1,1,-1,1],[[1,-8],[-1,-4],[1,0],[-1,4],[1,8]],"figure-eight knot, 4_1"],
[[6,8,10,2,4],[-1,-1,-1,-1,-1],[[-1,-7],[-1,1],[1,5],[-1,9],[1,13]],"pentafoil knot, 5_1"],
[[6,8,10,4,2],[-1,-1,-1,-1,-1],[[-1,-11],[1,-7],[-2,-3],[1,1],[-1,5],[1,9]],"three-twist knot, 5_2"],
[[4,8,10,2,12,6],[1,1,-1,1,-1,-1],[[-1,-12],[2,-8],[-2,-4],[3,0],[-2,4],[2,8],[-1,12]],"6_3"],
[[4,6,2,10,12,8],[-1,-1,-1,-1,-1,-1],[[1,-10],[2,-2],[-2,2],[1,6],[-2,10],[1,14]],"granny knot (sum of two identical trefoils)"],
[[4,6,2,-10,-12,-8],[1,1,1,1,1,1],[[1,-14],[-2,-10],[1,-6],[-2,-2],[2,2],[1,10]],"square knot (sum of two mirrored trefoils)"],
[[6,-12,2,8,-4,-10],[-1,-1,-1,1,-1,1],[[1,-2],[1,6],[-1,10]],"example knot"]
]
Zasoby zewnętrzne
Nie jest konieczne do podjęcia wyzwania, ale jeśli jesteś zainteresowany:
dziękuję @ChasBrown i @ H.Pwiz za złapanie błędu w mojej definicji zapisu Dowker