2012-07-06 72 views
6

在2012年7月号的“Mensa Bulletin”中,有一篇题为“The Digital Brain”的文章。其中作者将人脑与base64计算联系起来。这是一个相当有趣和有趣的文章,并在最后提示。所述提示要求读者使用胞嘧啶胞嘧啶鸟嘌呤胞嘧啶腺嘌呤鸟嘌呤等于2011的事实将胞嘧啶鸟嘌呤腺嘌呤鸟嘌呤腺嘌呤鸟嘌呤转换为碱基10数(第一个密码子组简称为cgagag,第二个密码子简称ccgcag)。基本上你必须使用文章中的一个表格,将基数64的数字转换为基数10,该表格以适当的顺序显示所有可能的密码子,其中aug = 0,uuu = 1,uuc = 2,...,gga == 61,ggg = 62,uag = 63。我决定放弃这一点,并决定编写一个python程序,将密码子数字转换为10位数字,并将10位数字转换为密码子。在为这两者编写快速算法后,我跑了它。该程序没有给出错误,并为我的号码弹出密码,反之亦然。但是,他们是错误的数字!我似乎无法看到发生了什么问题,并非常感谢任何帮助。将密码子(碱基64)转换为碱基10数字

事不宜迟,代码:

codons = ['aug', 'uuu', 'uuc', 'uua', 'uug', 'ucu', 'ucc', 'uca', 'ucg', 'uau', 'uac', 'uaa', 'ugu', 'ugc', 'uga', 'ugg', 'cuu', 'cuc', 'cua', 'cug', 'ccu', 'ccc', 'cca', 'ccg', 'cau', 'cac', 'caa', 'cag', 'cgu', 'cgc', 'cga', 'cgg', 'auu', 'auc', 'aua', 'acu', 'acc', 'aca', 'acg', 'aau', 'aac', 'aaa', 'aag', 'agu', 'agc', 'aga', 'agg', 'guu', 'guc', 'gua', 'gug', 'gcu', 'gcc', 'gca', 'gcg', 'gau', 'gac', 'gaa', 'gag', 'ggu', 'ggc', 'gga', 'ggg', 'uag' ] 

def codonNumToBase10 (codonValue) : 

    numberOfChars = len(codonValue) 

    # check to see if contains sets of threes 
    if len(codonValue) % 3 != 0 : 
     return -1 

    # check to see if it contains the correct characters 
    for i in range(0, numberOfChars) : 
     if codonValue[i] != 'a' : 
      if codonValue[i] != 'u' : 
       if codonValue[i] != 'c' : 
        if codonValue[i] != 'g' : 
         return -2 

    # populate an array with decimal versions of each codon in the input 
    codonNumbers = [] 
    base10Value = 0 
    numberOfCodons = int(numberOfChars/3) 
    for i in range(0, numberOfCodons) : 
     charVal = codonValue[ 0 + (i*3) ] + codonValue[ 1 + (i*3) ] + codonValue[ 2 + (i*3) ] 
     val = 0 
     for j in codons : 
      if j == charVal : 
       codonNumbers.append(val) 
       break 
      val += 1 
     base10Value += (pow(64, numberOfCodons - i - 1)) * codonNumbers[i] 

    return base10Value 

def base10ToCodonNum (number) : 
    codonNumber = '' 
    hitZeroCount = 0 
    while(1==1) : 
     val = number % 64 
     number = int(number/64) 
     codonNumber = codons[val] + codonNumber 
     if number == 0 : 
      if hitZeroCount > 0: 
       break 
      hitZeroCount += 1 
    return codonNumber 

val_2011 = 'ccgcag' 
val_unknown = 'cgagag' 

print(base10ToCodonNum(codonNumToBase10(val_2011)), '::', codonNumToBase10(val_2011)) 
print(base10ToCodonNum(codonNumToBase10(val_unknown)), '::', codonNumToBase10(val_unknown)) 

编辑1:我得到的值是1499的ccgcag和1978年cgagag。

编辑2:base10ToCodonNum功能固定感谢Ashwini乔杜里。

+1

什么的''auguuuuuc'您预期的输出? – 2012-07-06 07:19:22

+0

只要计算我发现ccg = 23和cag = 27,这也可以通过脚本找到。但是:23 * 64 + 27 = 1499,这是您的脚本的结果。因此,我可以看到:结果是正确的?!这可能是一个愚蠢的问题,但是:你是否按照正确的顺序复制了密码? – 2012-07-06 07:26:49

+0

@Sonryell:你的结果对于给定的表格来说似乎是正确的。 – 2012-07-06 07:35:46

回答

1

您的代码实际上并不相互转换的基础-64。我怀疑你没有按照他们在问题中的顺序来确定密码子。

与您提供的密码子的顺序:

'ccgcag' = codons.index('ccg') * 64 + codons.index('cag') = 23 * 64 + 27 = 1499

在数学上是正确的,你所提供的换人。要得到2011年,你必须把cggcag - 所以,你确定你复制他们在完全相同的顺序?

+0

