Обчисліть родовід


22

Невеликий урок генетики

Коли ви маєте доступ лише до чиїхось видимих ​​рис або фенотипу , часто використовується родовід їх сімейної історії для з'ясування фактичної генетичної інформації або генотипу кожного члена сім'ї.

Коли ми маємо справу з простим домінуванням, як ми будемо, буде достатньо простого родоводу, щоб визначити алелі чи версії генів у кожної людини. У простому домінуванні людина з домінуючим алелем (позначається з великої літери) завжди матиме рису, яку представляє ця версія, незалежно від іншого алеля. Для вираження цієї версії потрібні два рецесивні алелі (позначені малою літерою). Іншими словами, домінантний алель завжди маскує рецесивну версію цього гена. Ось приклад діаграми родоводу:

ПЕДІГРЕЙНА ХАРТА

Кожен рядок тут - це покоління. Кола жіночі, квадрати чоловічої статі, горизонтальні лінії одруження, вертикальні лінії дітей. Досить просто. Чорний означає рецесивний фенотип, білий, домінуючий. Починаючи зверху, (припустимо, алелі є Aі a), ми знаємо, що у людини 2 є aaгомозиготний рецесивний, оскільки це єдиний можливий варіант рецесивного фенотипу. Тепер, хоча людина може бути Aaабо AAдомінантним фенотипом, оскільки у нього є рецесивна дитина, він повинен бути Aaабо гетерозиготний. Це можна зробити для всіх інших людей. У разі , якщо у вас немає ніякої інформації , яка дозволяє з'ясувати другу аллель, це може бути зроблено в такий спосіб: A_.

Ваше завдання

  • Ви отримаєте родовідну діаграму у вигляді списку поколінь, як [GenI, GenII, etc.]у будь-якому розумному форматі.
  • Кожне покоління буде складати список рядків, кожен рядок представляє людину.
  • Люди складаються з трьох частин - ідентифікатор, їх фенотип і їх "зв'язки".
  • Їх ідентифікатор - це єдиний символ для друку ascii, який є унікальним для всього дерева, крім Aабо a. (Ні, у графіку не буде більше 95 осіб).
  • Їх фенотип є одним з Aабо a, Aбудучи домінуючим алелем, і aє рецесивним.
  • Їх з'єднання - це послідовність ідентифікаційних даних інших людей, з якими вони мають зв'язки.
  • Зв'язок в одному поколінні - це шлюб, у різних поколінь - дитина і батько.
  • Зв'язки повторюються з обох сторін (тобто чоловік каже, що він чоловік дружини, а дружина каже, що він чоловік дружини).
  • Ви повинні якомога більше з'ясувати генотипи кожного.
  • Поверніть той самий список, за винятком людей, ставити їх генотипи в ту саму позицію.
  • Генотип повинен бути виведений для того, щоб 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 байт, якщо ви також маєте справу з неповним і спільним домінантом . Щодо виявлення трьох фенотипів замість двох у всій діаграмі, застосуйте неповне / домінування до вашого алгоритму.

Дійсно ми дозволили тільки модифікувати Aі aі залишити ідентифікатори і з'єднання як є (тобто [["0A12","1A02"],["2A301","3a2"]]стає [["0A_12","1A_02"],["2A_301","3aa2"]]замість [["A_","A_"],["A_","aa"]])?
Kevin Cruijssen

Відповіді:


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

2а) Якщо у дитини Aє батьки aaі Aвона стане Aa
2б) Якщо у дитини Aє батьки Aі Aвона стане A_
2в) (Неможливо, щоб у дитини Aбули батьки aaі aa)

3а) Якщо батько Aмає принаймні одну дитину a, він стане Aa
3б) Якщо у батька є 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.