En la edición de julio de 2012 de "Mensa Bulletin" hay un artículo titulado "El cerebro digital". En él, el autor relaciona el cerebro humano con la computación base64. Es un artículo bastante interesante y divertido con un mensaje al final. Dicho mensaje le pide al lector que convierta la citosina guanina adenina guanina adenina guanina en un número base 10 utilizando el hecho de que la citosina citosina guanina citosina adenina guanina es igual a 2011 (el primer conjunto de codones mencionado es cgagag para abreviar y el segundo es ccgcag para abreviar). tienes que convertir un número de base 64 en base 10 usando una tabla en el artículo que muestra todos los codones posibles en el orden correcto con aug = 0, uuu = 1, uuc = 2, ..., gga == 61, ggg = 62, uag = 63. Decidí probar esto y decidí escribir un programa python para convertir los codones en base 10 y base 10 en codones. Después de escribir un algoritmo rápido para ambos, lo ejecuté. El programa no dio errores y sacó codones para mis números y viceversa. Sin embargo, ¡eran los números equivocados! Parece que no puedo ver qué está yendo mal y agradecería mucho cualquier ayuda.Conversión de codones (base 64) a una base 10 número
Sin más, el código:
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))
EDIT 1: Los valores que estoy recibiendo son de 1499 y 1978 para ccgcag cgagag.
EDIT 2: función base10ToCodonNum corregida gracias a Ashwini Chaudhary.
¿cuál es su salida esperada para '' auguuuuuc'? –
Solo contando encuentro ccg = 23 y cag = 27, que también se encuentra en el script. Pero: 23 * 64 + 27 = 1499, que es el resultado de su secuencia de comandos. Entonces, ¿qué puedo ver: el resultado es simplemente correcto? Probablemente sea una pregunta tonta, pero: ¿has copiado los codones en el orden correcto? –
@Sonryell: su resultado parece correcto para la tabla dada. –