Wprowadzenie
W tym wyzwaniu otrzymujesz ukierunkowany wykres z pętlami własnymi, a Twoim zadaniem jest przekonwertowanie go na wykres bezkierunkowy bez pętli własnych.
Wejście
Twoje dane wejściowe są skierowanym wykresem z ustawionym wierzchołkiem {0, 1, ..., n-1}
dla pewnej liczby naturalnej n ≥ 0
(lub {1, 2, ..., n}
jeśli korzystasz z indeksowania 1). Wykres jest podany jako n
lista długości, L
gdzie L[i]
znajduje się lista sąsiadów wierzchołka i
. Na przykład lista [[0,1],[0],[1,0,3],[]]
przedstawia wykres
.-.
| v
'-0<--2-->3
^ |
| |
v |
1<--'
Zauważ, że listy sąsiadów niekoniecznie są uporządkowane, ale gwarantują, że są wolne od duplikatów.
Wynik
Twój wynik to kolejny wykres w tym samym formacie co dane wejściowe, uzyskane z niego w następujący sposób.
- Usuń wszystkie pętle własne.
- Dla każdej pozostałej krawędzi
u -> v
dodaj odwróconą krawędź,v -> u
jeśli jeszcze nie jest obecna.
Podobnie jak w przypadku danych wejściowych, listy sąsiadów wykresu wyjściowego mogą być nieuporządkowane, ale nie mogą zawierać duplikatów. Dla powyższego wykresu byłby prawidłowy wynik [[1,2],[0,2],[0,1,3],[2]]
, który przedstawia wykres
0<->2<->3
^ ^
| |
v |
1<--'
Zasady
Na wykresach można użyć indeksowania opartego na 0 lub 1. Zarówno funkcje, jak i pełne programy są dopuszczalne. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
Te przypadki testowe wykorzystują indeksowanie oparte na 0; zwiększaj każdą liczbę w przypadku 1. Te listy sąsiadów są sortowane w porządku rosnącym, ale nie jest to wymagane.
[] -> []
[[0]] -> [[]]
[[],[0,1]] -> [[1],[0]]
[[0,1],[]] -> [[1],[0]]
[[0,1],[0],[1,0,3],[]] -> [[1,2],[0,2],[0,1,3],[2]]
[[3],[],[5],[3],[1,3],[4]] -> [[3],[4],[5],[0,4],[1,3,5],[2,4]]
[[0,1],[6],[],[3],[3],[1],[4,2]] -> [[1],[0,5,6],[6],[4],[3,6],[1],[1,2,4]]
[[6],[0,5,1],[5,4],[3,5],[4],[5,6],[0,3]] -> [[1,6],[0,5],[4,5],[5,6],[2],[1,2,3,6],[0,3,5]]
[[1,0],[5,1],[5],[1],[5,7],[7,1],[],[1]] -> [[1],[0,3,5,7],[5],[1],[5,7],[1,2,4,7],[],[1,4,5]]
[[2,8,0,9],[5,2,3,4],[0,2],[3,7,4],[8,1,2],[5,1,9,2],[6,9],[6,5,2,9,0],[9,1,2,0],[3,9]] -> [[2,7,8,9],[2,3,4,5,8],[0,1,4,5,7,8],[1,4,7,9],[1,2,3,8],[1,2,7,9],[7,9],[0,2,3,5,6,9],[0,1,2,4,9],[0,3,5,6,7,8]]
.e
właśnie został zmieniony zk,Y
nak,b
, więc aby to uruchomić, użyj.e-.|f}k@QTUQbkQ
CJam,
4340353433 bajtów2 bajty zapisane przez Sp3000.
Zaczynało się to od naprawdę eleganckiego rozwiązania, a potem stawało się coraz bardziej ohydne, gdy próbowałem załatać dziury, które przeoczyłem. Nie jestem jeszcze pewien, czy oryginalny pomysł można jeszcze uratować, ale postaram się jak najlepiej ...
Sprawdź to tutaj. Alternatywnie uruchom całą wiązkę testową .
Dodam wyjaśnienie, gdy będę pewien, że pacjent nie żyje.
źródło
Python 2, 107 bajtów
Wciąż próbuję dowiedzieć się, czy mogę bardziej grać w golfa, ale na razie jest to najlepsze, co mogę zrobić.
Używam zestawów, aby zapobiec duplikatom; również, w przeciwieństwie do
list.remove(i)
,{S}-{i}
nie zgłasza błędu, jeśli goi
nie maS
.źródło
Rubinowy, 78 bajtów
Wreszcie niektóre zastosowania dla operatorów zbiorów Ruby (
[1,2]&[2]==[2]
i[3,4,5]-[4]==[3,5]
).ideone , w tym wszystkie przypadki testowe, które przekazuje.
źródło
CJam, 26 bajtów
Niezbyt krótki ...
Wyjaśnienie
źródło
JavaScript (ES6), 96
110Tworzenie zestawów sąsiedztwa z listy sąsiedztw, które pomagają unikać duplikatów. Na koniec odbudowuje listy, zaczynając od zestawów.
źródło
Java, 150
Rozszerzony, uruchamialny kod:
źródło
Groovy - 87
Pełny skrypt do uruchamiania testów:
źródło
Mathematica,
846664 bajtówKorzystanie z indeksowania 1.
źródło
Python 3, 127 bajtów
Wypróbuj online
Nie moja najlepsza próba ...
źródło