Нормализуй мою карту решений

11

Напишите функцию или программу, которая обрабатывает блок текста и возвращает новый текст. Наименьшая действительная программа выигрывает.

Каждая строка в блоке текста будет иметь следующий формат:

12:34,56

Первое число - это идентификатор строки, остальные два числа, разделенные запятыми, - это ссылки на другие строки.

Во входном тексте числа могут быть любым целым числом, большим или равным 0. Все числа будут в десятичном формате ASCII без начальных нулей. Не будет повторяющихся идентификаторов строк. Не будет ссылок на несуществующие идентификаторы строк, хотя могут быть идентификаторы строк, на которые нет ссылок.

В выходном тексте строка с наименьшим номером будет перемещена в начало текстового блока и перенумерована в 0. Любые ссылки на эту строку также должны быть обновлены. Первая ссылка в этой строке должна быть 0 или 1. Вторая ссылка может быть только 2, если первая ссылка равна 1. В противном случае это должно быть 0 или 1.

Все строки должны быть в возрастающем, возрастающем порядке (без пропущенных номеров). Ссылка на строку n может быть только в том случае, если ранее была ссылка на строку n-1 или идентификатор текущей строки равен n. Не должно быть никаких строк, на которые не ссылаются идентификаторы нижней строки, кроме строки 0. Любые такие строки должны быть удалены до окончательного вывода.

Вы можете предположить, что вводимый текст всегда в правильном формате.

Тестовый вход № 1:

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

переупорядоченные:

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

Перенумерован:

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

Строки без ссылок удаляются для окончательного вывода:

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

Конечно, ваша программа не должна следовать этому порядку, просто выведите правильный вывод. Выходные данные должны быть единым блоком текста или ближайшим эквивалентом на вашем языке, т. Е. Прямой посимвольный вывод отсутствует. Вы можете либо вернуть его (предпочтительно), либо вывести весь блок напрямую. Предположим, что ваш вывод будет передан другой функции или программе.

Тестовый ввод № 2

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

Выход:

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

Тестовый вход № 3

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

Выход:

0:1,2
1:3,4
2:2,3
3:2,4
4:1,3
CJ Деннис
источник

Ответы:

1

Python 3 , 226 215 211 209 179 байт

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

Попробуйте онлайн!

Дрянная Монахиня
источник