バックグラウンド:
MtDNAは、母親から子供に渡されるヒトDNAの一部であり、めったに変異しません。これはすべての人間に当てはまるので、母体の祖先を通じてすべての人間が架空のEVEまでさかのぼって相互にどのように関係しているかを視覚化する巨大なツリーを作成することができます。子が生まれたときのMtDNAのすべての突然変異は、ツリーの親ブランチから新しいサブブランチを作成します。
ミトコンドリアDNA(mtDNA)の詳細については、こちらをご覧ください:https : //en.wikipedia.org/wiki/Mitochondrial_DNA
目的:
プログラムにはmtDNAツリーブランチの突然変異カウントのリストが提供され、プログラムはそのツリービューを提供する必要があります。
入力と出力の例:
入力は、3列のセミコロンで区切られたテーブルで、各ブランチに1行があります。例:
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ツリーブランチまたは仮想ツリーブランチを表します。入力テーブルの長さは何行でもかまいません。
入力:詳細-列A(支店名):
最初の列は実際のブランチ名です。この名前は、入力行を、互いに異なる(後で説明する)処理が必要な行タイプの2つのグループに分割します。
- タイプ1:名前は任意
'
または接尾辞で構成されますNL
- タイプ2:名前は
'
、接尾辞またはで構成されていませんNL
。
名前の長さは最大20文字です。
入力:詳細-列B(親ブランチ名):
2番目の列には、親ブランチ名へのポインターが含まれています。複数の行(ブランチ)が同じ親を共有できます。入力行には表されない親を指す入力テーブルには、常に正確に1つの個別の親ブランチ名があります。その親ブランチ名はツリーのルートです。例の入力では、ルートを指す3行目ですmtEVE
。入力に複数のルートまたは無限ループがある場合、それは無効な入力です。
入力:詳細-列C(突然変異の数):
3列目は、特定のブランチがルートから数えていた突然変異の総数です。人間のmtDNAは、架空の母体のルート(人/チンパンジーの祖先EVE)から1行で100回以上変異していませんが、プログラムは最大999の3桁の変異を処理できるはずです。
入力から、その突然変異の数をその突然変異の親の数から減算することにより、一意の突然変異の枝を計算できます。
出力:詳細
入力内容に従って入力が無効な場合、プログラムは3つの異なるエラーメッセージのうち1つを出力する必要があります。
- 入力に複数のルートがある場合、エラーメッセージ1:
ERROR: Multiple roots
- 入力親ポインターがループする場合、エラーメッセージ2:
ERROR: Endless loop
- エラーメッセージ3、入力に関するその他の無効なもの:
ERROR: Invalid input
入力にエラーがない場合、プログラムは次の制約に従ってツリーを出力する必要があります。各行は、A、B、C、D、およびEの5つの部分で構成されます。
- A:5文字、3文字の右揃えの突然変異数、縦線文字:
|
および1つの空白 - B:[変異の最大数]文字幅のツリー+ 1つの空白
- C:20文字、左揃えのブランチ名
- D:5つの文字、間に封入ブランチのためのユニークな突然変異の3文字右詰め#
[
と]
。(ユニークな突然変異については以下で説明します)。 - E:5文字、3文字右揃え、このブランチの合計突然変異の最大数
[
とからの間にカプセル化されたすべての子ブランチ]
。
ユニークな突然変異のブランチは、現在のブランチが持っている突然変異の数と、その親ブランチが持っている突然変異の数との差です。最初の行はルートであり0
、#個の変異と#個のユニークな変異で表される必要があります。
出力:詳細-ラインオーダー/ソート
2つ以上のサブブランチが同じ親を共有している場合、ブランチはサブブランチの合計突然変異の最大数で降順に並べられます。この例L0a1'4
では、親L0a3
をL0a2
共有します:L0a
。
ツリービューでは、上から下への順序は、サブブランチL0a3
(括弧内の合計突然変異の最大数)です:(53)、L0a1'4
(55)、L0a2
(60)。
2つ以上のサブブランチが子ブランチで同じ最大突然変異数を共有する場合、それらは同じスポットから親から垂直に整列および分岐されます。これらのサブブランチ間の行の順序はアルファベット順です。
出力:詳細-ツリー(パートB)
ツリーには、次のASCII文字で描画する必要があります:└
、─
、┬
、┐
、├
、│
、♦
ツリーのロジックは、すべての突然変異を表現することです。親ブランチからのブランチ:┬
または┐
1つの突然変異を表します。同じブランチ上の追加のユニークな変異は、次のように表されます。♦
それらは左揃えで、最初のサブブランチの前に配置する必要があります。
サブブランチは、x軸に沿って親から分岐され、位置は、後続のすべての子ブランチ間の突然変異の最大数によって決定されます。
前に示唆したように、入力には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
入力と出力の例が、ツリーの描画方法に関する追加の質問に答えることを願っています。ロジックを理解することはチャレンジの一部であると考えてください。
ひらめき
インスピレーションのために、私の(ゴルフをしていない)JavaScriptバージョンを試してみてください:http : //artificial.se/DNA/mtDNAmutationTree3.html(エラーチェックがなく、この特定の課題の一部ではない統計が追加されます) 。
完全なmtDNAツリーバージョン[ http://www.phylotree.org/ mtDNAツリービルド16(2014年2月19日)に基づく]は、次の場所にあります。
http://artificial.se/DNA/mtDNAfull.html
完全なツリーに使用されるデータファイル:
http://artificial.se/DNA/mtDNA_full.txt
これはコードゴルフの挑戦です。
L0a1'4
(55)ではなく(39)、L0a2
(60)ではなく(47)...これを明確にできますか?
L0d1
L0d2
ソート規則に従って、前に配置しないでください: "...降順..."