Szczerze mówiąc, nie mogę uwierzyć, że nie zostało to już zadane, ale oto jest
tło
Biorąc pod uwagę prosty, nieukierunkowany planarny (wykres można narysować w płaszczyźnie bez przecięć), jest to udowodnione twierdzenie, że wykres można pokolorować na 4 kolory, termin ten zbadamy za chwilę. Znacznie łatwiej jest jednak 5-kolorowy wykres, na którym dziś skoncentrujemy nasze wyzwanie.
Prawidłowe k-kolorowanie wykresu to przypisanie „kolorów” do węzłów wykresu o następujących właściwościach
- Jeśli dwa węzły są połączone krawędzią, węzły są kolorowe w różnych kolorach.
- Na całym wykresie znajduje się maksymalnie 5 kolorów.
Biorąc to pod uwagę, przedstawię ci dość prosty algorytm do 5-kolorowego dowolnego prostego nieukierunkowanego wykresu płaskiego. Ten algorytm wymaga następujących definicji
Osiągalność : jeśli węzeł 1 jest osiągalny z węzła 2, oznacza to, że istnieje sekwencja węzłów, z których każdy jest połączony krawędzią, tak że pierwszy węzeł to węzeł 2, a ostatni to węzeł 1. Uwaga: ponieważ wykresy niekierowane są symetryczne, jeśli węzeł 1 jest osiągalny z węzła 2, węzeł 2 jest osiągalny z węzła 1.
Podgraf : Podgraf wykresu danego zestawu węzłów N jest wykresem, w którym wszystkie węzły podgrafatu znajdują się w N, a krawędź oryginalnego wykresu znajduje się w podgrafie tylko wtedy, gdy oba węzły są połączone krawędzią są w N.
Niech Kolor (N) będzie funkcją kolorowania płaskich wykresów za pomocą N węzłów o 5 kolorach. Definiujemy funkcję poniżej
- Znajdź węzeł z najmniejszą liczbą podłączonych do niego węzłów. Ten węzeł będzie miał maksymalnie 5 połączonych z nim węzłów.
- Usuń ten węzeł z wykresu.
- Zadzwoń do Color (N-1) na tym nowym wykresie, aby go pokolorować.
- Dodaj usunięty węzeł z powrotem do wykresu.
- Jeśli to możliwe, pokoloruj dodany węzeł kolorem, którego nie ma żaden z połączonych węzłów.
- Jeśli nie jest to możliwe, wszystkie 5 sąsiednich węzłów do dodanego węzła mają 5 różnych kolorów, dlatego musimy wypróbować następujący proces.
- Numeruj węzły otaczające dodany węzeł n1 ... n5
- Weź podgraph wszystkich węzłów na oryginalnym wykresie w kolorze tego samego koloru co n1 lub n3.
- Jeśli w tym podrozdziale n3 nie jest osiągalne z n1, w zbiorze węzłów osiągalnych z n1 (w tym n1) zamień wszystkie wystąpienia koloru n1 na n3 i odwrotnie. Teraz pokoloruj oryginalny kolor dodanego węzła n1.
- Jeśli n3 było osiągalne z n1 na tym nowym wykresie, wykonaj proces od kroku 9 na węzłach n2 i n4, zamiast n1 i n3.
Wyzwanie
Biorąc pod uwagę wejście listy edgelist (reprezentującej wykres), pokoloruj wykres, przypisując każdemu węzłu wartość.
Dane wejściowe : lista krawędzi na wykresie (tj. [('a','b'),('b','c')...]
)
Zauważ, że wejściowa lista edycji będzie taka, że jeśli (a, b) znajduje się na liście, (b, a) NIE jest na liście.
Dane wyjściowe : obiekt zawierający pary wartości, gdzie pierwszym elementem każdej pary jest węzeł, a drugim jego kolor, tj. [('a',1),('b',2)...]
Lub{'a':1,'b':2,...}
Możesz użyć czegokolwiek do przedstawienia kolorów, od liczb, przez znaki i cokolwiek innego.
Dane wejściowe i wyjściowe są dość elastyczne, o ile jasne jest, jakie są dane wejściowe i wyjściowe.
Zasady
- To jest golf golfowy wyzwanie dla
- Nie musisz używać algorytmu, który opisałem powyżej. Jest po prostu tam w celach informacyjnych.
- Dla każdego wykresu często istnieje wiele prawidłowych metod ich kolorowania. Dopóki kolorystyka wygenerowana przez algorytm jest poprawna, jest to dopuszczalne.
- Pamiętaj, że wykres musi mieć 5 kolorów.
Przypadki testowe
Użyj następującego kodu, aby sprawdzić poprawność wyników kolorowania. Ponieważ istnieje wiele prawidłowych kolorów na wykresie, ten algorytm po prostu sprawdza poprawność kolorowania. Zobacz dokumentację, aby zobaczyć, jak korzystać z kodu.
Niektóre losowe (i raczej głupie) przypadki testowe :
Przypadek testowy 2: Krackhardt Kite Graph
[(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), (1, 6), (2, 3), (2, 5), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (5, 7), (6, 7), (7, 8), (8, 9)]
Prawidłowe wyjście:
{0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}
Uwaga : Te przypadki testowe są zbyt małe, aby przetestować bardziej szczegółowe zachowanie algorytmu kolorowania, więc tworzenie własnych wykresów jest prawdopodobnie dobrym testem poprawności twojej pracy.
Uwaga 2 : Dodam kolejny fragment kodu, który wkrótce zobrazuje twoje rozwiązanie do kolorowania.
Uwaga 3 : Nie widziałem przedstawionych algorytmów losowego kolorowania, co jest takie fajne w PPCG! Gdyby jednak ktoś mógł zastosować bardziej deterministyczny algorytm, byłoby to również bardzo fajne.
źródło
5
je4
i ponownie przesłać.Odpowiedzi:
Python 2 , 96 bajtów
Wypróbuj online!
Dane wejściowe są płaskie, więc znalezienie 4 kolorów jest zawsze możliwe.
(Tak więc: znajduje to w pewnym sensie najwcześniejsze leksykograficzne zabarwienie i robi to bardzo nieefektywnie).
źródło
JavaScript (ES7),
807674 bajtówZaoszczędź 2 bajty dzięki @Neil
Takie samo podejście jak Lynn . Rozwiązuje 4 kolory, ponumerowane od 0 do 3 .
Wypróbuj online!
źródło
x>>n+n&3
?Brachylog , 38 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 , 211 bajtów
Wypróbuj online!
Deterministyczny! Prawdopodobnie zawiódłby w bardziej skomplikowanych przypadkach testowych, ale jestem zbyt wypalony, by znaleźć wykres, dla którego zawodzi. Więcej przypadków testowych i. Lub krytyka mile widziane!
źródło
Czysty , 139 bajtów
Wypróbuj online!
Generuje wszystkie kolory i zwraca pierwszy prawidłowy.
źródło
Galaretka , 23 bajty
Wypróbuj online!
Brutalna siła. Zakłada, że węzły są oznaczone liczbami całkowitymi.
źródło