在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乔杜里。
什么的''auguuuuuc'您预期的输出? – 2012-07-06 07:19:22
只要计算我发现ccg = 23和cag = 27,这也可以通过脚本找到。但是:23 * 64 + 27 = 1499,这是您的脚本的结果。因此,我可以看到:结果是正确的?!这可能是一个愚蠢的问题,但是:你是否按照正确的顺序复制了密码? – 2012-07-06 07:26:49
@Sonryell:你的结果对于给定的表格来说似乎是正确的。 – 2012-07-06 07:35:46