mtDNA মিউটেশন ট্রি


13

পটভূমি:

এমটিডিএনএ হ'ল মানব ডিএনএর একটি অংশ যা একটি মা থেকে একটি সন্তানের কাছে চলে যায় এবং এটি খুব কমই পরিবর্তিত হয়। যেহেতু সমস্ত মানুষের পক্ষে এটি সত্য, এটি একটি বিশাল গাছ তৈরি করা সম্ভব যা কল্পনা করে যে সমস্ত মানুষ কীভাবে তাদের মাতৃ বংশের মাধ্যমে একে অপরের সাথে সম্পর্কিত হয়ে থাকে কল্পনা করা যায় যে সমস্ত কল্পিত ইভিতে ফিরে আসা যায় না। কোনও সন্তানের জন্মের সময় এমটিডিএনএর প্রতিটি রূপান্তর গাছের পিতামাতার শাখা থেকে একটি নতুন উপ-শাখা তৈরি করে।

মাইটোকন্ড্রিয়াল ডিএনএ (এমটিডিএনএ) সম্পর্কে আরও জানুন: https://en.wikedia.org/wiki/Mitochondrial_DNA

উদ্দেশ্য:

আপনার প্রোগ্রামটি এমটিডিএনএ ট্রি শাখার মিউটেশন কাউন্টের একটি তালিকা পরিবেশন করা হবে এবং আপনার প্রোগ্রামটি এটির একটি ট্রি ভিউ সরবরাহ করবে

ইনপুট এবং আউটপুট উদাহরণ:

ইনপুটটি প্রতিটি শাখার জন্য একটি লাইন সহ একটি 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]

ইনপুট: বিশদ

ইনপুট টেবিলটি কোনও নির্দিষ্ট ক্রমে সাজানো হয় না । আমরা যদি এলোমেলোভাবে ইনপুট লাইনগুলিকে পুনরায় অর্ডার করি তবে আউটপুটটি একই থাকবে।

ইনপুটটির প্রতিটি লাইন একটি এমটিডিএনএ ট্রি শাখা বা হাইপোথিটিকাল ট্রি শাখা উপস্থাপন করে। ইনপুট টেবিল দৈর্ঘ্যের কোনও সংখ্যা হতে পারে।

ইনপুট: বিশদ - কলাম এ (শাখার নাম):

প্রথম কলামটি আসল শাখার নাম। নামটি ইনপুট লাইনগুলিকে 2 টি লাইনের ধরণের গ্রুপে ভাগ করে দেয় যা একে অপরের থেকে পৃথক (পরে ব্যাখ্যা করা) করা উচিত:

  • প্রকার 1: নামটি যে কোনও 'বা প্রত্যয় নিয়ে গঠিতNL
  • প্রকার 2: নামটি কোনও 'বা প্রত্যয় নিয়ে গঠিত নয় NL

নামটি দৈর্ঘ্যে 20 টি অক্ষর পর্যন্ত হতে পারে।

ইনপুট: বিশদ - কলাম বি (মূল শাখার নাম):

দ্বিতীয় কলামে মূল শাখার নামের একটি পয়েন্টার রয়েছে। বেশ কয়েকটি লাইন (শাখা) একই পিতামাতাকে ভাগ করতে পারে। ইনপুট টেবিলটিতে সর্বদা ঠিক 1 স্বতন্ত্র পিতামাতার শাখার নাম থাকে যা কোনও পিতামাতাকে নির্দেশ করে যা ইনপুট লাইনের মধ্যে প্রতিনিধিত্ব করে না, পিতামাতার শাখার নাম গাছের মূল root উদাহরণের ইনপুটটিতে এটি মূলের দিকে ইঙ্গিত করা তৃতীয় লাইন mtEVE। যদি ইনপুটটির একাধিক মূল বা অন্তহীন লুপ থাকে তবে এটি একটি অবৈধ ইনপুট।

