Normalisiere meine Entscheidungskarte

11

Schreiben Sie eine Funktion oder ein Programm, das einen Textblock verarbeitet und den neuen Text zurückgibt. Das kleinste gültige Programm gewinnt.

Jede Zeile im Textblock hat das folgende Format:

12:34,56

Die erste Nummer ist die Zeilen-ID, die anderen beiden durch Kommas getrennten Nummern verweisen auf andere Zeilen.

Im Eingabetext können die Zahlen eine beliebige Ganzzahl größer oder gleich 0 sein. Alle Zahlen werden in ASCII-codierter Dezimalzahl ohne führende Nullen angegeben. Es gibt keine doppelten Zeilen-IDs. Es gibt keine Verweise auf nicht vorhandene Zeilen-IDs, obwohl möglicherweise Zeilen-IDs vorhanden sind, auf die nicht verwiesen wird.

Im Ausgabetext wird die Zeile mit der niedrigsten Nummer an den Anfang des Textblocks verschoben und in 0 neu nummeriert. Alle Verweise auf diese Zeile müssen ebenfalls aktualisiert werden. Die erste Referenz in dieser Zeile muss 0 oder 1 sein. Die zweite Referenz kann nur 2 sein, wenn die erste Referenz 1 ist. Andernfalls muss sie 0 oder 1 sein.

Alle Zeilen müssen in aufsteigender, inkrementeller Reihenfolge sein (keine übersprungenen Zahlen). Sie können nur dann auf Zeile n verweisen, wenn zuvor auf Zeile n-1 verwiesen wurde oder die aktuelle Zeilen-ID n lautet. Mit Ausnahme von Zeile 0 dürfen keine Zeilen vorhanden sein, auf die nicht durch niedrigere Zeilen-IDs verwiesen wird. Solche Zeilen müssen vor der endgültigen Ausgabe entfernt werden.

Sie können davon ausgehen, dass der Eingabetext immer das richtige Format hat.

Testeingang Nr. 1:

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

Nachbestellt:

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

Neu nummeriert:

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

Nicht referenzierte Zeilen für die endgültige Ausgabe entfernt:

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

Natürlich muss Ihr Programm nicht dieser Reihenfolge folgen, sondern nur die richtige Ausgabe erzeugen. Die Ausgabe muss ein einzelner Textblock oder das nächstgelegene Äquivalent in Ihrer Sprache sein, dh keine zeichenweise direkte Ausgabe. Sie können es entweder zurückgeben (bevorzugt) oder den gesamten Block direkt ausgeben. Angenommen, Ihre Ausgabe wird an eine andere Funktion oder ein anderes Programm übergeben.

Testeingang Nr. 2

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

Ausgabe:

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

Testeingang Nr. 3

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

Ausgabe:

0:1,2
1:3,4
2:2,3
3:2,4
4:1,3
CJ Dennis
quelle

Antworten:

1

Python 3 , 226 215 211 209 179 Bytes

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

Probieren Sie es online aus!

Undichte Nonne
quelle