2017-09-09 5 views
-1

通報推測するmRNAの正の整数AA nnは、AAモジュロNN(速記で書かamodnamodn)はAAがNNで割った余りであるためのタンパク質ロザリンド

から。例えば、29 = 11×2 + 729 = 11×2 + 7であるから、29mod11 = 729mod11 = 7となる。

モジュラ演算は、モジュロ演算に関する加算、減算、乗算、および除算の研究です。 amodn = bmodnamodn = bmodnならば、aaとbbは一致したnnであると言う。この場合、a≡bmodna≡bmodnの表記を使用します。

モジュラ演算の2つの有用な事実は、a≡bmodna≡bmodnおよびc≡dmodnc≡dmodnの場合、a +c≡b+ dmodna +c≡b+ dmodnおよびa×c≡b×dmodna×c≡ b×dmodn。これらのルールの理解を確認するには、a = 29a = 29、b = 73b = 73、c = 10c = 10、d = 32d = 32、n = 11n = 11の関係を確認してください。

この演習では、いくつかのロザリンド問題は、このような大きな数を格納することによって生じる計算上の落とし穴を避けるために、より小さな数を法とする(非常に大きな)整数解を求めます。

与えられる:長さが1000aa以下のタンパク質ストリング。

リターン:蛋白質が翻訳された可能性のある異なるRNAストリングの総数(モジュロ1,000,000)。 (タンパク質翻訳における終止コドンの重要性を無視しないでください。)私の答えは常にゼロに設定されている

サンプルデータセット

MA

サンプル出力。 modを使用する方法にいくつかの問題があることを認識していますが、正確なものは何か分かりません。

rna_table = {"UUU":"F", "UUC":"F", "UUA":"L", "UUG":"L", 
"UCU":"S", "UCC":"s", "UCA":"S", "UCG":"S", 
"UAU":"Y", "UAC":"Y", "UAA":"STOP", "UAG":"STOP", 
"UGU":"C", "UGC":"C", "UGA":"STOP", "UGG":"W", 
"CUU":"L", "CUC":"L", "CUA":"L", "CUG":"L", 
"CCU":"P", "CCC":"P", "CCA":"P", "CCG":"P", 
"CAU":"H", "CAC":"H", "CAA":"Q", "CAG":"Q", 
"CGU":"R", "CGC":"R", "CGA":"R", "CGG":"R", 
"AUU":"I", "AUC":"I", "AUA":"I", "AUG":"M", 
"ACU":"T", "ACC":"T", "ACA":"T", "ACG":"T", 
"AAU":"N", "AAC":"N", "AAA":"K", "AAG":"K", 
"AGU":"S", "AGC":"S", "AGA":"R", "AGG":"R", 
"GUU":"V", "GUC":"V", "GUA":"V", "GUG":"V", 
"GCU":"A", "GCC":"A", "GCA":"A", "GCG":"A", 
"GAU":"D", "GAC":"D", "GAA":"E", "GAG":"E", 
"GGU":"G", "GGC":"G", "GGA":"G", "GGG":"G"} 

with open("rosalind_mrna.txt") as myfile: 

    data = myfile.readlines() 

charData = list(data[0].strip()) 


frequency_list = {}; 

for k,v in rna_table.items(): 

    if not frequency_list.has_key(v): 
    frequency_list[v] = 1 
    else: 
    frequency_list[v] += 1 

answer = frequency_list['STOP']; 
for aa in charData: 
    answer = ((answer * frequency_list[aa]) % 1000000) 

print "Answer is:\n" 
print answer % 1000000 
+0

どのようにすることができますタンパク質翻訳において終止コドンの重要性を無視しないでください。 – PRMoureu

+0

http://rosalind.info/problems/mrna/の元の問題を参照してください。フォーマットは少し面白いです。 –

+0

入力ファイルはどのように見えますか?冒頭に空の行がある可能性はありますか? –

答えて

0

マイナーな問題のカップル:

  • あなたはタイプミスがあります:"UCC":"s""UCC":"S"
  • if not frequency_list.has_key(v):がよりPythonically if v not in frequency_list:(実際.has_keyにはPython 3から取り外された)
  • として書かれなければなりません
  • charData = list(data[0].strip()) - list()が必要でない場合は、そのまま文字列を繰り返し処理できます
  • frequency_list = {}; - 最後のセミコロンが
  • print answer % 1000000を必要とされていません - 最終% 1000000は不要であり、それはすでにanswer

の計算ループで行われていたので、それは、例のように見えますMA

のように動作します
(
    {number of ways to encode M == 1} 
    * {number of ways to encode A == 4} 
    * {number of ways to encode STOP == 3} 
) 
% 1000000 

これは前述のように12を与える。

あなたのコードは現状のままで動作し、827968を返します。rosalind_mrna.txtのコピーを見て(空白でないことを確認してください)、dataの内容をチェックします(ファイルが正しくロードされていることを確認してください)。あなたはモジュロを使用しない場合

ただ、比較のために、私は、金利については

from functools import reduce 
from operator import mul 

freq = { 
    'A': 4, 'C': 2, 'D': 2, 'E': 2, 
    'F': 2, 'G': 4, 'H': 2, 'I': 3, 
    'K': 2, 'L': 6, 'M': 1, 'N': 2, 
    'P': 4, 'Q': 2, 'R': 6, 'S': 6, 
    'T': 4, 'V': 4, 'W': 1, 'Y': 2, 
    'STOP': 3 
} 

def load_dna_file(fname): 
    with open(fname) as inf: 
     dna = inf.read() 
    return "".join(dna.split()) # removes all whitespace 

def num_rna_strings(dna, modulo=None): 
    if modulo: 
     reduce_fn = lambda a, b: (a * b) % modulo 
    else: 
     reduce_fn = mul 
    freqs = (freq[base] for base in dna) 
    return reduce(reduce_fn, freqs, freq["STOP"]) 

def main(): 
    dna = load_dna_file("rosalind_mrna.txt") 
    num = num_rna_strings(dna, 1000000) 
    print("Answer is {}".format(num)) 

if __name__ == "__main__": 
    main() 

としてそれを記述し、完全な答えは、423桁の長さ(6.186 * 10 ** 422)

関連する問題