6

「Mensa Bulletin」の 2012 年 7 月号に、「The Digital Brain」というタイトルの記事があります。その中で、著者は人間の脳を base64 コンピューティングに関連付けています。最後にヒントがあり、かなり面白くて楽しい記事です。このプロンプトは、読者に、シトシン シトシン グアニン シトシン アデニン グアニンが 2011 に等しいという事実を使用して、シトシン グアニン アデニン グアニン アデニン グアニンを 10 進数に変換するように求めます (最初に言及されたコドン セットは略して cgagag で、2 番目は略して ccgcag です)。 aug = 0、uuu = 1、uuc = 2、...、gga == 61、ggg の適切な順序ですべての可能なコドンを表示する記事の表を使用して、基数 64 の数値を基数 10 に変換する必要があります。 = 62、uag = 63。私はこれをやってみることにし、コドン番号をベース 10 に変換し、ベース 10 番号をコドンに変換する Python プログラムを作成することにしました。両方の簡単なアルゴリズムを作成した後、実行しました。プログラムはエラーを出さず、私の番号のコドンをポップアウトし、その逆も同様でした. しかし、それらは間違った数字でした!何がうまくいかないのかわからないので、助けていただければ幸いです。

コードは次のとおりです。

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: Ashwini Chaudhary のおかげで base10ToCodonNum 関数が修正されました。

4

3 に答える 3

2

私はあなたのコードに従うことができなかったので、別の実装を作成しましたが、同じ結果が得られました:

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
于 2012-07-06T07:41:39.163 に答える
1

コードは実際にはbase-64との間で変換されます。問題で行ったのとまったく同じ順序でコドンを定義しなかったのではないかと思います。

あなたがコドンに提供した順序で:

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

あなたが提供した置換で、これは数学的に正しいです。2011年を取得するにはcggcag、入力する必要があります。つまり、まったく同じ順序でコピーしたのでしょうか。

于 2012-07-06T07:31:26.073 に答える
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'

出力:

>>> codon2dec('cgagag')
1978
>>> codon2dec('ccgcag')
1499
于 2012-07-06T07:24:28.737 に答える