2012-07-06 17 views
6

Trong ấn bản tháng 7 năm 2012 của "Mensa Bulletin" có một bài viết mang tựa đề "The Brain kỹ thuật số". Trong đó tác giả liên hệ bộ não con người với máy tính base64. Nó là một bài viết khá thú vị và thú vị với một dấu nhắc ở cuối. Lời nhắc được yêu cầu người đọc chuyển đổi Cytosine Guanine Adenine Guanine Adenine Guanine thành số cơ sở 10 bằng cách sử dụng Cytosine Cytosine Guanine Cytosine Adenine Guanine bằng năm 2011 (bộ mã đầu tiên được đề cập là cgagag cho ngắn và thứ hai là ccgcag viết tắt). bạn phải chuyển đổi số cơ sở 64 thành cơ số 10 bằng cách sử dụng một bảng trong bài viết hiển thị tất cả các codon có thể theo thứ tự thích hợp với aug = 0, uuu = 1, uuc = 2, ..., gga == 61, ggg = 62, uag = 63. Tôi đã quyết định cho việc này một lần nữa và quyết định viết một chương trình python để chuyển đổi các số codon thành số 10 và 10 số cơ sở thành các codon. Sau khi viết một thuật toán nhanh cho cả hai, tôi đã chạy nó. Chương trình đã không có lỗi và bật ra codons cho số của tôi và ngược lại. Tuy nhiên, chúng là những con số sai! Tôi không thể nhìn thấy những gì đang xảy ra và sẽ đánh giá rất cao sự giúp đỡ nào.Chuyển mã (cơ số 64) thành số 10

Nếu không có thêm ado, mã:

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: Các giá trị tôi nhận được là 1499 cho ccgcag và 1978 cho cgagag.

EDIT 2: base10ToCodonNum chức năng cố định nhờ Ashwini Chaudhary.

+1

sản lượng dự kiến ​​của bạn cho ' 'auguuuuuc' là gì? –

+0

Chỉ cần đếm tôi tìm ccg = 23 và cag = 27, cũng được tìm thấy bởi tập lệnh của bạn. Nhưng: 23 * 64 + 27 = 1499, đó là kết quả của tập lệnh của bạn. Vì vậy, đối với những gì tôi có thể thấy: kết quả chỉ đơn giản là chính xác?! Đó có thể là một câu hỏi ngớ ngẩn, nhưng: Bạn đã sao chép các codon theo đúng thứ tự? –

+0

@Sonryell: kết quả của bạn có vẻ đúng cho bảng đã cho. –

Trả lời

1

Mã của bạn không thực sự chuyển đổi sang và từ cơ sở-64. Tôi nghi ngờ bạn đã không xác định các codon theo thứ tự chính xác mà họ đã làm trong vấn đề.

Với thứ tự bạn đã cung cấp cho các codon:

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

Đó là về mặt toán học chính xác, với sự thay thế mà bạn đã cung cấp. Để có được năm 2011, bạn phải đặt trong số cggcag - vì vậy, bạn có chắc chắn đã sao chép chúng theo đúng thứ tự không?

+0

@Jakob S. và Paul: Có một sự lặp lại của uuu (một trong số chúng được cho là auu) nhưng điều đó không ảnh hưởng đến những con số tôi đang sử dụng. Tôi lấy lại bảng và nhận được cùng một câu trả lời – Sonryell

+0

Với bảng đó, 'ccgcag' đơn giản không bằng' 2011' –

+0

Tôi nghĩ rằng tác giả hoặc sử dụng một bảng hoàn toàn khác, trong trường hợp đó là vô lý để mong đợi người đọc suy luận bảng mã của anh ta hoặc, nhiều khả năng, nó là một lỗi đánh máy trong bài báo. Bảng được đưa ra trong bài viết là thứ tự phổ biến nhất đối với các codon RNA nhưng không dùng từ ngữ của tôi về điều đó, tôi không phải là một nhà di truyền học, chỉ là một nhà vật lí. – 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' 

đầu ra:

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

Như đã nêu trong câu hỏi: "Cytosine Cytosine Guanine Cytosine Adenine Guanine [ccgcag] bằng 2011" -> có vẻ như câu trả lời của bạn không phải là câu trả lời;)? –

+0

Các giá trị mà bạn đang nhận được là vị trí của mỗi codon trong danh sách codon. Đây không phải là số thực tế không may. Bạn phải sử dụng một phương pháp tương tự để chuyển đổi một số thập lục phân sang một số thập phân nhưng thay vào đó một hệ thập lục phân bạn đang sử dụng một số thập lục phân. Xem http://mathforum.org/library/drmath/view/55785.html để tham khảo. – Sonryell

+0

@JakobS. giải pháp được cập nhật. –

2

tôi không thể làm theo mã của bạn, vì vậy tôi đã thực hiện khác, nhưng tôi đã nhận kết quả tương tự:

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

kết quả:

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

Tôi không phải là lập trình viên python lớn nhất, tôi chủ yếu sử dụng nó cho các thuật toán nhanh hoặc để kiểm tra một ý tưởng. Hầu hết thời gian của tôi là dành cho Mathematica hoặc C++. Vì vậy, mã của tôi có lẽ không phải là rõ ràng nhất cũng không hiệu quả nhất. Tôi xin lỗi vì điều đó. Nhưng có vẻ như hầu hết mọi người đều nhận được câu trả lời giống như tôi ... Tôi bắt đầu nghĩ đó là lỗi đánh máy trong bài viết hoặc tác giả đã sử dụng một bảng hoàn toàn khác với bảng được xuất bản. – Sonryell

+0

@Sonryell: không cần phải xin lỗi. Nếu bạn từng gặp phải bảng bên phải, bạn có muốn chia sẻ nó không? –

+0

Với bảng này, 'cggcag' cho năm 2011. Có thể là lỗi đánh máy trong ấn phẩm gốc? –

Các vấn đề liên quan