Soyağacı hesapla


22

Küçük bir genetik dersi

Sadece birisinin görünür özelliklerine veya fenotipine erişiminiz olduğunda , aile geçmişinin bir soyağacı genellikle her genetik bilginin gerçek genetik bilgisini veya genotipini bulmak için kullanılır.

Bizim gibi basit bir baskınlık ile uğraşırken, basit bir soyağacı çizelgesi, her bir kişinin alellerini veya sahip oldukları genlerin versiyonlarını bulmak için yeterli olacaktır. Basit baskınlıkta, baskın bir alele (büyük harfle gösterilen) sahip bir kişi, diğer alel ne olursa olsun, her zaman bu versiyonun temsil ettiği özelliğe sahip olacaktır. Bu versiyonun ifade edilmesi için iki resesif alel (küçük harfle gösterilen) gerekir. Başka bir deyişle, baskın allel her zaman bu genin resesif versiyonunu maskeler. İşte bir soy ağacı şeması örneği:

ÇOCUK ŞEMASI

Buradaki her satır bir kuşaktır. Daireler kadın, erkekler kareler, yatay çizgiler evlilik, dikey çizgiler çocuklar. Oldukça basit. Siyah, resesif fenotip, beyaz, baskın anlamına gelir. Tepeden başlayarak, (alellerin var olduğunu Ave varsayalım a), 2. kişinin aahomozigos resesif olduğunu biliyoruz , çünkü resesif fenotip için mümkün olan tek seçenek budur. Şimdi kişi bir ya Aada AAbaskın bir fenotip olabilse de , resesif bir çocuğu olduğu için kendisinin Aaya da heterozigos olması gerekir . Bunu diğer tüm insanlar için yapabilirsiniz. Eğer ikinci alel anlamaya olanak herhangi bir bilgi yoktur halinde, o kadar gibi yapılabilir: A_.

Senin görevin

  • [GenI, GenII, etc.]Herhangi bir aklı başında formatta olduğu gibi nesiller listesi şeklinde bir soyağacı grafik alacaksınız .
  • Her nesil bir dize listesi olacaktır, her dize bir kişiyi temsil eder.
  • İnsanlar üç bölümden oluşuyor - bir kimlik, fenotipleri ve "bağlantıları".
  • Kimlikleri, Aveya dışındaki tüm ağaçta benzersiz olan tek bir yazdırılabilir ascii karakteridir a. (Hayır, grafikte 95'ten fazla kişi olmayacak).
  • Bunların fenotipi biridir Aya da a, Abaskın alel olması ve aresesif olarak.
  • Bağlantıları, bağlantı kurdukları diğer kişilerin kimlikleri dizisidir.
  • Aynı kuşakta bir bağlantı evlilik, farklı kuşaklarda çocuk ve ebeveyn.
  • Bağlantılar her iki tarafta da tekrarlanıyor (yani, koca karının kocası olduğunu söylüyor ve karısı karısının kocası olduğunu söylüyor).
  • Herkesin genotiplerini mümkün olduğunca bulmak zorundasınız.
  • Aynı listeye geri dönün, insanlar hariç, genotiplerini aynı pozisyona yerleştirin.
  • Genotip Aabunun yerine sırayla çıkarılmalıdır aA.
  • Giriş formatındaki küçük bir boşluk iyi.
  • Bu kod golf, bayt cinsinden kazanılan cevapların çok kısa olması .

Örnekler

[["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"]]

Bonus

  • -30 byte ile anlaşma eğer eksik ve eş baskınlık da. Tüm çizelgedeki iki yerine üç fenotip tespitinde algoritmanıza eksik / eş baskınlığı uygulayın.

Biz sadece değiştirmesine izin misiniz Ave ave olduğu gibi (yani kimlikleri ve bağlantıları bırakmak [["0A12","1A02"],["2A301","3a2"]]olur [["0A_12","1A_02"],["2A_301","3aa2"]]yerine [["A_","A_"],["A_","aa"]])?
Kevin Cruijssen

Yanıtlar:


2

05AB1E , 39 bayt

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

Java cevabımın limanı .

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

ε                     # 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 bayt

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;}

Çevrimiçi deneyin.

Genel açıklama:

1) Herhangi biri aher zaman olacakaa

Bir çocuk ise 2a) Abir ailesi var aave Abu olacak Aa
bir çocuk varsa) 2b Aanne vardır Ave Ao hale gelecektir, A_
bir çocuk için mümkün değildir () 2c Aanne olması aave aa)

3a) Bir ebeveynin Aen az bir çocuğu varsa a, Aa
3b olacaktır. ) Bir ebeveyn Asadece çocuk sahibi ise A,A_

Kod açıklaması:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.