ইনপুট: বিশদ - কলাম সি (পরিবর্তনের #):

তৃতীয় কলামটি মূল শাখাটি মূল থেকে গণনা করা মোট পরিব্যক্তিগুলির সংখ্যা। হাইপোটেটিকাল মাতৃমূল (হিউম্যান / চিম্প পূর্বপুরুষ ইভিই) থেকে একক লাইনে হিউম্যান এমটিডিএনএ 100 বারেরও বেশি রূপান্তরিত করতে পারে নি, তবে আপনার প্রোগ্রামটি 999 অবধি 3 ডিজিটের # মিউটেশন পরিচালনা করতে সক্ষম হবে।

ইনপুট থেকে আপনি তার বিভাজনের পিতামাতার # অভিভাবকের কাছ থেকে এর # রূপান্তরকে বিয়োগ করে অনন্য মিউটেশনের একটি শাখা গণনা করতে পারেন।

আউটপুট: বিশদ

আপনার প্রোগ্রামটি 3 টির মধ্যে 1 টির মধ্যে পৃথক ত্রুটি বার্তা আউটপুট করা উচিত যদি ইনপুট বিবরণ অনুসারে ইনপুটটি অবৈধ।

  • ত্রুটি বার্তা 1, যদি ইনপুটটিতে একাধিক মূল থাকে: ERROR: Multiple roots
  • ত্রুটি বার্তা 2, যদি ইনপুট পিতামাতারা লুপগুলি নির্দেশ করে: ERROR: Endless loop
  • ত্রুটি বার্তা 3, ইনপুট সম্পর্কে অবৈধ অন্য কিছু: ERROR: Invalid input

যদি ইনপুটটিতে কোনও ত্রুটি না থাকে তবে আপনার প্রোগ্রামটি নিম্নলিখিত সীমাবদ্ধতা অনুযায়ী গাছটিকে আউটপুট দেয়: প্রতিটি লাইনে 5 টি অংশ A, B, C, D এবং E থাকে:

  • একটি: 5 টি অক্ষর, 3 |চরটি ডান-সংযুক্ত # রূপান্তরগুলি, একটি উল্লম্ব রেখার অক্ষর: এবং 1 ফাঁকা স্থান
  • বি: [সর্বাধিক # রূপান্তরকরণ] অক্ষর প্রশস্ত গাছ + 1 ফাঁকা স্থান
  • সি: 20 টি অক্ষর, বাম-সারিবদ্ধ শাখার নাম
  • ডি: 5 টি অক্ষর, 3 টি অক্ষর ডান-সংযুক্ত # শাখার জন্য অনন্য রূপান্তরগুলির মধ্যে [এবং এর মধ্যে আবদ্ধ হয় ]। (অনন্য মিউটেশনগুলি নীচে ব্যাখ্যা করা হবে)।
  • ই: 5 অক্ষর, 3 চরিত্র এই শাখা মোট পরিব্যক্তি এবং সব সন্তানের শাখার মধ্যে encapsulated ডান প্রান্তিককৃত সর্বোচ্চ # [এবং ]

অনন্য রূপান্তরগুলির একটি শাখা হ'ল বর্তমান শাখায় তার অভিভাবক শাখার # রূপান্তরগুলির মধ্যে পার্থক্য। প্রথম লাইনটি মূল এবং এটি 0# রূপান্তর এবং # স্বতন্ত্র রূপান্তরগুলির সাথে প্রতিনিধিত্ব করা উচিত ।

আউটপুট: বিশদ - লাইন ক্রম / বাছাই

যদি দুটি বা ততোধিক উপ-শাখা একই পিতামাতাকে ভাগ করে নিচ্ছে তবে শাখাগুলি উপ-শাখাগুলি ক্রমবর্ধমান ক্রমে সর্বোচ্চ # মিউটেশনগুলির সর্বোচ্চ # দ্বারা অর্ডার করা হয়েছে। আমাদের উদাহরণে L0a1'4, L0a3এবং L0a2শেয়ার পিতা বা মাতা: L0a

গাছের দৃশ্যে উপরের থেকে নীচে অবধি ক্রমটি হল, প্রথম শাখাগুলি প্যারেনেসিসের মধ্যে মোট মিউটেশনের সর্বাধিক #: L0a3(53), L0a1'4(55), L0a2(60)।

যদি দুটি বা ততোধিক সাব-শাখা শিশু শাখায় একই সর্বোচ্চ # পরিব্যক্তি ভাগ করে, তবে তারা উল্লম্বভাবে একই স্থান থেকে তাদের পিতামাতার কাছ থেকে প্রান্তিকরেখা এবং ব্রাঞ্চ করা হয়, sub সাব-শাখাগুলির মধ্যে লাইন ক্রম বর্ণমালা হয়।

আউটপুট: বিশদ - গাছ (অংশ বি)

গাছ নিম্নলিখিত ASCII অক্ষর দিয়ে অঙ্কনের করা উচিত: , , , , , ,

গাছটির যুক্তি হ'ল সমস্ত মিউটেশন উপস্থাপন করা উচিত। পিতামাতাদের শাখা থেকে একটি শাখা: বা 1 রূপান্তর উপস্থাপন করে। একই শাখায় অতিরিক্ত অনন্য মিউটেশনগুলি প্রতিনিধিত্ব করে: এবং সেগুলি অবশ্যই বাম-সারিবদ্ধ এবং প্রথম উপ-শাখার সামনে স্থাপন করা উচিত।

উপ-শাখাগুলি তাদের পিতামাতার কাছ থেকে এক্স-অক্ষের সাথে শাখা করা হয় এবং পরবর্তী সমস্ত শিশু শাখাগুলির মধ্যে সর্বাধিক # রূপান্তর দ্বারা অবস্থান নির্ধারণ করা হয়।

ইনপুটটিতে 2 টি বিভিন্ন ধরণের ইনপুট লাইন থাকার আগে ইঙ্গিত দেওয়া হয়েছে। কোনও 'অক্ষর বা শাখার নামটিতে এনএল প্রত্যয় সহ 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

আশা করি উদাহরণটি ইনপুট এবং আউটপুট গাছটিকে কীভাবে আঁকতে হবে সে সম্পর্কে কোনও অতিরিক্ত প্রশ্নের উত্তর দেয়, এটিকে যুক্তিটি বের করার চ্যালেঞ্জের অংশ হিসাবে বিবেচনা করুন।

প্রেরণা

আপনি অনুপ্রেরণা জন্য আমার (অ-golfed) জাভাস্ক্রিপ্ট সংস্করণ চেষ্টা করে দেখতে স্বাগত জানাই: http://artificial.se/DNA/mtDNAmutationTree3.html (এটা ত্রুটি পরীক্ষা অভাব আছে, এবং কিছু পরিসংখ্যান যোগ করা হয় যে এই বিশেষ চ্যালেঞ্জ অংশ নয়) ।

[ Http://www.phylotree.org/ mtDNA ট্রি বিল্ড 16 (19 ফেব্রুয়ারী 2014) এর উপর ভিত্তি করে) একটি সম্পূর্ণ এমটিডিএনএ-ট্রি সংস্করণ এখানে পাওয়া যাবে:

http://artificial.se/DNA/mtDNAfull.html

পূর্ণ গাছের জন্য ব্যবহৃত ডেটা-ফাইল:

http://artificial.se/DNA/mtDNA_full.txt

এটি একটি কোড-গল্ফ চ্যালেঞ্জ।


L0d1L0d2বাছাইয়ের নিয়ম অনুযায়ী, আগে স্থাপন করা উচিত নয় : "... অবতরণ ক্রম ..."
777

L0a1'4(55) নয় (39) L0a2নয়, (60) নয় (47) ... আপনি কি এটি পরিষ্কার করতে পারেন?
777

L0d1 এবং L0d2 উভয়ই 46, এর জন্য বর্ণানুক্রমিক আদেশ প্রয়োগ করা হয়
প্লারসেন

L0a4 55 এবং L0a1'4 এর একটি শিশু তাই L0a1'4 এর জন্য সর্বাধিক পরিব্যক্তি 55
প্লারসেন

আমার কয়েকটি প্রশ্ন রয়েছে: 1) এটি কি বাস্তব প্রকল্প? আমার ধারণা আছে যে এর মতো কিছু প্রকৃত অর্থের জন্য মূল্যবান হতে পারে। 2) আপনি উদাহরণ আউটপুট কিভাবে পেলেন? 3) কেন অংশ A এর 5 এর পরিবর্তে 8 টি অক্ষর রয়েছে? 4) পার্ট ডিতে 5 এর পরিবর্তে 6 টি অক্ষর কেন থাকবে? 5) "L0a1 এনএল" এর "ডি" অংশে কেন আছে?
অডিটসু ছেড়ে গেছে কারণ এসই এভিল

উত্তর:


6

পাইথন 3, 925 বাইট

হ্যাঁ, 1 কেবি এর নিচে! সম্ভবত এখনও গল্ফ করার জন্য জায়গা ...

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))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.