Normalizar mi mapa de decisión

11

Escriba una función o programa que procese un bloque de texto y devuelva el nuevo texto. El programa válido más pequeño gana.

Cada línea en el bloque de texto tendrá el siguiente formato:

12:34,56

El primer número es la ID de línea, los otros dos números separados por comas son referencias a otras líneas.

En el texto de entrada, los números pueden ser cualquier número entero mayor o igual a 0. Todos los números estarán en decimal codificado en ASCII sin ceros a la izquierda. No habrá identificadores de línea duplicados. No habrá referencias a ID de línea inexistentes, aunque puede haber ID de línea a las que no se haga referencia.

En el texto de salida, la línea con el número más bajo se moverá al inicio del bloque de texto y se volverá a numerar a 0. Cualquier referencia a esta línea también debe actualizarse. La primera referencia en esa línea debe ser 0 o 1. La segunda referencia solo puede ser 2 si la primera referencia es 1. De lo contrario, debe ser 0 o 1.

Todas las líneas deben estar en orden ascendente e incremental (sin números omitidos). Solo puede tener una referencia a la línea n si ha habido una referencia previa a la línea n-1 o si la ID de la línea actual es n. No debe haber líneas a las que no hagan referencia las ID de línea inferiores, excepto la línea 0. Dichas líneas deben eliminarse antes de la salida final.

Puede suponer que el texto de entrada siempre está en el formato correcto.

Entrada de prueba n. ° 1:

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

Reordenado:

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

Renumerado:

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

Líneas sin referencia eliminadas para la salida final:

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

Por supuesto, su programa no tiene que seguir este orden, solo producir el resultado correcto. La salida debe ser un solo bloque de texto o el equivalente más cercano en su idioma, es decir, sin salida directa de carácter por carácter. Puede devolverlo (preferido) o generar el bloque completo directamente. Suponga que su salida será pasada a otra función o programa

Entrada de prueba n. ° 2

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

Salida:

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

Entrada de prueba n. ° 3

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

Salida:

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

Respuestas:

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

Pruébalo en línea!

Monja permeable
fuente