Normalizuj moją mapę decyzji

11

Napisz funkcję lub program, który przetwarza blok tekstu i zwraca nowy tekst. Najmniejszy ważny program wygrywa.

Każdy wiersz w bloku tekstu będzie miał następujący format:

12:34,56

Pierwsza liczba to identyfikator linii, pozostałe dwie liczby oddzielone przecinkami są odniesieniami do innych linii.

W tekście wejściowym liczby mogą być dowolnymi liczbami całkowitymi większymi lub równymi 0. Wszystkie liczby będą zapisywane dziesiętnie w kodzie ASCII bez zer wiodących. Nie będzie duplikatów identyfikatorów linii. Nie będzie żadnych odniesień do nieistniejących identyfikatorów linii, chociaż mogą istnieć identyfikatory linii, do których nie ma odniesienia.

W tekście wyjściowym linia o najniższym numerze zostanie przeniesiona na początek bloku tekstowego i numerowana na 0. Wszelkie odniesienia do tej linii również muszą zostać zaktualizowane. Pierwsze odniesienie w tej linii musi wynosić 0 lub 1. Drugie odniesienie może wynosić 2, jeśli pierwsze odniesienie to 1. W przeciwnym razie musi to być 0 lub 1.

Wszystkie wiersze muszą być w porządku rosnącym, rosnącym (bez pomijanych liczb). Możesz mieć odniesienie do linii n, jeśli wcześniej było odniesienie do linii n-1 lub bieżący identyfikator linii to n. Nie mogą istnieć żadne wiersze, do których nie odwołują się dolne identyfikatory linii, z wyjątkiem linii 0. Wszelkie takie linie muszą zostać usunięte przed końcowym wyjściem.

Możesz założyć, że tekst wejściowy ma zawsze poprawny format.

Wejście testowe nr 1:

45:73,24
78:24,78
89:24,73
73:45,3
72:3,24
3:24,24
24:3,89

Porządek:

3:24,24
24:3,89
89:24,73
73:45,3
45:73,24
78:24,78
72:3,24

Przenumerowano:

0:1,1
1:0,2
2:1,3
3:4,0
4:3,1
78:1,78
72:0,1

Usunięto niepowiązane linie dla ostatecznego wyniku:

0:1,1
1:0,2
2:1,3
3:4,0
4:3,1

Oczywiście twój program nie musi przestrzegać tej kolejności, wystarczy wygenerować poprawne wyjście. Wynik musi być pojedynczym blokiem tekstu lub najbliższym odpowiednikiem w twoim języku, tzn. Nie powinien być bezpośrednio zapisywany znak po znaku. Możesz go zwrócić (preferowane) lub wyprowadzić bezpośrednio cały blok. Załóż, że dane wyjściowe zostaną przekazane do innej funkcji lub programu.

Wejście testowe nr 2

5:2,3
7:3,2
2:4,2
4:2,3
3:4,3

Wynik:

0:1,0
1:0,2
2:1,2

Wejście testowe nr 3

7:6,3
3:9,7
9:7,3
2:9,6
6:6,7

Wynik:

0:1,2
1:3,4
2:2,3
3:2,4
4:1,3
CJ Dennis
źródło

Odpowiedzi:

1

Python 3 , 226 215 211 209 179 bajtów

def f(s):
 S=dict(map(eval,i.split(":"))for i in s.split("\n"));r="";L=[min(S)];i=0
 while L[i:]:a=S[L[i]];L+=set(a)-set(L);r+="%%d:%d,%d\n"%tuple(map(L.index,a))%i;i+=1
 return r

Wypróbuj online!

Leaky Nun
źródło