पृष्ठभूमि:
MtDNA मानव डीएनए का एक हिस्सा है जो एक माँ से एक बच्चे को दिया जाता है और यह शायद ही कभी उत्परिवर्तित होता है। चूंकि यह सभी मनुष्यों के लिए सच है, इसलिए एक विशाल वृक्ष बनाना संभव है जो यह कल्पना करता है कि सभी मानव एक दूसरे से अपने मातृ वंश के माध्यम से सभी तरह से काल्पनिक ईवीई से संबंधित हैं। MtDNA में हर उत्परिवर्तन जब एक बच्चा पैदा होता है, तो पेड़ में अपनी मूल शाखा से एक नई उप-शाखा बनाता है।
Mitochondrial DNA (mtDNA) के बारे में अधिक जानकारी यहाँ देखें: https://en.wikipedia.org/wiki/Mitochondrial_DNA
उद्देश्य:
आपके कार्यक्रम को mtDNA के पेड़ की शाखाओं की एक सूची दी गई है म्यूटेशन काउंट और आपके कार्यक्रम को इसके बारे में एक ट्री व्यू देना चाहिए
उदाहरण इनपुट और आउटपुट:
इनपुट एक 3-कॉलम अर्ध-बृहदान्त्र अलग तालिका है जिसमें प्रत्येक शाखा के लिए एक पंक्ति है। उदाहरण:
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]
इनपुट: विवरण
इनपुट तालिका किसी विशेष क्रम में क्रमबद्ध नहीं है । यदि हम यादृच्छिक रूप से इनपुट लाइनों को फिर से व्यवस्थित करते हैं, तो आउटपुट समान रहना चाहिए।
इनपुट में प्रत्येक पंक्ति एक mtDNA ट्री शाखा या एक काल्पनिक ट्री शाखा का प्रतिनिधित्व करती है। इनपुट तालिका लंबाई में किसी भी संख्या में हो सकती है।
इनपुट: विवरण - कॉलम ए (शाखा का नाम):
पहला कॉलम वास्तविक शाखा का नाम है। नाम इनपुट लाइनों को 2 प्रकार के रेखा समूहों में विभाजित करता है जिन्हें एक दूसरे से अलग (बाद में समझाया गया) संभाला जाना चाहिए:
- टाइप 1: नाम किसी भी
'
या प्रत्यय का होता हैNL
- टाइप 2: नाम में कोई
'
या प्रत्यय नहीं हैNL
।
नाम लंबाई में 20 वर्ण तक हो सकता है।
इनपुट: विवरण - कॉलम बी (मूल शाखा का नाम):
दूसरे कॉलम में पैरेंट ब्रांच नाम का एक पॉइंटर होता है। कई लाइनें (शाखाएं) एक ही मूल को साझा कर सकती हैं। इनपुट तालिका में हमेशा 1 अलग-अलग मूल शाखा का नाम होता है, जो उस माता-पिता को इंगित करता है जो इनपुट लाइनों के बीच प्रतिनिधित्व नहीं करता है, वह मूल शाखा नाम पेड़ के लिए मूल है। उदाहरण इनपुट में जो रूट को इंगित करने वाली तीसरी पंक्ति है mtEVE
:। यदि इनपुट में एक से अधिक रूट, या अंतहीन लूप हैं, तो यह एक अमान्य इनपुट है।
इनपुट: विवरण - कॉलम सी (# म्यूटेशन का):
तीसरा कॉलम कुल म्यूटेशन की संख्या है जो विशेष शाखा की जड़ से गिनती है। मानव mtDNA ने काल्पनिक मातृ जड़ (मानव / चिंकारा पूर्वज EVE) से एक ही पंक्ति में 100 से अधिक बार उत्परिवर्तित नहीं किया है, लेकिन आपका प्रोग्राम 999 तक 3 अंकों # परिवर्तन को संभालने में सक्षम होना चाहिए।
इनपुट से आप अपने म्यूटेशन के # म्यूटेशन के # म्यूटेशन को घटाकर यूनिक म्यूटेशन की एक ब्रांच # कैलकुलेट कर सकते हैं।
आउटपुट: विवरण
यदि इनपुट विवरण के अनुसार इनपुट अमान्य है, तो आपके प्रोग्राम को 3 अलग-अलग त्रुटि संदेशों में से 1 का आउटपुट देना चाहिए।
- त्रुटि संदेश 1, यदि इनपुट में एक से अधिक रूट हैं:
ERROR: Multiple roots
- त्रुटि संदेश 2, यदि इनपुट पैरेंट पॉइंटर्स लूप्स:
ERROR: Endless loop
- त्रुटि संदेश 3, इनपुट के बारे में कुछ और अमान्य:
ERROR: Invalid input
यदि इनपुट में कोई त्रुटि नहीं है, तो आपके प्रोग्राम को निम्नलिखित बाधाओं के अनुसार पेड़ का उत्पादन करना चाहिए: प्रत्येक पंक्ति में 5 भाग होते हैं A, B, C, D, और E:
- A: 5 वर्ण, म्यूटेशन के 3 चार दाएं-संरेखित #, एक ऊर्ध्वाधर रेखा वर्ण:
|
और 1 रिक्त स्थान - बी: [अधिकतम # म्यूटेशन का] अक्षर चौड़ा पेड़ + १ ब्लैंकस्पेस
- C: 20 अक्षर, बाईं-शाखा का नाम
- D: 5 वर्ण, 3 वर्ण सही-संरेखित # शाखा के लिए अद्वितीय उत्परिवर्तन के बीच
[
और]
। (अद्वितीय म्यूटेशन नीचे समझाया जाएगा)। - E: 5 वर्ण, इस शाखा के लिए कुल उत्परिवर्तन के 3 वर्ण दाएं-संरेखित अधिकतम # और सभी बाल-शाखाओं के बीच
[
और समीपस्थ]
।
अनूठे म्यूटेशन की एक शाखा # म्यूटेशन के # अंतर में होती है, जो वर्तमान ब्रांच के पास म्यूटेशन के # मूल शाखा से होती है। पहली पंक्ति मूल है और इसे 0
# उत्परिवर्तन के # और # अनूठे उत्परिवर्तन के # के साथ दर्शाया जाना चाहिए ।
आउटपुट: विवरण - लाइन ऑर्डर / छँटाई
यदि दो या अधिक उप-शाखाएं समान माता-पिता को साझा कर रही हैं, तो शाखाओं को अवरोही क्रम में कुल म्यूटेशन की अधिकतम # उप-शाखाओं द्वारा आदेश दिया जाता है। हमारे उदाहरण में L0a1'4
, L0a3
और L0a2
माता-पिता को साझा करता है L0a
:।
पेड़ के दृश्य में ऊपर से नीचे तक का क्रम है, कोष्ठक के भीतर कुल उत्परिवर्तन की अधिकतम # उप-शाखाएँ: L0a3
(53), L0a1'4
(55), L0a2
(60)।
यदि दो या अधिक उप-शाखाएं बाल शाखाओं पर एक ही अधिकतम # म्यूटेशन साझा करती हैं, तो वे एक ही स्थान से अपने माता-पिता से लंबवत रूप से संरेखित और शाखाबद्ध होती हैं, उन उप-शाखाओं के बीच की रेखा क्रमबद्ध होती है।
आउटपुट: विवरण - पेड़ (भाग बी)
पेड़ निम्नलिखित ASCII वर्ण के साथ तैयार किया जाना चाहिए: └
, ─
, ┬
, ┐
, ├
, │
,♦
पेड़ का तर्क यह है कि सभी उत्परिवर्तन का प्रतिनिधित्व किया जाना चाहिए। मूल शाखा से एक शाखा: ┬
या ┐
1 उत्परिवर्तन का प्रतिनिधित्व करती है। एक ही शाखा पर अतिरिक्त अद्वितीय म्यूटेशनों का प्रतिनिधित्व किया जाता है: ♦
और उन्हें पहले उप-शाखा से बाएं-संरेखित और रखा जाना चाहिए।
उप-शाखाओं को एक्स-अक्ष के साथ उनके माता-पिता से विभाजित किया जाता है और स्थिति सभी बाद की बाल शाखाओं के बीच अधिकतम # उत्परिवर्तन द्वारा निर्धारित की जाती है।
इनपुट से पहले संकेत के रूप में इनपुट लाइनों के 2 विभिन्न प्रकार है। शाखा नाम में किसी भी 'वर्ण या NL प्रत्यय के साथ टाइप 1, क्षैतिज रेखा को उनकी रेखा पर दूर तक नहीं भरना चाहिए बल्कि ┐
अंतिम उप-शाखा पर समाप्त होना चाहिए । उदाहरण में इसे निम्नलिखित शाखाओं पर लागू किया जाता है:
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
उम्मीद है कि उदाहरण इनपुट और आउटपुट किसी भी अतिरिक्त प्रश्न का उत्तर देते हैं कि पेड़ को कैसे खींचा जाना चाहिए, इसे तर्क का पता लगाने के लिए चुनौती का हिस्सा मानें।
प्रेरणा स्त्रोत
प्रेरणा के लिए मेरे (अन-गॉल्फर्ड) जावास्क्रिप्ट संस्करण को आज़माने के लिए आपका स्वागत है: http://artific.se/DNA/mtDNAmutationTree3.html (इसमें त्रुटि जाँच की कमी है, और कुछ आँकड़े जोड़े गए हैं जो इस विशेष चुनौती का हिस्सा नहीं है) ।
एक पूर्ण mtDNA- वृक्ष संस्करण [ http://www.phylotree.org/ mtDNA वृक्ष पर आधारित 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
छँटाई नियम के अनुसार पहले नहीं रखा जाना चाहिए : "... अवरोही क्रम ..."