Esse é um dos vários desafios que a Calvin's Hobbies deixou para a comunidade .
Pegue um arquivo "descrevendo a árvore genealógica" com linhas do formulário:
[ID] [mother ID] [father ID] [gender] [full name]
como esta que descreve a primeira árvore genealógica em 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
Escreva um programa ou função que inclua o nome do arquivo e dois IDs e mostre como essas pessoas estão relacionadas ao sangue em termos mais simples, usando os nomes comuns em inglês para as relações. A entrada pode ser via STDIN, ARGV ou argumentos de função, mas a saída deve ser para STDOUT.
Notas
- IDs são números inteiros positivos.
?
é usado quando a paternidade não é conhecida.- Suponha que o gráfico esteja conectado e não possua ciclos.
- Você não pode presumir que os pais de cada pessoa estejam listados antes dessa pessoa (para que o ID dos pais de uma pessoa possa ser maior que o seu próprio ID).
- Suponha que todos sejam homens ou mulheres e todos tenham exatamente uma mãe e exatamente um pai (do gênero correto), embora possam ser desconhecidos.
- Suponha que os nomes sejam únicos.
- Os nomes podem ter espaços neles.
Relações de sangue
As seguintes definições de relações R determinar se a pessoa Um é o R ou pessoa B . Se duas variantes de R são listados, o primeiro é para fêmea Um e o segundo para o sexo masculino Uma . Tudo isso precisa ser implementado. Se várias definições corresponderem, a anterior deve ser usada. Os termos entre parênteses são de gênero neutro, que não precisam ser implementados, mas serão reutilizados em outras definições. Nas definições envolvendo N e M , assuma N> 1 e M> 0 .
- filha / filho: A lista B como pai ou mãe.
- mãe / pai (pai): B lista A como pai ou mãe.
- irmã / irmão (A): A e B listam a mesma mãe e pai.
- meia-irmã / meio-irmão (irmão): A e B listam a mesma mãe ou o mesmo pai.
- sobrinha / sobrinho: A lista de um pai que é o irmão de B .
- tia / tio: B é sobrinha ou sobrinho de A.
- neta / neto (neto): A lista um pai que lista B como pai.
- avó / avô (avô): B é o neto de A.
- grande-sobrinha / sobrinho-neto: Um é o neto de C que é o irmão de B .
- tia-avó / tio-avô: B é sobrinha-sobrinha ou sobrinho -avó de A.
- bisneta / filho (1º bisneto): A é um neto de C que lista B como pai ou mãe.
- bisavó / pai (1º bisavô): B é o 1º bisneto de A.
- Neta neta / filho (neta neto): A é um (N-1) neto de C que lista B como pai ou mãe.
- Enésimo bisavó / pai (Enésimo bisavô): B é o nono bisneto de A.
- Nth grande-sobrinha / sobrinho: Uma é a (N-1) th grande-neto de C que é o irmão de B .
- Nth tia-avó / tio: B é um 's Nth sobrinha-neta de Nth sobrinho-neto.
- primo: Um é o neto de C que é o avô de B .
- Primo Nth: Uma é a (N-1) th neto de C que é a (N-1) th avós de B .
- primo, vezes M removido: Um é o neto de C que é a avó Mth de B ou A é o neto Mth de C que é a avó de B .
- Primo enésimo, M vezes removido: A é o quinto bisneto de C e é o quinto bisavô de B , onde
N = min(P,Q) + 1
eM = |P-Q|
.
Para Nth
, gravação 2nd
, 3rd
, 4th
, 5th
etc.
Para M times
, gravação once
, twice
, thrice
, 4 times
, 5 times
etc.
Exemplos
Suponha que o seguinte arquivo seja usado (você não precisa lidar com vários espaços, mas eu os adicionei para legibilidade):
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
Em seguida, os IDs de entrada devem ser mapeados para as saídas da seguinte maneira:
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.
Eu os escrevi à mão, então, deixe-me saber se você encontrar algum erro.
Outro conjunto de dados de teste (fornecidos por Scott Leadley, quaisquer erros são meus e não de Martin).
Árvore genealógica Ptolomeu
A imagem é ilustrativa; os dados abaixo são provenientes do artigo da Wikipedia " Dinastia ptolemaica ".
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