Фон:
МтДНК - це частина людської ДНК, яка передається від матері дитині і рідко мутує. Оскільки це справедливо для всіх людей, можна створити величезне дерево, яке візуалізує, як усі люди пов’язані один з одним через материнську родину аж до гіпотетичного ЄВРО. Кожна мутація в MtDNA, коли народиться дитина, створює нову підгалузь із своєї материнської гілки на дереві.
Дізнайтеся більше про мітохондріальну ДНК (mtDNA) тут: https://en.wikipedia.org/wiki/Mitochondrial_DNA
Мета:
Вашій програмі подається список кількості мутацій гілок дерев mtDNA, і ваша програма повинна надавати їй вид дерева
Приклад введення та виведення:
Вхідна таблиця розділена на три колонки з двокрапкою з двокрапкою з рядком для кожної гілки. Приклад:
L0a'b'f'k;L0;14
L0a'b'f;L0a'b'f'k;23
L0;mtEVE;10
L0a'b;L0a'b'f;30
L0a;L0a'b;38
L0a1'4;L0a;39
L0a1;L0a1'4;40
L0a1a;L0a1;42
L0a1a NL;L0a1a;43
L0a1a1;L0a1a NL;44
L0a1a2;L0a1a NL;45
L0a1a3;L0a1a NL;44
L0a1 NL;L0a1;41
L0a1b;L0a1 NL;44
L0a1b NL;L0a1b;45
L0a1b1;L0a1b NL;46
L0a1b1a;L0a1b1;47
L0a1b1a1;L0a1b1a;48
L0a1b2;L0a1b NL;48
L0a1b2a;L0a1b2;50
L0a1c;L0a1 NL;45
L0a1d;L0a1 NL;44
L0a4;L0a1'4;55
L0a2;L0a;47
L0a2a;L0a2;49
L0a2a1;L0a2a;50
L0a2a1a;L0a2a1;51
L0a2a1a1;L0a2a1a;53
L0a2a1a2;L0a2a1a;53
L0a2a2;L0a2a;53
L0a2a2a;L0a2a2;54
L0a2b;L0a2;57
L0a2b1;L0a2b;58
L0a2c;L0a2;60
L0a2d;L0a2;49
L0a3;L0a;53
L0b;L0a'b;48
L0f;L0a'b'f;37
L0f1;L0f;61
L0f2;L0f;41
L0f2a;L0f2;46
L0f2a1;L0f2a;59
L0f2b;L0f2;63
L0k;L0a'b'f'k;39
L0k1;L0k;48
L0k2;L0k;54
L0d;L0;21
L0d1'2;L0d;25
L0d1;L0d1'2;30
L0d1 NL;L0d1;31
L0d1a;L0d1 NL;38
L0d1a1;L0d1a;41
L0d1c;L0d1 NL;39
L0d1c1;L0d1c;45
L0d1c1a;L0d1c1;46
L0d1c1b;L0d1c1;46
L0d1b;L0d1 NL;36
L0d1b1;L0d1b;40
L0d2;L0d1'2;31
L0d2a'b;L0d2;32
L0d2a;L0d2a'b;42
L0d2a1;L0d2a;43
L0d2b;L0d2a'b;46
L0d2c;L0d2;45
L0d3;L0d;39
Ваша програма повинна виводити дерево зліва направо, включаючи деякі цифри на основі вхідних даних. Виходячи з прикладу введення, це дійсний вихід:
0│ ┐ mtEVE [ 0][ 63]
10│ └♦♦♦♦♦♦♦♦♦┬────────────────┬─────────────────────────────────── L0 [ 10][ 63]
21│ │ └♦♦♦♦♦♦♦♦♦♦┬──────┬───────────────── L0d [ 11][ 46]
39│ │ │ └♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦ L0d3 [ 18][ 39]
25│ │ └♦♦♦┐ L0d1'2 [ 4][ 46]
30│ │ ├♦♦♦♦┬─────────────── L0d1 [ 5][ 46]
31│ │ │ └┬────┬┐ L0d1 NL [ 1][ 46]
36│ │ │ │ │└♦♦♦♦┬─── L0d1b [ 5][ 40]
40│ │ │ │ │ └♦♦♦ L0d1b1 [ 4][ 40]
38│ │ │ │ └♦♦♦♦♦♦┬── L0d1a [ 7][ 41]
41│ │ │ │ └♦♦ L0d1a1 [ 3][ 41]
39│ │ │ └♦♦♦♦♦♦♦┬────── L0d1c [ 8][ 46]
45│ │ │ └♦♦♦♦♦┬ L0d1c1 [ 6][ 46]
46│ │ │ ├ L0d1c1a [ 1][ 46]
46│ │ │ └ L0d1c1b [ 1][ 46]
31│ │ └♦♦♦♦♦┬┬───────────── L0d2 [ 6][ 46]
45│ │ │└♦♦♦♦♦♦♦♦♦♦♦♦♦ L0d2c [ 14][ 45]
32│ │ └┬──┐ L0d2a'b [ 1][ 46]
42│ │ │ └♦♦♦♦♦♦♦♦♦┬ L0d2a [ 10][ 43]
43│ │ │ └ L0d2a1 [ 1][ 43]
46│ │ └♦♦♦♦♦♦♦♦♦♦♦♦♦ L0d2b [ 14][ 46]
14│ └♦♦♦┬────────┐ L0a'b'f'k [ 4][ 63]
39│ │ └♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦┬─────┬──────── L0k [ 25][ 54]
48│ │ │ └♦♦♦♦♦♦♦♦ L0k1 [ 9][ 48]
54│ │ └♦♦♦♦♦♦♦♦♦♦♦♦♦♦ L0k2 [ 15][ 54]
23│ └♦♦♦♦♦♦♦♦┬──┐ L0a'b'f [ 9][ 63]
30│ │ └♦♦♦♦♦♦┬───────────┐ L0a'b [ 7][ 60]
48│ │ │ └♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦ L0b [ 18][ 48]
38│ │ └♦♦♦♦♦♦♦┬────┬─┬────────────── L0a [ 8][ 60]
53│ │ │ │ └♦♦♦♦♦♦♦♦♦♦♦♦♦♦ L0a3 [ 15][ 53]
39│ │ │ └┬────┐ L0a1'4 [ 1][ 55]
40│ │ │ │ └┬────┬──── L0a1 [ 1][ 50]
42│ │ │ │ │ └♦┬── L0a1a [ 2][ 45]
43│ │ │ │ │ └┬┐ L0a1a NL [ 1][ 45]
44│ │ │ │ │ │├ L0a1a1 [ 1][ 44]
44│ │ │ │ │ │└ L0a1a3 [ 1][ 44]
45│ │ │ │ │ └♦ L0a1a2 [ 2][ 45]
41│ │ │ │ └┬────┬┐ L0a1 NL [ 1][ 50]
44│ │ │ │ │ │└♦♦ L0a1d [ 3][ 44]
45│ │ │ │ │ └♦♦♦ L0a1c [ 4][ 45]
44│ │ │ │ └♦♦┬───── L0a1b [ 3][ 50]
45│ │ │ │ └┬─┐ L0a1b NL [ 1][ 50]
46│ │ │ │ │ └┬─ L0a1b1 [ 1][ 48]
47│ │ │ │ │ └┬ L0a1b1a [ 1][ 48]
48│ │ │ │ │ └ L0a1b1a1 [ 1][ 48]
48│ │ │ │ └♦♦┬─ L0a1b2 [ 3][ 50]
50│ │ │ │ └♦ L0a1b2a [ 2][ 50]
55│ │ │ └♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦ L0a4 [ 16][ 55]
47│ │ └♦♦♦♦♦♦♦♦┬─┬───┬────┬─ L0a2 [ 9][ 60]
49│ │ │ │ │ └♦ L0a2d [ 2][ 49]
49│ │ │ │ └♦┬┬─── L0a2a [ 2][ 54]
50│ │ │ │ │└┬── L0a2a1 [ 1][ 53]
51│ │ │ │ │ └┬─ L0a2a1a [ 1][ 53]
53│ │ │ │ │ ├♦ L0a2a1a1 [ 2][ 53]
53│ │ │ │ │ └♦ L0a2a1a2 [ 2][ 53]
53│ │ │ │ └♦♦♦┬ L0a2a2 [ 4][ 54]
54│ │ │ │ └ L0a2a2a [ 1][ 54]
57│ │ │ └♦♦♦♦♦♦♦♦♦┬ L0a2b [ 10][ 58]
58│ │ │ └ L0a2b1 [ 1][ 58]
60│ │ └♦♦♦♦♦♦♦♦♦♦♦♦ L0a2c [ 13][ 60]
37│ └♦♦♦♦♦♦♦♦♦♦♦♦♦┬─┬─────────────────────── L0f [ 14][ 63]
61│ │ └♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦ L0f1 [ 24][ 61]
41│ └♦♦♦┬───┬───────────────── L0f2 [ 4][ 63]
46│ │ └♦♦♦♦┬──────────── L0f2a [ 5][ 59]
59│ │ └♦♦♦♦♦♦♦♦♦♦♦♦ L0f2a1 [ 13][ 59]
63│ └♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦♦ L0f2b [ 22][ 63]
Введення: Деталі
Таблиця введення не сортується в конкретному порядку. Якщо ми випадковим чином упорядкуємо вхідні рядки, вихід повинен залишитися колишнім.
Кожен рядок на вході представляє гілку дерева мтДНК або гіпотетичну гілку дерева. Таблиця введення може бути будь-якою кількістю рядків довжиною.
Введення: Деталі - стовпець А (назва гілки):
Перший стовпець - це фактична назва гілки. Назва розділяє вхідні рядки на 2 групи типів рядків, які слід обробляти різними (поясненими пізніше) один від одного:
- Тип 1: Ім'я складається з будь-якого
'
або суфіксаNL
- Тип 2: Ім'я не складається з
'
суфіксуNL
.
Назва може мати довжину до 20 символів.
Вхідні дані: Деталі - стовпець B (назва батьківської гілки):
Другий стовпець містить вказівник на назву батьківської гілки. Кілька ліній (гілок) можуть спільно використовувати один і той же батьків. У таблиці введення завжди є точно 1 окрема назва батьківської гілки, яка вказує на батьків, який не представлений серед вхідних рядків, це назва гілки батьків є коренем для дерева. У прикладі введення , який третя лінія , яка вказує на корінь: mtEVE
. Якщо вхід має більше одного кореня або нескінченних циклів, це неправильний вхід.
Вхідні дані: Деталі - стовпець С (кількість мутацій):
Третій стовпець - це загальна кількість мутацій, яку конкретна гілка підрахувала від кореня. Людська мтДНК не мутувала більше ніж 100 разів за один рядок від гіпотетичного материнського кореня (предка людини / шимпанзе EVE), але ваша програма повинна мати можливість обробляти 3-х цифрний номер # мутації до 999.
З вхідних даних ви можете обчислити гілку # унікальних мутацій, відстеживши її # мутації від батьківського # мутацій.
Вихід: Деталі
Ваша програма повинна вивести 1 з 3-х різних повідомлень про помилки, якщо вхід недійсний відповідно до опису введення.
- Повідомлення про помилку 1, якщо вхід має більше одного кореня:
ERROR: Multiple roots
- Повідомлення про помилку 2, якщо вхідні батьківські вказівники цикли:
ERROR: Endless loop
- Повідомлення про помилку 3, все інше недійсне щодо вводу:
ERROR: Invalid input
Якщо вхід не містить помилок, програма повинна виводити дерево відповідно до таких обмежень: Кожен рядок складається з 5 частин A, B, C, D та E:
- A: 5 символів, 3 символи, вирівняні правою кількістю мутацій, символ вертикальної лінії:
|
та 1 пробіл - B: [макс. # Мутацій] символів, широке дерево + 1 пробіл
- C: 20 символів, ліворуч назва гілки
- D: 5 символів, 3 символи, вирівняні вправо, # унікальних мутацій для гілки, інкапсульованої між
[
та]
. (Унікальні мутації будуть пояснені нижче). - E: 5 символів, 3 символи, вирівняні вправо, макс. # Загальної мутації для цієї гілки та всіх дочірніх гілок, інкапсульованих між
[
та]
.
Гілка # унікальних мутацій - це відмінність у # мутацій, які має поточна гілка, від # мутацій, які має її материнська гілка. Перший рядок - корінь, і він має бути представлений 0
для # мутацій та # унікальних мутацій.
Вихід: Деталі - порядок / сортування рядків
Якщо дві або більше підгалузей поділяють один і той же батьківський, гілки впорядковуються максимальним числом підгалузей у загальній кількості мутацій у порядку зменшення. У нашому прикладі L0a1'4
, L0a3
і L0a2
акції материнської компанії : L0a
.
У перегляді дерева порядок зверху вниз - це підрозділ максимального числа загальних мутацій в дужках: L0a3
(53), L0a1'4
(55), L0a2
(60).
Якщо дві або більше підгалузей поділяють однаковий максимум # мутацій на дочірніх гілках, вони вертикально вирівнюються та розгалужуються від свого батьківського з одного місця, впорядкування рядків серед цих підгалузей є алфавітним.
Вихід: Деталі - дерево (частина B)
Дерево має бути звернено з персонажами наступного ASCii: └
, ─
, ┬
, ┐
, ├
, │
,♦
Логіка дерева полягає в тому, що всі мутації повинні бути представлені. Гілка з батьківської гілки: ┬
або ┐
являє собою 1 мутацію. Додаткові унікальні мутації на одній гілці представлені: ♦
і вони повинні бути вирівняні ліворуч та розміщені перед першою підгалуззю.
Підгалузі розгалужуються від свого батьківського уздовж осі x, а положення визначається максимальним числом мутацій серед усіх наступних дочірніх гілок.
Як натякає перед входом, є два різних типу вхідних рядків. Введіть 1 з будь-якими символами 'або суфіксом NL у назві гілки, не слід заповнювати горизонтальну лінію в крайній правій частині їх лінії, а закінчувати ┐
на останній підгалузі. У прикладі він застосовується до наступних галузей:
L0a'b'f'k;L0;14
L0a'b'f;L0a'b'f'k;23
L0a'b;L0a'b'f;30
L0a1'4;L0a;39
L0a1a NL;L0a1a;43
L0a1 NL;L0a1;41
L0a1b NL;L0a1b;45
L0d1'2;L0d;25
L0d1 NL;L0d1;31
L0d2a'b;L0d2;32
Сподіваємось, що приклад введення та виводу дає відповіді на будь-які додаткові запитання про те, як слід малювати дерево, вважаємо це частиною завдання, щоб з'ясувати логіку.
Натхнення
Ви можете спробувати мою версію JavaScript (не для гольфу) для натхнення: http://artificial.se/DNA/mtDNAmutationTree3.html (їй не вистачає перевірки помилок, і додано деякі статистичні дані, які не є частиною цього конкретного виклику) .
Повну версію дерева mtDNA [на основі http://www.phylotree.org/ Build mtDNA tree 16 (19 лютого 2014 р.)] Можна знайти тут:
http://artificial.se/DNA/mtDNAfull.html
Файл даних, який використовується для повного дерева:
http://artificial.se/DNA/mtDNA_full.txt
Це проблема з кодовим гольфом.
L0a1'4
це не (55), але (39), L0a2
це не (60), але (47) ... Чи могли б ви уточнити це?
L0d1
не слід розміщувати ранішеL0d2
, відповідно до правила сортування: "... у порядку зменшення ..."