Tính toán một phả hệ


22

Một bài học di truyền nhỏ

Khi bạn chỉ có quyền truy cập vào các đặc điểm hoặc kiểu hình có thể nhìn thấy của ai đó , một phả hệ về lịch sử gia đình của họ thường được sử dụng để tìm ra thông tin di truyền thực tế hoặc, kiểu gen của mỗi thành viên trong gia đình.

Khi đối phó với sự thống trị đơn giản như chúng ta sẽ có, một biểu đồ phả hệ đơn giản sẽ đủ để tìm ra các alen hoặc phiên bản gen mà chúng có của mỗi người. Trong sự thống trị đơn giản, một người có alen trội (biểu thị bằng chữ in hoa) sẽ luôn có đặc điểm mà phiên bản đó thể hiện, bất kể các alen khác. Phải mất hai alen lặn (ký hiệu là một chữ cái viết thường) để phiên bản đó được thể hiện. Nói cách khác, alen trội luôn che dấu phiên bản lặn của gen đó. Dưới đây là một ví dụ về biểu đồ phả hệ:

BIỂU ĐỒ PEDIGREE

Mỗi hàng ở đây là một thế hệ. Vòng tròn là nữ, hình vuông nam, đường ngang là hôn nhân, đường thẳng đứng trẻ em. Khá đơn giản. Màu đen có nghĩa là kiểu hình lặn, màu trắng, trội. Bắt đầu từ đỉnh, (giả sử các alen là Aa), chúng ta biết người 2 có aa, lặn đồng hợp tử vì đó là lựa chọn khả dĩ duy nhất cho kiểu hình lặn. Bây giờ mặc dù người ta có thể là một trong hai Aahoặc AAlà chiếm ưu thế kiểu hình, bởi vì ông có một đứa trẻ lặn, ông phải Aa, hoặc dị hợp tử. Bạn có thể làm điều này cho tất cả những người khác. Trong trường hợp bạn không có bất kỳ thông tin nào cho phép bạn tìm ra alen thứ hai, nó có thể được thực hiện như vậy : A_.

Nhiệm vụ của bạn

  • Bạn sẽ nhận được một biểu đồ phả hệ dưới dạng một danh sách các thế hệ như [GenI, GenII, etc.]ở bất kỳ định dạng lành mạnh nào.
  • Mỗi thế hệ sẽ là một danh sách các chuỗi, mỗi chuỗi đại diện cho một người.
  • Mọi người được tạo thành từ ba phần - một ID, kiểu hình của họ và "các kết nối" của họ.
  • ID của họ là một ký tự ascii có thể in duy nhất trong toàn bộ cây khác với Ahoặc a. (Không, sẽ không có hơn 95 người trong bảng xếp hạng).
  • Kiểu hình của chúng là một trong Ahoặc a, Alà alen trội và abị thoái hóa.
  • Các kết nối của họ là một chuỗi ID của những người khác mà họ có kết nối.
  • Một kết nối trong cùng một thế hệ là hôn nhân, ở các thế hệ khác nhau là con và cha mẹ.
  • Các kết nối được lặp lại ở cả hai phía (tức là người chồng đã nói anh ta là chồng của vợ, còn vợ nói rằng cô ta là chồng của vợ).
  • Bạn phải tìm ra kiểu gen của mọi người càng nhiều càng tốt.
  • Trả về cùng một danh sách, ngoại trừ thay vì mọi người, đặt kiểu gen của họ vào cùng một vị trí.
  • Kiểu gen phải được xuất ra theo thứ tự như vậy Aathay vì aA.
  • Một chút chậm trễ trên định dạng đầu vào là tốt.
  • Đây là mã golf để câu trả lời ngắn nhất trong byte thắng.

Ví dụ

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

Tiền thưởng

  • -30 byte nếu bạn xử lý không đầy đủ và đồng thống trị . Khi phát hiện ba kiểu hình thay vì hai trong toàn bộ biểu đồ, áp dụng sự thống trị không hoàn chỉnh / đồng cho thuật toán của bạn.

Chúng tôi có được phép chỉ sửa đổi Aavà để các id và kết nối như hiện tại (nghĩa là [["0A12","1A02"],["2A301","3a2"]]trở thành [["0A_12","1A_02"],["2A_301","3aa2"]]thay vì [["A_","A_"],["A_","aa"]]) không?
Kevin Cruijssen

Câu trả lời:


2

05AB1E , 39 byte

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

Cổng câu trả lời Java của tôi .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

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

Hãy thử trực tuyến.

Giải thích chung:

1) Bất kỳ asẽ luôn luôn trở thànhaa

2a) Nếu một đứa trẻ Acó cha mẹ aaAnó sẽ trở thành Aa
2b) Nếu một đứa trẻ Acó cha mẹ AAnó sẽ trở thành A_
2c) (Không thể có một đứa trẻ Acó cha mẹ aaaa)

3a) Nếu cha mẹ Acó ít nhất một con a, nó sẽ trở thành Aa
3b) Nếu cha mẹ Achỉ có con A, nó sẽ trở thànhA_

Mã giải thích:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.