Це одне з декількох викликів, які залишаються перед громадою захопленнями Кальвіна .
Візьміть файл "опис родинного дерева" з рядками форми:
[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
Напишіть програму або функцію, яка містить ім'я файлу та два ідентифікатори та виводить, як ці люди пов'язані з кров’ю найпростішими словами, використовуючи загальні англійські імена для відносин. Вхід може бути через аргументи STDIN, ARGV або функції, але вихід повинен бути STDOUT.
Примітки
- Ідентифікатори - натуральні цілі числа.
?
застосовується, коли батьківство не відомо.- Припустимо, графік буде з’єднаний і не має циклів.
- Ви можете не припускати, що батьки кожної людини перелічені перед цією особою (тому батьківський ідентифікатор людини може бути більшим, ніж їх власний ідентифікатор).
- Припустимо, що кожен є або чоловіком, або жінкою, і кожен має рівно одну матір та рівно одного батька (правильної статі), хоча вони можуть бути невідомими.
- Припустимо, імена унікальні.
- Імена можуть мати пробіли в них.
Кровні відносини
Наступні визначення відносин R визначити , якщо людина є R або особа Б . Якщо два варіанти R перераховані, у - перших, жінка А , а другий для чоловічої A . Все це потрібно реалізувати. Якщо декілька визначень збігаються, слід використовувати попереднє. Терміни в дужках - це гендерно нейтральні терміни, які не потрібно реалізовувати, але будуть повторно використані в подальших визначеннях. У визначеннях, що включають N і M , припустимо N> 1 і M> 0 .
- дочка / син: А перераховує Б як одного з батьків.
- мати / батько (батько): Б перераховує " А" як батька.
- сестра / брат (брат і сестра): А та Б перераховують одних і тих же матері та батька.
- напівсестра / напівбрат (брат і сестра): А та Б перераховують ту саму матір або того самого батька.
- племінниця / племінник: А списки батьків , який є родичем B .
- тітка / дядько: В це «племінниця або племінник.
- внучка / онук (онук): А перераховується батько, який перелічує Б як свого батька.
- бабуся / дідусь (прабатько): У цей внучат «и.
- внучата племінниця / внучатий племінник: є онуком C , який є сестринським B .
- велика тітка / пра-дядько: Б - це племінниця А чи пра-племінник.
- правнучка / син (1-й правнук): А - онук С, який перераховує В як свого батька.
- прабабуся / батько (перший великий-прабатько): У цей перший правнук «s.
- N-та правнучка / син (Nth правнук): A - (N-1) -й онук C, який перелічує B як свого батька.
- Nth прабабуся / батько (Nth прадідів): B є Nth правнук «s.
- N - й внучата племінниця / племінник: є (N-1) -го правнук C , який є родичем B .
- Nth двоюрідна тітка / дядько: B є «s Nth внучата племінниця N - го двоюрідного племінника.
- кузен: є онуком C , який є прабатьком B .
- N - перший кузен: є (N-1) -го онуком C , який є (N-1) -го прабатьком B .
- кузен, М раз видалений: є онуком C , який є Mth прабатьком B або є Mth онуком C , який є прабатьком B .
- N-ї двоюрідний брат, М-раз видалений: A - П-й правнук С, який є 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
Тоді вхідні ідентифікатори повинні відображати виходи таким чином:
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.
Я написав їх вручну, тому повідомте мені, якщо ви помітили якісь помилки.
Інший набір тестових даних (надається Скоттом Лідлі, будь-які помилки є моїми, а не Мартинськими) Родинне
дерево Птолемея
Малюнок ілюстративний; наведені нижче дані походять із статті Вікіпедії " Династія Птолемеїв ".
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