Python 将密码子(以64为基数)转换为以10为基数的数字
在2012年7月的《门萨公告》中,有一篇题为“数字大脑”的文章,作者将人脑与base64计算联系起来。这是一篇相当有趣的文章,结尾有提示。该提示要求读者使用胞嘧啶鸟嘌呤胞嘧啶腺嘌呤胞嘧啶腺嘌呤鸟嘌呤等于2011的事实将胞嘧啶鸟嘌呤胞嘧啶腺嘌呤鸟嘌呤转换为10碱基数字(提到的第一个密码子集简称cgagag,第二个密码子集简称ccgcag)基本上,您必须使用本文中的一个表格将基数64转换为基数10,该表格以正确的顺序显示所有可能的密码子,其中aug=0、uuu=1、uuc=2、,gga=61,ggg=62,uag=63。我决定试一试,并决定编写一个python程序,将密码子数转换为基数10,将基数10转换为密码子。在为两者编写了一个快速算法之后,我运行了它。程序没有给出任何错误,并弹出了我的数字密码,反之亦然。然而,他们打错了号码!我看不出哪里出了问题,非常感谢您的帮助 不用多说,代码:Python 将密码子(以64为基数)转换为以10为基数的数字,python,numbers,Python,Numbers,在2012年7月的《门萨公告》中,有一篇题为“数字大脑”的文章,作者将人脑与base64计算联系起来。这是一篇相当有趣的文章,结尾有提示。该提示要求读者使用胞嘧啶鸟嘌呤胞嘧啶腺嘌呤胞嘧啶腺嘌呤鸟嘌呤等于2011的事实将胞嘧啶鸟嘌呤胞嘧啶腺嘌呤鸟嘌呤转换为10碱基数字(提到的第一个密码子集简称cgagag,第二个密码子集简称ccgcag)基本上,您必须使用本文中的一个表格将基数64转换为基数10,该表格以正确的顺序显示所有可能的密码子,其中aug=0、uuu=1、uuc=2、,gga=61,ggg
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:我得到的ccgcag值为1499,cgagag值为1978
编辑2:Base10ToCodonum函数由于Ashwini Chaudhary而修复
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
您的代码实际上会与base-64进行转换。我怀疑你没有按照问题中的顺序定义密码子 按照您为密码子提供的顺序:
'ccgcag'=密码子索引('ccg')*64+密码子索引('cag')=23*64+27=1499
这在数学上是正确的,有你提供的替换。要获得2011年,您必须输入
cggcag
-那么,您确定您复制它们的顺序完全相同吗?我无法遵循您的代码,因此我进行了另一个实现,但得到了相同的结果:
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
“AuguuUuc”的预期输出是什么?通过计算,我发现ccg=23和cag=27,这也可以通过脚本找到。但是:23*64+27=1499,这是脚本的结果。所以我可以看到:结果完全正确?!这可能是一个愚蠢的问题,但是:你复制密码子的顺序正确吗?@Sonryell:你的结果对于给定的表来说似乎是正确的。@AshwiniChaudhary,哇,你是对的。Base10ToCodonum函数有一点错误。谢谢你向我指出这一点!正如问题中所述:“胞嘧啶-胞嘧啶-鸟嘌呤-胞嘧啶-腺嘌呤-鸟嘌呤[ccgcag]等于2011”->似乎你的答案不是答案;)?您得到的值是密码子列表中每个密码子的位置。不幸的是,这不是实际数字。您必须使用与将十六进制数转换为十进制数类似的方法,但您使用的是十六进制数,而不是十六进制数。请看以供参考。@Jakob S.和Paul:有一个重复的uuu(其中一个应该是auu),但这并不影响我使用的数字。我重新输入了表格,得到了与该表格相同的答案,
ccgcag
根本不等于2011
我认为作者要么使用了一个完全不同的表格,在这种情况下,期望读者推断他的密码子表是荒谬的,或者更可能是文章中的一个打字错误。这篇文章中给出的表格是RNA密码子最常见的顺序,但请不要相信我的话,我不是遗传学家,只是一个物理学家。如果那篇公告曾经发布过一个错误,我很想知道我已经得到它好几年了,我还没有看到一个勘误表页面。我不是最伟大的python程序员,我主要用于快速算法或检查想法。我的大部分时间都花在Mathematica或C++上。因此,我的代码可能不是最清晰也不是最有效的。我为此道歉。但似乎大多数人都得到了和我一样的答案。。。我开始认为这是文章中的一个打字错误,或者作者使用了与发表的表格完全不同的表格。@Sonryell:没必要道歉。如果你遇到了合适的表格,你介意分享吗?有了这个表格,“cggcag”给出了2011年。可能是原始出版物中的打字错误?正确的顺序是索引31处有ccg,索引27处有cag的任何表格。列表中的其余部分可以是任意顺序,可以给出大约3.14699733×10^85个不同的组合(如果我的计算正确的话)