Normalizza la mia mappa delle decisioni


11

Scrivi una funzione o un programma che elabora un blocco di testo e restituisce il nuovo testo. Vince il programma più piccolo valido.

Ogni riga nel blocco di testo avrà il seguente formato:

12:34,56

Il primo numero è l'ID linea, gli altri due numeri separati da virgola sono riferimenti ad altre linee.

Nel testo di input i numeri possono essere qualsiasi numero intero maggiore o uguale a 0. Tutti i numeri saranno decimali con codifica ASCII senza zeri iniziali. Non ci saranno ID riga duplicati. Non ci saranno riferimenti a ID linea inesistenti, sebbene possano esserci ID linea a cui non si fa riferimento.

Nel testo di output la riga con il numero più basso verrà spostata all'inizio del blocco di testo e rinumerata in 0. Anche eventuali riferimenti a questa riga devono essere aggiornati. Il primo riferimento su quella riga deve essere 0 o 1. Il secondo riferimento può essere 2 solo se il primo riferimento è 1. Altrimenti deve essere 0 o 1.

Tutte le righe devono essere in ordine crescente, crescente (senza numeri saltati). Puoi avere un riferimento alla riga n solo se c'è stato un riferimento precedente alla riga n-1 o se l'ID riga corrente è n. Non devono essere presenti righe a cui non viene fatto riferimento un ID riga inferiore ad eccezione della riga 0. Qualsiasi riga di questo tipo deve essere rimossa prima dell'output finale.

Si può presumere che il testo di input sia sempre nel formato corretto.

Ingresso di prova n. 1:

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

riordinata:

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

rinumerato:

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

Linee senza riferimento rimosse per l'output finale:

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

Naturalmente, il tuo programma non deve seguire questo ordine, ma solo produrre l'output corretto. L'output deve essere un singolo blocco di testo o l'equivalente più vicino nella tua lingua, ovvero nessun output diretto carattere per carattere. È possibile restituirlo (preferito) o emettere direttamente l'intero blocco. Supponiamo che l'output venga passato a un'altra funzione o programma.

Test input # 2

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

Produzione:

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

Test input # 3

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

Produzione:

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

Risposte:


1

Python 3 , 226 215 211 209 179 byte

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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.