Cel
Posortuj listę elementów, upewniając się, że każdy element jest wymieniony po określonych zależnościach.
Wejście
Tablica tablic liczb całkowitych, gdzie każda liczba całkowita określa indeks innego elementu na podstawie 0 lub 1, po którym ten element musi nastąpić. Dane wejściowe mogą być tablicą lub ciągiem znaków lub czymkolwiek innym, możliwym do odczytania przez człowieka.
Na przykład wejście oparte na 0:
[
[ 2 ], // item 0 comes after item 2
[ 0, 3 ], // item 1 comes after item 0 and 3
[ ], // item 2 comes anywhere
[ 2 ] // item 3 comes after item 2
]
Załóżmy, że nie ma zależności cyklicznych, zawsze istnieje co najmniej jedno prawidłowe zamówienie.
Wynik
Liczby w kolejności zależności. Dwuznaczny porządek nie musi być deterministyczny. Wynik może być tablicą, tekstem lub czymkolwiek innym, czytelnym dla człowieka.
Dane wyjściowe powinny zawierać tylko jedno zamówienie, nawet jeśli istnieje wiele prawidłowych zamówień.
Możliwe wyniki dla powyższego wejścia obejmują:
[ 2, 3, 0, 1 ]
[ 2, 0, 3, 1 ]
Punktacja
Funkcja lub program, który wypełni to w najmniejszej liczbie bajtów, wygrywa chwałę akceptacji. Termin upływa za 6 dni.
Odpowiedzi:
Galaretka, 8 bajtów
Opiera się to na (niezaimplementowanym) podejściu do głębokości z odpowiedzi Python @ xnor .
Wypróbuj online!
Jak to działa
źródło
Pyth, 21 bajtów
Test:
źródło
Python 2, 73 bajty
Sortuje wierzchołki według ich liczby potomnej, która jest
f
obliczana rekurencyjnie. Jeśli wierzchołek wskazuje na inny wierzchołek, jego potomkowie obejmują wierzchołek spiczasty i wszystkich potomków tego wierzchołka, więc ma on znacznie więcej potomków. Tak więc jest on umieszczany później niż wskazany wierzchołek w porządku, zgodnie z potrzebami.Liczba potomków wierzchołka jest równa sobie, a liczba potomków każdego z jej dzieci. Zauważ, że potomek może być liczony wiele razy, jeśli prowadzi do niego wiele ścieżek.
Przydałby się również do użycia głębokości, a nie liczby potomków
z wyjątkiem tego,
max
że trzeba podać0
na pustej liście.źródło
Pyth, 19 bajtów
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
Bash, 35 bajtów
Przykładowy przebieg
We / Wy jest indeksowane 1. Każda tablica przechodzi w osobną linię, z białymi znakami jako separatorem elementów.
Jak to działa
tsort
- o czym dowiedziałem się w odpowiedzi na @ DigitalTrauma - odczytuje pary tokenów oddzielonych białymi spacjami, które wskazują częściowe uporządkowanie, i drukuje całkowite uporządkowanie (w postaci posortowanej listy wszystkich unikatowych tokenów), które rozszerza wspomniane częściowe uporządkowanie.Po wszystkich liczbach w określonej linii następuje spacja lub znak linii.
s/\s/ $. /g
Część komendy Perl zastępuje te białe znaki z przestrzeni, numer linii i innej przestrzeni, a tym samym upewniając się, że każda n na linii k poprzedza k .Wreszcie, jeśli linia jest pusta (tzn. Składa się tylko z linii),
s/^$/ /
wstawia do niej spację. W ten sposób drugie podstawienie zamienia pustą linię k wk k
, upewniając się, że każda liczba całkowita występuje co najmniej raz w ciągu, do którego jest przesyłany potoktsort
.źródło
tsort
lepiej / szybciej niż ja :) Dzięki za dodatkowe wyjaśnienia.Bash + coreutils,
2080Wprowadź jako linie oddzielone spacją, np .:
nl
dodaje do wszystkich wierszy indeksy zerowesed
dzieli listy zależności na proste pary zależności i uzależnia niepełne zależności od siebie.tsort
wykonuje wymagany rodzaj topologicznytac
ustawia wyjściową odwrotną kolejnośćIdeone. Ideone z walizką testową @Dennis
źródło
Python 2,
143118116 bajtówNieco bardziej losowe podejście.
Edycje:
źródło