@Jakob S.和P​​aul:有一个uuu的重复(其中一个应该是auu),但这并不影响我使用的数字。我重新输入表格并获得相同的答案 – Sonryell 2012-07-06 07:43:53

+0

对于该表格,“ccgcag”根本不等于“2011” – 2012-07-06 07:51:31

+0

我认为作者要么使用完全不同的表格,在这种情况下,期望读者推断出来是荒谬的他的密码子表,或者更可能是文章中的一个错字。这篇文章中给出的表格是RNA密码子最常见的顺序,但是我不这么认为,我不是一个遗传学家,只是一个物理学家。 – Sonryell 2012-07-06 08:00:28

1
def codon2dec(x): 
    codons = ['aug', 'uuu', 'uuc', 'uua', 'uug', 'ucu', 'ucc', 'uca', 'ucg', 'uau', 'uac', 'uaa', 'ugu', 'ugc', 'uga', 'ugg', 'uuu', 'cuc', 'cua', 'cug', 'ccu', 'ccc', 'cca', 'ccg', 'cau', 'cac', 'caa', 'cag', 'cgu', 'cgc', 'cga', 'cgg', 'auu', 'auc', 'aua', 'acu', 'acc', 'aca', 'acg', 'aau', 'aac', 'aaa', 'aag', 'agu', 'agc', 'aga', 'agg', 'guu', 'guc', 'gua', 'gug', 'gcu', 'gcc', 'gca', 'gcg', 'gau', 'gac', 'gaa', 'gag', 'ggu', 'ggc', 'gga', 'ggg', 'uag' ] 
    if len(x)%3==0: 
     x=[''.join((x[i],x[i+1],x[i+2])) for i in range(0,len(x),3)] 
     try: 
      return sum(codons.index(y)*(64**(len(x)-1-i)) for i,y in enumerate(x)) 

     except ValueError: 
      return 'invalid input' 


    else: 
     return 'invalid input' 

输出:

>>> codon2dec('cgagag') 
1978 
>>> codon2dec('ccgcag') 
1499 
+0

正如问题所述:“胞嘧啶胞嘧啶鸟嘌呤胞嘧啶腺嘌呤鸟嘌呤[ccgcag]等于2011” - >似乎你的答案不是答案;)? – 2012-07-06 07:31:36

+0

您得到的值是密码子列表中每个密码子的位置。这不是不幸的实际数字。您必须使用类似的方法将十六进制数转换为十进制数,而使用hexidecimaltradecimal数的十六进制数。看http://mathforum.org/library/drmath/view/55785.html以供参考。 – Sonryell 2012-07-06 07:35:09

+0

@JakobS。解决方案更新 – 2012-07-06 07:52:50

2

我跟不上你的代码,所以我做了另一种实现方式,但我得到了相同的结果:

CODONS = [ 
    'aug', 'uuu', 'uuc', 'uua', 'uug', 'ucu', 'ucc', 'uca', 
    'ucg', 'uau', 'uac', 'uaa', 'ugu', 'ugc', 'uga', 'ugg', 
    'uuu', 'cuc', 'cua', 'cug', 'ccu', 'ccc', 'cca', 'ccg', 
    'cau', 'cac', 'caa', 'cag', 'cgu', 'cgc', 'cga', 'cgg', 
    'auu', 'auc', 'aua', 'acu', 'acc', 'aca', 'acg', 'aau', 
    'aac', 'aaa', 'aag', 'agu', 'agc', 'aga', 'agg', 'guu', 
    'guc', 'gua', 'gug', 'gcu', 'gcc', 'gca', 'gcg', 'gau', 
    'gac', 'gaa', 'gag', 'ggu', 'ggc', 'gga', 'ggg', 'uag', 
] 

def codon2decimal(s): 
    if len(s) % 3 != 0: 
     raise ValueError("%s doesn't look like a codon number." % s) 
    digits = reversed([ s[i*3:i*3+3] for i in range(len(s)/3) ]) 
    val = 0 
    for i, digit in enumerate(digits): 
     if digit not in CODONS: 
      raise ValueError("invalid sequence: %s." % digit) 
     val += CODONS.index(digit) * 64 ** i 
    return val 

def main(): 
    for number in ('cggcag', 'ccgcag', 'cgagag', 'auguuuuuc'): 
     print number, ':', codon2decimal(number) 

if __name__ == '__main__': 
    main() 

结果:

cggcag : 2011 
ccgcag : 1499 
cgagag : 1978 
auguuuuuc : 66 
+0

我不是最伟大的Python程序员,我主要用它来快速算法或检查一个想法。我大部分时间都花在Mathematica或C++上。所以,我的代码可能不是最清楚也不是最有效的。我为此道歉。但似乎大多数人都得到了与我一样的答案......我开始认为这是文章中的一个错字,或者作者使用了与发布的完全不同的表格。 – Sonryell 2012-07-06 07:53:17

+0

@Sonryell:不需要道歉。如果你遇到了合适的桌子,你会介意分享吗? – 2012-07-06 07:57:43

+0

有了这张表,'cggcag'给出了2011年。可能是原始出版物中的拼写错误吗? – 2012-07-06 08:02:33