가계도 계산


22

작은 유전학 수업

누군가의 눈에 보이는 특성이나 표현형 에만 접근 할 수있는 경우 , 가족 역사의 가계도는 실제 유전자 정보 또는 각 가족 구성원의 유전자형 을 파악하는 데 종종 사용됩니다 .

우리가 앞으로있을 것처럼 간단한 지배 를 다룰 때 , 간단한 혈통 차트는 대립 인자 또는 그들이 가지고있는 유전자의 버전을 알아 내기에 충분할 것입니다. 지배적 인 대립 유전자 (대문자로 표시)를 가진 사람은 단순한 지배에서 다른 대립 유전자에 관계없이 항상 그 버전이 나타내는 특성을 갖게됩니다. 소문자로 표시되는 열성 대립 유전자 2 개가 해당 버전을 표시해야합니다. 다시 말해서, 우성 대립 유전자는 항상 그 유전자의 열성 버전을가립니다. 가계도의 예는 다음과 같습니다.

페디 그 차트

여기의 각 행은 세대입니다. 원은 여성, 수컷 사각형, 수평선은 결혼, 수직선은 어린이입니다. 꽤 간단합니다. 검은 색은 열성 표현형, 흰색, 우세를 의미합니다. 맨 처음부터 (대립 유전자가 A및 이라고 가정 a), 사람 2는 aa, 동종 접합성 열성이라는 것을 알고 있습니다. 열성 표현형에 대한 유일한 가능한 옵션이기 때문입니다. 지금은 비록 사람이 하나가 될 수 중 하나 Aa또는 AA그 열성 아이를 가지고 있기 때문에, 그는해야합니다, 지배적 인 표현형으로 Aa, 또는 이형. 당신은 다른 모든 사람들을 위해 이것을 할 수 있습니다. 두 번째 대립 유전자를 알아낼 수있는 정보가없는 경우 다음과 같이 수행 할 수 있습니다 A_.

당신의 작업

  • [GenI, GenII, etc.]제정신 형식 과 같은 세대 목록의 형태로 가계도를 받게 됩니다.
  • 각 세대는 문자열 목록이며, 각 문자열은 사람을 나타냅니다.
  • 사람들은 ID, 표현형 및 "연결"의 세 부분으로 구성됩니다.
  • ID는 인쇄 가능한 단일 ASCII 문자이며 전체 트리에서 고유하지 않은 고유 한 ASCII 문자입니다. A 또는a . (아니오, 차트에 95 명을 넘지 않아야합니다).
  • 그들의 표현형 중 하나입니다 A또는a , A지배적 인 대립되는 및 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 개의 표현형이 탐지 될 때 알고리즘에 불완전한 / 공식 지배력을 적용하십시오.

우리는 단지를 수정할 수 있습니다 Aa와 같이 (즉,이 ID와 연결을 남겨 [["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

자바 10, 356 349340 바이트

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.