首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算谱系

计算谱系
EN

Code Golf用户
提问于 2015-06-12 21:02:31
回答 1查看 947关注 0票数 22

一个小小的遗传学课

当你只能接触到某人的有形特征或表型时,他们家族史的谱系通常被用来找出每个家庭成员的实际遗传信息或基因型。

当像我们一样处理简单优势时,一个简单的谱系图就足以找出每个人的等位基因,或者他们所拥有的基因的版本。在简单的支配地位中,拥有显性等位基因(用大写字母表示)的人将始终具有该版本所代表的特征,而不管其他等位基因如何。需要两个隐性等位基因(用小写字母表示)才能表达该版本。换句话说,显性等位基因总是掩盖该基因的隐性版本。下面是一个系谱图的例子:

这里的每一行都是一代人。圆圈是女性,男性是正方形,水平线是婚姻,垂直线条是子女。很简单。黑色指隐性表型,白色,显性。从上面开始,(假设等位基因是Aa),我们知道person 2有aa,纯合隐性,因为这是隐性表型的唯一可能选择。现在,即使一个人可能是AaAA都是显性表型,因为他有一个隐性的孩子,他必须是Aa,或杂合子。你可以为其他人这么做。如果您没有任何使您能够计算出第二个等位基因的信息,则可以这样做:A_

您的任务

  • 您将收到一个血统图的形式,如[GenI, GenII, etc.]的任何正常格式的世代列表的形式。
  • 每一代将是一个字符串列表,每个字符串代表一个人。
  • 人是由三个部分组成的-一个身份,他们的表型,和他们的“联系”。
  • 它们的ID是一个可打印的ascii字符,它在整个树中是唯一的,而不是Aa。(不,图表上的人数不会超过95人)。
  • 其表型为AaA为显性等位基因,a为隐性等位基因。
  • 它们的连接是与它们有关联的其他人的ID序列。
  • 同一世代的联系是婚姻,在不同的世代是子女和父母。
  • 双方都有这种联系(即丈夫说他是妻子的丈夫,妻子说她是妻子的丈夫)。
  • 你必须尽可能多地找出每个人的基因型。
  • 返回相同的列表,除了人们,把他们的基因型放在相同的位置。
  • 基因型必须按顺序输出,所以Aa而不是aA
  • 在输入格式上有一点回旋余地是可以的。
  • 这是代码-高尔夫,所以最短的答案,以字节赢。

示例

代码语言:javascript
复制
[["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个字节。对于三种表型的检测,而不是整个图表中的两种,将不完全/协同优势应用到算法中。
EN

回答 1

Code Golf用户

发布于 2019-11-19 09:50:38

05AB1E,39 字节数

代码语言:javascript
复制
εNUε'aåi„aaë¯.øX<X>‚è˜y2£lSδåPài„Aaë„A_

我的Java回答港。

在网上试试验证所有测试用例.

解释:

代码语言:javascript
复制
ε                     # 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)
票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/51658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档