Questa è una delle tante sfide lasciate per la comunità dai Calvin's Hobbies .
Prendi un file "albero genealogico che descrive" con le righe del modulo:
[ID] [mother ID] [father ID] [gender] [full name]
come questo che descrive il primo albero genealogico su 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
Scrivi un programma o una funzione che includa il nome del file e due ID e mostri come queste persone sono legate al sangue in termini più semplici, usando i nomi inglesi comuni per le relazioni. L'input può essere tramite STDIN, ARGV o argomenti della funzione ma l'output dovrebbe essere su STDOUT.
Gli appunti
- Gli ID sono numeri interi positivi.
?
viene utilizzato quando la parentela non è nota.- Supponiamo che il grafico sia collegato e non abbia cicli.
- Si può non supporre che i genitori di ogni persona sono elencati prima che la persona (in modo di una persona ID genitore potrebbe essere maggiore di loro ID).
- Supponiamo che ognuno sia maschio o femmina e che tutti abbiano esattamente una madre e esattamente un padre (di genere corretto), sebbene possano essere sconosciuti.
- Supponiamo che i nomi siano univoci.
- I nomi possono contenere spazi.
Relazioni di sangue
Le seguenti definizioni di relazioni R determinare se persona A è la R o la persona B . Se due varianti di R sono elencati, il primo è femmina A e il secondo per il maschio A . Tutti questi devono essere implementati. Se più definizioni corrispondono, deve essere utilizzata la prima. I termini tra parentesi sono termini neutri rispetto al genere, che non devono essere implementati ma saranno riutilizzati in ulteriori definizioni. Nelle definizioni che coinvolgono N e M , assumere N> 1 e M> 0 .
- figlia / figlio: A elenca B come uno dei genitori.
- madre / padre (genitore): B elenca A come uno dei genitori.
- sorella / fratello (fratello): A e B elencano la stessa madre e lo stesso padre.
- sorellastra / fratellastro (fratello): A e B elencano la stessa madre o lo stesso padre.
- nipote / nipote: A liste un genitore che è il fratello di B .
- zia / zio: B è la nipote o il nipote di A.
- nipote / nipote (nipote): A elenca un genitore che elenca B come genitore.
- nonna / nonno (nonno): B è il nipote di A.
- pronipote / pronipote: A è il nipote di C che è il fratello di B .
- prozia / prozio: B è il pronipote o pronipote di A.
- pronipote / figlio (1 ° pronipote): A è un nipote di C che elenca B come genitore.
- bisnonna / padre (1 ° bisnonno): B è il 1 ° pronipote di A.
- Nono pronipote / figlio (Nth pronipote): A è un (N-1) nipote di C che elenca B come genitore.
- Nona bisnonna / padre (N bis bisnonno): B è l'ennesima pronipote di A.
- Ennesimo pronipote / nipote: A è la (N-1) th pronipote di C che è il fratello di B .
- Ennesimo prozia / zio: B è una s' ennesimo pronipote della N ° pronipote.
- cugino: A è il nipote di C che è il nonno di B .
- Cugino Ennesimo: A è la (N-1) esimo nipote di C che è il (N-1) esimo nonni di B .
- cugino, M volte rimossi: A è il nipote di C che è il nonno Mth di B o A è il nipote Mth di C che è il nonno di B .
- N ° cugino, M volte rimosso: A è il nipote pronipote di C che è il quinto bisnonno di B , dove
N = min(P,Q) + 1
eM = |P-Q|
.
Per Nth
, scrittura 2nd
, 3rd
, 4th
, 5th
etc.
Per M times
, scrittura once
, twice
, thrice
, 4 times
, 5 times
etc.
Esempi
Supponiamo che venga utilizzato il seguente file (non è necessario essere in grado di gestire più spazi, ma li ho aggiunti per leggibilità):
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
Quindi gli ID di input devono essere mappati agli output come segue:
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.
Le ho scritte a mano, quindi fatemi sapere se individuate degli errori.
Un'altra serie di dati di test (forniti da Scott Leadley, eventuali errori sono miei e non di Martin)
Albero genealogico di Tolomeo
L'immagine è illustrativa; i dati seguenti provengono dall'articolo di Wikipedia " Dinastia tolemaica ".
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