归一化我的决策图


11

编写处理文本块并返回新文本的函数或程序。最小的有效程序获胜。

文本块中的每一行将具有以下格式:

12:34,56

第一个数字是行ID,其他两个逗号分隔的数字是对其他行的引用。

在输入文本中,数字可以是大于或等于0的任何整数。所有数字将以ASCII编码的十进制表示,且不带前导零。不会有重复的行ID。尽管可能存在未引用的行ID,但不会引用不存在的行ID。

在输出文本中,编号最小的行将移至文本块的开头,并重新编号为0。对此行的所有引用也必须更新。该行上的第一个引用必须为0或1。如果第一个引用为1,则第二个引用只能为2。否则,它必须为0或1。

所有行必须按升序,升序排列(没有跳过的数字)。如果先前已有对第n-1行的引用或当前行ID为n,则只能对第n行进行引用。除第0行外,不得存在所有未由低行ID引用的行。必须在最终输出之前删除所有此类行。

您可以假设输入文本始终采用正确的格式。

测试输入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

Answers:


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

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.