คำนวณโคตร


22

บทเรียนพันธุศาสตร์เล็กน้อย

เมื่อคุณเข้าถึงลักษณะหรือฟีโนไทป์ที่มองเห็นได้ของใครบางคนเชื้อสายของประวัติครอบครัวมักถูกนำมาใช้เพื่อหาข้อมูลทางพันธุกรรมที่แท้จริงหรือจีโนไทป์ของสมาชิกในครอบครัวแต่ละคน

เมื่อจัดการกับการปกครองแบบง่าย ๆที่เราจะเป็นแผนภูมิสายเลือดที่เรียบง่ายจะเพียงพอที่จะคิดออกอัลลีลหรือรุ่นของยีนที่พวกเขามีของแต่ละคน ในการปกครองง่าย ๆ คนที่มีอัลลีลที่โดดเด่น (แสดงด้วยตัวพิมพ์ใหญ่) มักจะมีลักษณะที่รุ่นนั้นหมายถึงไม่ว่าอัลลีลอื่น ๆ ต้องใช้อัลลีลแบบถอยกลับสองอัน (แทนด้วยตัวพิมพ์เล็ก) เพื่อแสดงเวอร์ชันนั้น กล่าวอีกนัยหนึ่งอัลลีลที่โดดเด่นมักจะปกปิดรุ่นที่ด้อยของยีนนั้น นี่คือตัวอย่างของแผนภูมิสายเลือด:

แผนภูมิ PEDIGREE

แต่ละแถวที่นี่เป็นยุค แวดวงเป็นเพศหญิงสี่เหลี่ยมเพศชายเส้นแนวนอนคือการแต่งงานเด็กเส้นแนวตั้ง ค่อนข้างง่าย สีดำหมายถึงฟีโนไทป์ถอยสีขาวที่โดดเด่น เริ่มต้นจากด้านบน (ถือว่าอัลลีลเป็นAและa) เรารู้ว่าคนที่ 2 มีaarecessive homozygous เพราะนั่นเป็นตัวเลือกเดียวที่เป็นไปได้สำหรับฟีโนไทป์ถอย ตอนนี้แม้ว่าคนคนหนึ่งอาจเป็นได้ทั้งฟีโนไทป์AaหรือAAที่โดดเด่นเพราะเขามีเด็กถอยเขาต้องAaหรือ heterozygous คุณสามารถทำสิ่งนี้กับคนอื่นทั้งหมด ในกรณีที่คุณไม่ได้มีข้อมูลใด ๆ A_ที่ช่วยให้คุณสามารถที่จะคิดออกอัลลีลที่สองก็สามารถทำได้เช่นดังนั้น:

งานของคุณ

  • คุณจะได้รับแผนภูมิสายเลือดในรูปแบบของรายการของรุ่นเช่น[GenI, GenII, etc.]ในรูปแบบสติใด ๆ
  • แต่ละรุ่นจะเป็นรายการของสตริงแต่ละสตริงแสดงถึงบุคคล
  • ผู้คนประกอบด้วยสามส่วน - รหัสประจำตัวฟีโนไทป์และ "การเชื่อมต่อ" ของพวกเขา
  • ID ของพวกเขาเป็นตัวละครเดียว ASCII พิมพ์ที่เป็นเอกลักษณ์ในทั้งต้นอื่นที่ไม่ใช่หรือA a(ไม่ไม่เกิน 95 คนในแผนภูมิ)
  • ฟีโนไทป์ของพวกเขาคือหนึ่งAหรือa, Aการเป็นอัลลีลที่โดดเด่นและaเป็นถอย
  • การเชื่อมต่อของพวกเขาเป็นลำดับของ ID ของคนอื่น ๆ ที่พวกเขามีการเชื่อมต่อด้วย
  • การเชื่อมต่อในรุ่นเดียวกันคือการแต่งงานในรุ่นที่แตกต่างกันคือเด็กและผู้ปกครอง
  • การเชื่อมต่อจะถูกทำซ้ำทั้งสองด้าน (เช่นสามีบอกว่าเขาเป็นสามีของภรรยาและภรรยาบอกว่าเธอเป็นสามีของภรรยา)
  • คุณต้องเข้าใจจีโนไทป์ของทุกคนให้มากที่สุด
  • ส่งคืนรายการเดียวกันยกเว้นแทนที่ด้วยคนใส่จีโนมของพวกเขาในตำแหน่งเดียวกัน
  • ลักษณะทางพันธุกรรมจะต้องมีการออกมาในการสั่งซื้อเพื่อให้แทนAaaA
  • รูปแบบการป้อนข้อมูลเล็ก ๆ น้อย ๆ นั้นใช้ได้
  • นี่คือ code-golf ดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ

ตัวอย่าง

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

2a) หากเด็กAมีผู้ปกครองaaและAจะกลายเป็นAa
2b) หากเด็กAมีผู้ปกครองAและAจะกลายเป็นA_
2c) (เป็นไปไม่ได้ที่เด็กAจะมีผู้ปกครองaaและaa)

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.