Zadanie
Otrzymasz dodatnią liczbę całkowitą i musisz wygenerować „ wykres komplementarny ” z tyloma węzłami. Jeśli nie wiesz, czym jest wykres uzupełniający się w Wikipedii, artykuł na pewno Ci nie pomoże, więc poniżej znajdują się dwa wyjaśnienia, techniczne i nietechniczne.
Nietechniczne
Wykres to zestaw węzłów połączonych liniami. Każda para punktów może być połączona jedną linią lub żadną. „Uzupełnienie” wykresu jest wynikiem pobrania wykresu i połączenia wszystkich węzłów, które nie są połączone, i odłączenia wszystkich węzłów, które są.
Samouzupełniający się wykres to wykres, którego dopełnienie można przestawić na kształt oryginału. Poniżej znajduje się przykład komplementarnego wykresu i pokaz tego, jak to zrobić.
Oto wykres z 5 węzłami:
Podkreślimy wszystkie miejsca, do których połączenia mogłyby się udać, za pomocą czerwonych kropkowanych linii:
Teraz znajdziemy uzupełnienie wykresu, zamieniając czerwone i czarne krawędzie:
Nie wygląda to tak jak na oryginalnym wykresie, ale jeśli przesuniemy węzły w ten sposób (każdy krok zamienia dwa węzły):
Otrzymujemy oryginalny wykres! Wykres i jego uzupełnienie są tym samym wykresem
Techniczny
Samouzupełniający się wykres jest wykresem izomorficznym do swojego uzupełnienia.
Dane techniczne
Otrzymasz dodatnią liczbę całkowitą za pomocą dowolnej metody, która najbardziej Ci odpowiada. I będzie wyjściowe wykres w jakikolwiek sposób Państwo uznają za stosowne, to obejmuje, ale nie ogranicza się do sąsiedztwa Matrix Form , adjacency formie wykazu, zdjęcia i oczywiście! Wyprowadzany wykres musi być własnym dopełnieniem i mieć tyle węzłów, ile wejściowych liczb całkowitych. Jeśli taki wykres nie istnieje, musisz podać wartość fałszowania.
To jest golf golfowy i powinieneś dążyć do zminimalizowania liczby bajtów.
Przypadki testowe
Poniżej znajdują się zdjęcia możliwych wyników dla kilku n
4
5
9
źródło
GraphData@{"SelfComplementary",{#,1}}&
, uważam, że po prostu ładuje kilka przykładów niskiego poziomun
z bazy danych Wolfram, więc nie zadziała to dla dowolnie dużych danych wejściowych.Odpowiedzi:
Haskell , 77 bajtów
Wypróbuj online!
Wykorzystuje to łatwe do obliczenia jawne kryterium, aby zdecydować, czy krawędź
(a,b)
należy do wykresu. Tworzy instancję tego algorytmu , z cykliczną permutacją między wartościami modulo 4Uwzględniamy krawędzie, których dwa wierzchołki końcowe dodają do 0 lub 1 modulo 4. Zauważ, że cykliczne wierzchołki zgodnie z tą permutacją dodają 2 modulo 4 do sumy wierzchołków na każdym z nich, a zatem zamieniają krawędzie i nie-krawędzie. Daje to permutację wierzchołków, która uzupełnia krawędzie.
Jeśli wykres ma dodatkowy węzeł większy niż wielokrotność 4, zostaje umieszczony w samym cyklu. Uwzględniamy krawędzie, gdy inny wierzchołek jest równy. Dopuszczenie wierzchołków powoduje odwrócenie parzystości, dzięki czemu wykres sam się uzupełnia.
Jeśli liczba wierzchołków nie jest równa 0 lub 1 moduł 4, nie jest możliwy samouzupełniający się wykres, ponieważ na całym wykresie jest nieparzysta liczba krawędzi
Ogólnie rzecz biorąc, oto warunki:
(a,b)
za<b
ia+b
równe 0 lub 1 modulo 4.(a,n)
gdy a jest parzyste.Kod łączy drugie i trzecie przypadków zastępując warunek
mod(a+b)4<2
zemod(a+a)4<2
gdy obaodd n
ib==n
.źródło
Brachylog 2 , 24 bajty
Wypróbuj online!
Ta funkcja zwraca parę składającą się z dwóch list przyległości: jednej dla wykresu, jednej dla wykresu dopełniacza. (W interpretatorze Brachylog na TIO możesz poprosić go o ocenę funkcji, a nie pełnego programu, podając
Z
jako argument wiersza poleceń.) Na przykład dane wyjściowe dla danych wejściowych5
to:Oto, jak to wygląda jako obraz (pokazujący dwa wykresy):
Jak to zwykle bywa w językach opartych na Prologu, funkcja obsługuje więcej niż jeden wzorzec wywołań. W szczególności, jeśli spróbujesz użyć go jako generatora, wyświetli on wszystkie możliwe samouzupełniające się wykresy z podaną liczbą wierzchołków (chociaż nie dołożyłem żadnych starań, aby ten przypadek był użyteczny, a zwłaszcza wyświetli każdy z nich wykresy wiele razy).
Wyjaśnienie
Jest to w zasadzie tylko opis problemu, pozostawiając implementację Prologa w celu znalezienia najlepszej metody jego rozwiązania. (Wątpię jednak, czy w tym konkretnym przypadku użyje algorytmu lepszego niż brutalna siła, więc jest to prawdopodobnie dość nieefektywne, a testy wydają się to potwierdzać, pokazując, że wydajność staje się znacznie gorsza, im większy jest wykres).
Nawiasem mówiąc, skończyło się na tym, że spędziłem całe 6 bajtów (¼ programu, znaków
(∨?<2)
) zajmujących się specjalnymi przypadkami 0 i 1. Frustrujące, ale taka jest natura specjalnych przypadków.Ta
\\ᵐcdl?
sekcja jest trochę trudna do zrozumienia, więc oto sprawdzony przykład. Jego celem jest sprawdzenie, czy coś jest wykresem i jego dopełnieniem, przy czym odpowiednie krawędzie na wykresie i dopełnieniu są w tej samej kolejności na listach. Para wykres / uzupełnienie staje się ostatecznym wyjściem programu. Oto przykładowy przypadek:Transpozycja tego daje nam listę par odpowiednich krawędzi między wykresem a dopełnieniem:
Następnie transponujemy elementy listy i spłaszczamy jeden poziom; która daje nam listę par odpowiednich elementów między wykresem a dopełnieniem:
Najwyraźniej chcemy tutaj, aby nie było więcej niż 1 para zaczynająca się od każdego elementu (co dowodzi, że elementy wykresu i dopełniacza są w korespondencji 1 do 1). Możemy to niemal zweryfikować, stwierdzając, że lista zawiera dokładnie
?
różne elementy (tj. Liczbę różnych elementów równą liczbie wierzchołków). W takim przypadku test kończy się powodzeniem; odrębne elementy to:Pozostawia to jednak miejsce na potencjalny problem; jeśli wierzchołek jest całkowicie odłączony na oryginalnym wykresie, jego korespondencja nie zostanie wymieniona, pozostawiając miejsce na zduplikowaną korespondencję z niektórych innych wierzchołków. Jeśli jest to przypadek, wykres uzupełnienie musi mieć przewagę między tym wierzchołku (bez straty ogólności załóżmy, że jest
1
), i co drugi wierzchołek, a więc lista będzie zawierać korespondencji[1,2]
,[1,3]
, ...,[1, ?]
. Gdy?
jest duży, doprowadzi to do większej liczby korespondencji ogółem niż w innym przypadku, więc nie ma problemu. Jedyny problem występuje, gdy?
jest 3 lub niższy, w którym to przypadku dodajemy tylko jedną dodatkową korespondencję (usuwając jedną z1
nie pojawia się na wejściu); nie stanowi to jednak problemu w praktyce, ponieważ istnieją 3 możliwe krawędzie na wykresie 3-elementowym, co jest liczbą nieparzystą (podobnie, 1 możliwa krawędź na wykresie 2-elementowym jest również liczbą nieparzystą), a zatem test zakończy się niepowodzeniem na tym\
etapie (nie można przetransponować obdartej listy, tzn. tych, których elementy mają różne długości).źródło
z
i\
polega na tym, żez
jest to cykliczny zip, co oznacza, że w[[1,2,3],["a"]]
końcu będzie[[1,"a"],[2,"a"],[3,"a"]]
zz
, podczas gdy się nie powiedzie\
.\
teraz działa tylko na macierzach kwadratowych; przyszłe wdrożenie sprawi, że będzie działaćz
, z wyjątkiem cyklicznego.BBC BASIC, 161 bajtów
Tokenizowany rozmiar pliku 140 bajtów
Pobierz tłumacza na http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Nieskluczony kod
Wyjaśnienie
Wykorzystuje ten sam algorytm co Xnor, ale generuje schemat.
Gdzie
n
jest w formie4x+2
lub4x+3
nie ma rozwiązania, ponieważ liczba krawędzi jest nieparzysta.Gdzie
n
ma postać 4x, układamy wszystkie wierzchołki w okręgu i rysujemy te krawędzie, w których(a+b) mod 4
jest 2 lub 3 (nie 0 lub 1, jak w przypadku Xnora, ze względów golfowych. Jest to zatem uzupełnienie rozwiązania podanego przez Xnor.)Aby zobaczyć to w bardziej obrazowym sensie, bierzemy co drugi wierzchołek i rysujemy krawędzie do wierzchołków 1 i 2 miejsc w kierunku przeciwnym do ruchu wskazówek zegara. To określa
n
równoległe kierunki, połowę całości. Następnie dodajemy wszystkie pozostałe krawędzie równolegle do nich.Uzupełnienie można znaleźć, dodając 1 do obu a i b w każdej specyfikacji krawędzi lub obrazowo, obracając schemat o
1/n
zakręt.Gdzie
n
ma postać 4x + 1 dodajemy kolejny wierzchołek, który jest powiązany z co drugim wierzchołkiem wykresu 4x. Gdyby została umieszczona w środku, symetria diagramu zostałaby zachowana, ale dla jasności wybrałem ją poza głównym okręgiem punktów.Wynik
Oto kilka pierwszych przypadków dla 4x + 1. przypadki 4x można zobaczyć, usuwając wierzchołek w prawym dolnym rogu i związane z nim krawędzie.
źródło
JavaScript (ES6), 191 bajtów
Ta funkcja zwraca listę przylegania. Wykorzystuje dwa algorytmy i rozróżnia puste wykresy komplementarne od niepochodzących z wyników, zwracając
0
zamiast,[]
gdy nie ma. Pierwszy algorytm oparty jest na wykresach Rado skonstruowanych przy użyciu predykatu BIT i tworzy prawidłowe wykresy komplementarne rzędu 0, 1, 4 i 5. Drugi algorytm, znaleziony przez naszych przyjaciół z matematyki , konstruuje prawidłowy wykres komplementarny wierzchołka V + 4, stosując dodatek 4-ścieżkowy do prawidłowego wykresu komplementarnego wierzchołka V.Zaczyna się od sprawdzenia poprawności danych wejściowych w celu potwierdzenia istnienia prawidłowego wykresu uzupełniającego (za pomocą
n*~-n/4%1
), a jeśli to się nie powiedzie, zwraca0
. Następnie sprawdza, czyn>5
i powtarzan-4
sprawę, aby skonstruować prawidłowe rozwiązanie niższego rzędu, a następnie stosuje dodatek 4 do zwróconej listy sąsiadów w drodze do łańcucha rekurencji. Wreszcie, jeślin>5
nie jest to prawdą, to iteracje od0
don-1
dox
iy
, i sprawdza, czy(y>>x)&1
jest to prawda. Jeśli tak, to te węzły są sparowane.Oto bardziej czytelny format funkcji, z operatorami potrójnymi rozszerzonymi do instrukcji if-else i
eval()
wstawionych:Próbny
źródło