mtDNA म्यूटेशन ट्री


13

पृष्ठभूमि:

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

यह एक कोड-गोल्फ चुनौती है।


L0d1L0d2छँटाई नियम के अनुसार पहले नहीं रखा जाना चाहिए : "... अवरोही क्रम ..."
guy777

L0a1'4(55) है, लेकिन (39), L0a2(60) नहीं है , लेकिन (47) ... क्या आप इसे स्पष्ट कर सकते हैं?
guy777

L0d1 और L0d2 दोनों 46 हैं, इसके लिए वर्णमाला क्रम लागू है
Plarsen

L0a4 55 और L0a1'4 का एक बच्चा L0a1'4 के लिए अधिकतम उत्परिवर्तन 55 है
प्लेसेन

मेरे पास कुछ प्रश्न हैं: 1) क्या यह एक वास्तविक परियोजना है? मुझे आभास है कि ऐसा कुछ वास्तविक धन के लायक हो सकता है। 2) आपको उदाहरण आउटपुट कैसे मिला? ३) भाग A में ५ के बजाय A वर्ण क्यों है? 4) भाग D में 5 के बजाय 6 वर्ण क्यों है? 5) "L0a1 NL" के भाग D में "4" क्यों है?
aditsu छोड़ दिया क्योंकि एसई EVIL

जवाबों:


6

पायथन 3, 925 बाइट्स

1 KB से कम उम्र के! शायद अभी भी गोल्फ के लिए कमरा ...

import sys
class L:
 def __init__(x,**k):x.__dict__.update(k)
m={}
def e(x):print('ERROR: '+x);exit()
try:
 for x in sys.stdin:a,b,c=x.split(';');m[a]=L(s=a,p=b,m=int(c),l=0)
except:e('Invalid input')
a=set()
def k(x):
 if x.l<0:e('Endless loop')
 if x.l<1:y=m.get(x.p);x.l=-1;k(y)if y else a.add(x.p);x.l=1
for x in m:k(m[x])
r=L(s=a.pop(),p=0,m=0)
if a:e('Multiple roots')
m[r.s]=r
c={}
def u(x):
 c[x.s]=[m[y]for y in m if m[y].p==x.s];x.x=x.m
 for y in c[x.s]:u(y);x.x=max(x.x,y.x)
u(r)
o=[]
def f(p,x,o=o):
 d=x.m-p.m;j=p.m+r.x-x.x;s=x.s;x.i=len(o);l=sorted(c[s],key=lambda t:(t.x,t.s));q=' '*j+'└'+'♦'*(d-1);z='─'
 if"'"in s or s[-2:]=='NL'or x==r:q+=z*(x.x-l[0].x);z=' '
 o+=list("%3d│ "%x.m+q+z*(r.x-len(q))+' %-20s[%3d][%3d]'%(s,d,x.x)),;j+=5;o[p.i][j]='┐┬'[o[p.i][j]in'─┬']
 for i in range(p.i+1,x.i):o[i][j]='├│'[o[i][j]in' │']
 for y in l:f(x,y)
f(r,r)
print('\n'.join(''.join(x)for x in o))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.