这是加尔文的爱好给社区留下的几个挑战之一。
采取“形式描述的家谱”文件,其格式如下:
[ID] [mother ID] [father ID] [gender] [full name]
例如,它描述了http://en.wikipedia.org/wiki/Cousin上的第一棵家谱:
1 ? ? M Adam
2 ? ? F Agatha
3 ? ? M Bill
4 2 1 F Betty
5 2 1 M Charles
6 ? ? F Corinda
7 3 4 M David
8 6 5 F Emma
编写一个程序或函数,该程序或函数接受文件名和两个ID,并使用常见的英文名称来表达人们最简单的血缘关系。输入可以通过STDIN,ARGV或函数参数输入,但输出应该到STDOUT。
笔记
- ID是正整数。
?
当不知道父母身份时使用。- 假设图形将被连接并且没有循环。
- 您可能不会假定每个人的父母都在该人之前列出(因此,一个人的父母ID可能大于他们自己的ID)。
- 假设每个人都是男性或女性,并且每个人都有一个母亲和一个父亲(性别正确),尽管他们可能未知。
- 假设名称是唯一的。
- 名称中可以有空格。
血缘关系
关系的以下定义ř确定人阿是- [R或人乙。如果两个变体- [R列,第一个是对女性甲和第二男性甲。所有这些都需要实现。如果多个定义匹配,则使用较早的定义。括号中的术语是不分性别的术语,不需要执行,但将在进一步的定义中重复使用。在涉及N和M的定义中,假定N> 1和M> 0。
- 女儿/儿子:A将B列为父母。
- 母亲/父亲(父母):B列出A为父母双方。
- 姐妹/兄弟(姐妹):一个和乙列表相同的母亲和父亲。
- 同父异母或同母异父的兄弟姐妹:A和B列出同一位母亲或同一位父亲。
- 侄女/侄女:A列出了B的兄弟姐妹。
- 姨妈/叔叔:B是A的侄女或外phe。
- 孙女/孙子(孙子):A列出了一位父母,B列出了他们的父母。
- 祖母/祖父(祖父母):B是A的孙子。
- 大侄女/侄女:A是C的孙子,是B的兄弟姐妹。
- 大姨妈/叔叔伯:B是A的曾女侄女。
- 大孙女/儿子(第一个大孙女):A是C的孙子,他将B作为父母。
- 曾祖母/父亲(第一任曾祖父母):B是A的第一任曾孙。
- 第N个孙女/孙子(第N个曾孙):A是C的第(N-1)个孙子,他将B列为其父母。
- 第N个曾祖父/祖父(第N个曾祖父母):B是A的第N个曾孙。
- 第N个侄女/侄子:A是C的第N-1个曾孙,是B的兄弟姐妹。
- N个大姨妈/叔叔:B是A的N个大外great的第N个侄女。
- 表弟:A是C的孙,是B的祖父母。
- 第N个堂兄:A是C的第N-1个孙子,B的第N-1个祖父母。
- 表弟,已被M次删除:A是B的第M个祖父母的C的孙,或者A是B的祖父母的C的M个孙。
- 第N个表妹,去掉M倍:一个是第P曾孙Ç是谁的Q路曾祖乙,其中
N = min(P,Q) + 1
和M = |P-Q|
。
对于Nth
,写2nd
,3rd
,4th
,5th
等。
对于M times
,写once
,twice
,thrice
,4 times
,5 times
等。
例子
假设使用了以下文件(您不必能够处理多个空格,但是为了清楚起见,我添加了它们):
1 ? ? F Agatha
2 ? ? M Adam
3 ? ? F Betty
4 1 2 M Bertrand
5 1 2 F Charlotte
6 ? ? M Carl
7 ? ? F Daisy
8 3 4 M David
9 5 6 F Emma
10 ? ? M Edward
11 ? ? F Freya
12 7 8 M Fred
13 9 10 F Grace
14 ? ? M Gerald
15 ? ? F Hillary
16 11 12 M Herbert
17 13 14 F Jane
18 ? ? M James
19 15 16 F Kate
20 17 18 M Larry
21 ? 18 F Mary
然后,输入ID应映射到输出,如下所示:
1 2 --> Agatha is not a blood relative to Adam.
8 3 --> David is the son of Betty.
9 13 --> Emma is the mother of Grace.
4 5 --> Bertrand is the brother of Charlotte.
9 4 --> Emma is the niece of Bertrand.
5 8 --> Charlotte is the aunt of David.
16 7 --> Herbert is the grandson of Daisy.
1 9 --> Agatha is the grandmother Emma.
12 5 --> Fred is the great-nephew of Charlotte.
4 13 --> Bertrand is the great-uncle of Grace.
16 3 --> Herbert is the great-grandson of Betty.
6 17 --> Carl is the great-grandfather of Jane.
19 2 --> Kate is the 3rd great-granddaughter of Adam.
1 17 --> Agatha is the 2nd great-grandmother of Jane.
20 4 --> Larry is the 3rd great-nephew of Bertrand.
5 16 --> Charlotte is the 2nd great-aunt of Herbert.
8 9 --> David is the cousin of Emma.
19 20 --> Kate is the 4th cousin of Larry.
16 9 --> Herbert is the cousin, twice removed, of Emma.
12 17 --> Fred is the 2nd cousin, once removed, of Jane.
21 20 --> Mary is the half-sister of Larry.
我亲手写了这些,所以如果发现任何错误,请告诉我。
另一组测试数据(由Scott Leadley提供,任何错误都是我的,而不是Martin的)。
托勒密家谱
。以下数据来自维基百科文章“ 托勒密王朝 ”。
1 ? ? F Berenice I of Egypt
2 ? ? M Ptolemy I Soter
41 1 2 F Arsinoe II of Egypt
3 1 2 M Ptolemy II Philadelphus
4 ? ? F Arsinoe I of Egypt
5 ? ? M Philip
6 4 3 M Ptolemy III Euergetes
7 1 5 F Magas of Cyrene
8 7 ? F Berenice II
9 8 6 M Ptolemy IV Philopator
10 8 6 F Arsinoe III of Egypt
11 10 9 M Ptolemy V Epiphanes
12 ? ? F Cleopatra I of Egypt
13 12 11 M Ptolemy VI Philometor
14 12 11 F Cleopatra II
15 12 11 M Ptolemy VIII Physcon
19 ? ? F Eirene
16 14 13 M Ptolemy VII Neos Philopator
17 14 13 F Cleopatra III
18 14 15 M Ptolemy Memphites
20 19 15 M Ptolemy Apion
21 17 15 F Cleopatra IV
22 17 15 M Ptolemy IX Lathyros
23 17 15 F Cleopatra Selene I
24 17 15 M Ptolemy X Alexander I
25 23 22 F Berenice III of Egypt
26 23 24 M Ptolemy XI Alexander II
27 21 22 M Ptolemy XII Auletes
28 25 24 F Cleopatra V of Egypt
29 28 27 F Cleopatra VI of Egypt
30 28 27 F Berenice IV of Egypt
31 28 27 M Ptolemy XIII Theos Philopator
32 28 27 F Cleopatra VII Thea Philopator
33 28 27 M Ptolemy XIV
34 28 27 F Arsinoe IV of Egypt
35 ? ? M Julius Caesar
37 32 35 M Ptolemy XV Caesarion
36 ? ? M Mark Anthony
38 32 36 M Alexander Helios
39 32 36 M Ptolemy XVI Philadelphus
40 32 36 F Cleopatra Selene II