Преобразование кодонов (с основанием 64 )в число с основанием 10

В июльском номере журнала Mensa Bulletin за 2012 год есть статья под названием «Цифровой мозг». В нем автор связывает человеческий мозг с вычислениями base64. Это довольно интересная и забавная статья с подсказкой в ​​конце. Упомянутая подсказка предлагает читателю преобразовать Цитозин Гуанин Аденин Гуанин Аденин Гуанин в число с основанием 10, используя тот факт, что Цитозин Цитозин Гуанин Цитозин Аденин Гуанин равен 2011 (. Первый упомянутый набор кодонов для краткости — cgagag, а второй — для краткости ccgcag. )В основном вам нужно преобразовать число с основанием 64 в основание 10, используя таблицу в статье, которая отображает все возможные кодоны в правильном порядке с aug = 0, uuu = 1, uuc = 2,..., gga = = 61, ggg = 62, uag = 63. Я решил попробовать и остановился на написании программы на python для преобразования чисел кодонов в 10 и 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 исправлена ​​благодаря Ашвини Чаудхари.

6
задан Shai 24 June 2013 в 09:24
поделиться