首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变异我的DNA序列

变异我的DNA序列
EN

Code Golf用户
提问于 2019-10-15 14:58:44
回答 6查看 5.8K关注 0票数 31

当将DNA翻译成蛋白质时,核糖体读取DNA核苷酸3×3的序列。每组3个核苷酸被称为密码子,每个密码子编码一个氨基酸,存在一些冗余。这是大多数有机体使用的转换表(表读左、上、右):

人类和大多数其他生物只使用一个氨基酸作为“开始”密码子:蛋氨酸,也就是a。相遇,M,或ATG。这意味着任何编码蛋白质的DNA序列都是从ATG开始的,ATG将被翻译机器识别。

然而,三个不同的密码子被用来停止翻译: TAA,TAG和TGA。如果复制机器遇到任何这些,它将停止,翻译的蛋白质将被释放到细胞。

因此,可能发生的最危险的突变之一是会导致蛋白质翻译的早期终止。例如,如果我们取这个DNA序列:

ATGGCCTTCATATCGGCGGACAGCGAATCTGGTGATTAA

分裂成密码子:

ATG GCC TTC ATA TCG GCG GAC AGC GAA TCT GGT GAT TAA

翻译后,将:

met ala phe ile ser ala asp ser glu ser gly asp STOP

但是如果我们在第14位将C替换成A,那么蛋白质序列将是

met ala phe ile STOP

这一替代将在基因组学中写成14C>A

我还可以执行其他替换(例如,25G>T),这些替换会导致早期终止,但14C>A是序列中的第一个,因此在翻译后会产生最短的蛋白质。

挑战

给出一串编码一个蛋白质的核苷酸(第一个密码子是ATG,最后是一个停止),找到第一个替换,这将导致蛋白质翻译的早期终止,从而产生尽可能最短的蛋白质。这是代码高尔夫,所以最少字节赢!

规则和规范

(如果有人问到关于什么是允许的相关问题,这些都会被更新)

  • DNA序列以连续块大写形式存储在字符串中,其中没有空格或标点符号,并且只包含ACGT。如果您想将它存储到二进制(A:00/C:01/G:10/T:11)或整数(A:1/C:2/G:3/T:4),那就好了(您不需要遵循这些编码)。
  • 宣布密码子到氨基酸转换表是高尔夫挑战的一部分。你必须选择你认为相关的部分。大多数软件使用哈希/字典来存储它。
  • 代码应该返回使用首选名称: 14C>A (位置、原始核苷酸、">“、新核苷酸)格式的替换,但是任何包含这三个元素的格式都会被接受。
  • 如果没有可能的早期终止站点,函数应该返回任何容易识别的错误值(引发错误、FALSE、-1等)或不返回任何内容。

测试用例

代码语言:javascript
复制
ATGCACTGTTGGGGAGGCAGCTGTAACTCAAAGCCTTAG
-> 9T>A

ATGGTAGAACGGAGCAGCTGGTCATGTGTGGGCCCACCGGCCCCAGGCTCCTGTCTCCCCCCAGGTGTGTGGTCATGCCAGGCATGCCCTTAG
-> 7G>T

ATGGAACATCAATCTCAGGCACCTGGCCCAGGTCATTAA
-> 4G>T

ATGTGCCAAGTGCATTCTTGTGTGCTTGCATCTCATGGAACGCCATTTCCCCAGACATCCCTGTGGCTGGCTCCTGATGCCCGAGGCCCATGA
-> 6C>A

ATGCTTTTCCATGTTCTTTGGCCGCAGCAAGGCCGCTCTCACTGCAAAGTTAACTCTGATGCGTGA
-> 20G>A

ATGGTAGAGTAA
-> 7G>T

ATGGTTCCACGGTAA
-> ERROR
EN

回答 6

Code Golf用户

发布于 2019-10-15 19:26:30

果冻,30 字节数

代码语言:javascript
复制
os3ḅ4f“EGM‘Ḋ
JṬ€×Ɱ4ZẎçƇ⁸ḢĖżW€Ṁ

接受整数列表(分别在[1,2,3,4]映射到ACGT中)的一元链接,它生成整数列表( [[position, new nucleotide], original nucleotide] )。

(具有start和stop的有效序列,但没有可能导致早期终止的替代,将输出[[4]])

在网上试试!

...Or参见这个版本,它既执行来自ACGT输入格式的转换,又执行到{position}{original nucleotide}>{new nucleotide}输出格式的转换。

怎么做?

代码语言:javascript
复制
os3ḅ4f“EGM‘Ḋ      - helper Link: [0,...,0,new nucleotide], N; DNA integer list, A
o                 - (N) logical OR (A) (vectorises)
 s3               - split into chunks of three
   ḅ4             - convert from base four to integer
      “EGM‘       - code-page index list = [69,71,77]
     f            - filter keep (i.e. only keep stops)
           Ḋ      - dequeue (so if only a single stop was found and hence no early
                             stops we'll have an empty list which is falsey)

JṬ€×Ɱ4ZẎçƇ⁸ḢĖżW€Ṁ - Main Link: DNA integer list, A
J                 - range of length (of A) -> [1,2,...]
 Ṭ€               - untruth each -> [[1],[0,1],[0,0,1],...]
   ×Ɱ4            - map across [1,2,3,4[ performing multiplication
      Z           - transpose
       Ẏ          - tighten -> [[1],[2],[3],[4],[0,1],[0,2],[0,3],[0,4],[0,0,1],...]
                  - (call that X)
          ⁸       - use chain's left argument, A, as the right argument
         Ƈ        - filter keep those (x in X) for which this is truthy:
        ç         -   call the helper link as a dyad f(x, A)
           Ḣ      - head (which will be the shortest)
            Ė     - enumerate (that)
              W€  - wrap each (integer a in A) in a list
             ż    - zip left and right together
                Ṁ - get the maximum
票数 5
EN

Code Golf用户

发布于 2019-10-16 09:46:24

Python 3,88字节

代码语言:javascript
复制
f=lambda i,j,k,*l,n=1:(j+k<4)*(n,i,5)+(i-k>2)*(n+1,j,1)or(i-j>2)*(n+2,k,1)or f(*l,n=n+3)

在网上试试!

没有正则表达式的解。分别将1235用于AGCT。将每个基作为单独的参数。将建议A用于T*A, T*G, TA*, TG*的任何实例。输出为(position, original base, new base)。在没有早期终止站点时返回(无效)6元素元组。

解释

代码语言:javascript
复制
f=lambda i,j,k,*l,n=1:
  (j+k<4)         # If the last two bases are 1+1 (AA), 1+2 (AG) or 2+1 (AG)
    *(n,i,5)      #   Return (position, 1st base, 5 (T))
  +(i-k>2)        # If the 1st base is 5 (T) and the 3rd base 1 (A) or 2 (G) 
    *(n+1,j,1)    #   Return (position, 2nd base, 1 (A))
  or(i-j>2)       # If the 1st base is 5 (T) and the 2nd base 1 (A) or 2 (G) 
    *(n+2,k,1)    #   Return (position, 3rd base, 1 (A))
  or f(*l,n=n+3)  # Else process the next three bases
票数 5
EN

Code Golf用户

发布于 2019-10-16 03:34:24

C# (可视化C#交互式编译器),138个字节

代码语言:javascript
复制
x=>{for(int i=0;;i++)foreach(var k in"AGT")if("TAG TAA TGA".Contains(x.Remove(i,1).Insert(i,k+"").Substring(i-i%3,3)))return(i+1,x[i],k);}

在网上试试!

票数 4
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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