血統を計算する


22

少し遺伝学のレッスン

誰かの目に見える形質や表現型にしかアクセスできない場合、実際の遺伝情報や各家族の遺伝子型を把握するために、しばしば家族歴の血統が使用されます。

単純な支配を扱う場合、単純な家系図チャートは、各人の対立遺伝子、またはそれらが持っている遺伝子のバージョンを把握するのに十分です。単純な支配では、支配的な対立遺伝子(大文字で表される)を持つ人は、他の対立遺伝子に関係なく、常にそのバージョンが表す特性を持ちます。そのバージョンを表現するには、2つの劣性対立遺伝子(小文字で表記)が必要です。言い換えれば、優性対立遺伝子は常にその遺伝子の劣性バージョンをマスクします。血統図の例を次に示します。

ペディグリーチャート

ここの各行は世代です。円は女性、男性は正方形、水平線は結婚、垂直線は子供です。ものすごく単純。黒は劣性表現型、白、優性を意味します。上から始めて(対立遺伝子がAおよびであると仮定してa)、人2がaaホモ接合劣性であることがわかります。これは劣性表現型の唯一の可能なオプションだからです。現在、人は劣性の子供を持っているため、どちらかAaまたはAA優勢な表現型である可能性がありますがAa、彼は、またはヘテロ接合でなければなりません。他のすべての人に対してこれを行うことができます。2番目の対立遺伝子を把握するための情報がない場合は、次のようにしますA_

あなたのタスク

  • [GenI, GenII, etc.]健全な形式のような世代リストの形式で家系図を受け取ります。
  • 各世代は文字列のリストになり、各文字列は人を表します。
  • 人々は、ID、表現型、および「つながり」という3つの部分で構成されています。
  • IDは、Aまたは以外のツリー全体で一意の単一の印刷可能なASCII文字ですa。(いいえ、チャートに95人以上はいません)。
  • それらの表現型は、AまたはのいずれかaAあり、優性対立遺伝子でありa、劣性である。
  • それらの接続は、接続している他の人のIDのシーケンスです。
  • 同じ世代のつながりは結婚であり、異なる世代の子どもと親です。
  • 接続は両側で繰り返されます(つまり、夫は彼が妻の夫であると言い、妻は彼女が妻の夫であると言います)。
  • できる限り全員の遺伝子型を把握する必要があります。
  • 人の代わりに同じリストを返し、遺伝子型を同じ位置に置きます。
  • 遺伝子型はのAa代わりに順番に出力する必要がありaAます。
  • 入力形式については少し余裕があります。
  • これはコードゴルフなので、バイト単位の最短回答が勝ちです。

[["0A1234", "1a0234"], ["2A01", "3a01", "4A015678",
"5a4678"], ["6a45", "7A45","8A45"]] (The one above)   ->

[["Aa", "aa"], ["Aa", "aa", "Aa", "aa"], ["aa", "Aa", "Aa"]]

[["0A12", "1A02"], ["2A301", "3a2"]]    ->

[["A_", "A_"], ["A_", "aa"]]

ボーナス

  • 不完全な共同支配も処理する場合は-30バイト。チャート全体で2つではなく3つの表現型を検出した場合、アルゴリズムに不完全/共同支配を適用します。

Aand のみを変更しa、idと接続をそのままにすることはできますか(つまりの代わりに[["0A12","1A02"],["2A301","3a2"]]なりますか)?[["0A_12","1A_02"],["2A_301","3aa2"]][["A_","A_"],["A_","aa"]]
ケビンクルーッセン

回答:


2

05AB1E、39 バイト

εNUε'aåi„aaë¯.øX<X>‚è˜y2£lSδåPài„Aaë„A_

私のJava回答のポート。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

ε                     # Map over the rows of the (implicit) input-list:
 NU                   #  Store the outer-map index in variable `X`
   ε                  #  Map over the strings `y` of the current row:
    'aåi             '#   If the current string contains an "a":
        aa           #    Push string "aa"
       ë              #   Else (it contains an "A" instead):
        ¯.ø           #    Surround the (implicit) input-list with two empty lists
                      #    (05AB1E has automatic wrap-around when indexing lists,
                      #     so this is to prevent that)
           X<X>‚      #    Push `X-1` and `X+1` and pair them together
                è     #    Index both into the list to get (potential) parent and child rows
                 ˜    #    Flatten it to a single list
        y             #    Push the current string we're mapping again
         2£           #    Only leave the first 2 characters (its id and the letter "A")
           l          #    Lowercase the "A" to "a"
            S         #    And convert it to a list of characters: [id, "A"]
             δå       #    Check in each string whether it contains the id and "A"
               P      #    Check for each whether it contained BOTH the id AND "A"
                ài    #    If a child/parent is found for which this is truthy:
                  Aa #     Push string "Aa"
                 ë    #    Else:
                  A_ #     Push string "A_"
                      # (after which the mapped result is output implicitly)

1

Java 10、356 349 340バイト

a->{int i=0,j,k,f,z=a.length;var r=new String[z][];for(;i<z;i++)for(r[i]=new String[j=a[i].length];j-->0;)if(a[i][j].contains("a"))r[i][j]="aa";else{var t=".a.*"+a[i][j].charAt(0)+".*";for(f=k=0;i>0&&k<a[i-1].length;)f=a[i-1][k++].matches(t)?1:f;for(k=0;i+1<z&&k<a[i+1].length;)f=a[i+1][k++].matches(t)?1:f;r[i][j]=f>0?"Aa":"A_";}return r;}

オンラインでお試しください。

一般的な説明:

1)a常にaa

2a)子供Aが両親をaa持ちA、の場合、それはAa
2b)子供Aが両親をA持ちA、の場合、A_
2c)になります(子供Aが両親を持ちaaaa

3A)親がいる場合A、少なくとも一人の子供を持っているa、それはなりますAa
図3b)親がいる場合Aのみ、子供を持っているA、それはなるだろうA_

コードの説明:

a->{                     // Method with 2D String array as both parameter and return-type
  int i=0,j,k,           //  Index-integers
      f,                 //  Flag-integer
      z=a.length;        //  Length-integer
  var r=new String[z][]; //  Result 2D String array
  for(;i<z;i++)          //  Loop over the rows:
    for(r[i]=new String[j=a[i].length];
                         //   Create the inner String-array of the result
        j-->0;)          //   Loop over the columns:
      if(a[i][j].contains("a"))
                         //    If the current node contains "a":
        r[i][j]="aa";    //     Set the result at this node to "aa"
      else{              //    Else(-if the current node contains "A" instead):
        var t=".a.*"+a[i][j].charAt(0)+".*";
                         //     Set a temp String to a regex to check relations and "a"
        for(f=k=0;       //     Set the flag to 0
            i>0&&        //     If the current node has parents:
            k<a[i-1].length;)
                         //      Loop over the row above:
          f=a[i-1][k++].matches(t)?
                         //       If a parent with "a" is found:
            1:f;         //        Set the flag to 1 (else: leave it unchanged)
        for(k=0;i+1<z&&  //     If the current node has children:
            k<a[i+1].length;) 
                         //      Loop over the row below:
          f=a[i+1][k++].matches(t)?
                         //       If child with "a" is found:
            1:f;         //        Set the flag to 1 (else: leave it unchanged)
        r[i][j]=f>0?     //     If the flag is 1:
                 "Aa"    //      Current node changes from "A" to "Aa"
                :        //     Else (flag is still 0):
                 "A_";}  //      Current node changes from "A" to "A_"
  return r;}             //  Return the result
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.