2012-07-06 30 views
6

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.

+1

¿cuál es su salida esperada para '' auguuuuuc'? –

+0

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? –

+0

@Sonryell: su resultado parece correcto para la tabla dada. –

Respuesta

1

Su código tiene realmente convertir hacia y desde la base-64. Sospecho que no definiste los codones en el mismo orden en que lo hicieron en el problema.

Con el fin de que usted ha proporcionado a los codones:

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

Cuál es matemáticamente correcto, con las sustituciones que nos has proporcionado. Para obtener 2011, debe ingresar cggcag, entonces, ¿está seguro de haberlos copiado exactamente en el mismo orden?

+0

@Jakob S. y Paul: Hubo una repetición de uuu (se suponía que uno de ellos era auu) pero eso no afectó los números que estaba usando. Volví a escribir la tabla y recibo las mismas respuestas – Sonryell

+0

Con esa tabla, 'ccgcag' simplemente no es igual a '2011' –

+0

Creo que el autor o bien utilizó una tabla completamente diferente, en cuyo caso es ridículo esperar que el lector deduzca su tabla de codones o, más probablemente, era un error tipográfico en el artículo. La tabla dada en el artículo es el orden más común para los codones de ARN, pero no se lo tome en serio, no soy un genetista, solo un físico. – Sonryell

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' 

de salida:

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

Como se indicó en la pregunta: "La citosina citosina guanina citosina adenina guanina [ccgcag] es igual a 2011" -> parece que su respuesta no es la respuesta;)? –

+0

Los valores que obtiene son las posiciones de cada codón en la lista de codones. Este no es el número real, lamentablemente. Debe usar un método similar a la conversión de un número hexadecimal a un número decimal, pero en su lugar un hexadecimal está utilizando un número hexadecimaltradecimal. Mire http://mathforum.org/library/drmath/view/55785.html para referencia. – Sonryell

+0

@JakobS. solución actualizada –

2

no podía seguir a su código, por lo que hizo otra aplicación, pero me dieron los mismos resultados:

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() 

resultados:

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

No soy el mejor programador de Python, lo uso principalmente para algoritmos rápidos o para verificar una idea. La mayor parte de mi tiempo lo paso con Mathematica o C++. Entonces, mi código probablemente no sea el más claro ni el más eficiente. Me disculpo por eso. Pero parece que la mayoría de las personas obtienen la misma respuesta que yo ... Estoy empezando a pensar que fue un error tipográfico en el artículo o que el autor utilizó una tabla completamente diferente a la publicada. – Sonryell

+0

@Sonryell: no hay necesidad de disculparse. Si alguna vez encuentras la mesa correcta, ¿te importaría compartirla? –

+0

Con esta tabla, 'cggcag' da 2011. ¿Puede ser un error tipográfico en la publicación original? –

Cuestiones relacionadas