[ZJ][字串處理] d313. FROM GENE TO PROTEIN
內容 :
小寢是一位才華洋溢的科學家,然而雖然他的才華出眾,卻有一點深深地困擾著他--那就是他的長相十分醜陋。照鏡子時,鏡子會破裂、出門時,小孩看到會被嚇 哭、照相時,相機甚至無法對焦在他的臉上。小寢知道這是基因的問題,因此決定研究自己的基因。你的任務非常簡單,就是將小寢的基因密碼轉譯成胺基酸。
第二位鹼基 | |||||
---|---|---|---|---|---|
U | C | A | G | ||
第 一 位 鹼 基 | U | ||||
C | |||||
A | AUU (Ile/I)異亮氨酸 | ||||
G |
1標準起始編碼,同時為甲硫氨酸編碼。mRNA中第一個AUG就是蛋白質翻譯的起始部位。
輸入說明
:
輸入為一段鹼基密碼(長度不超過200個字元)。
以'0'作為結束,不須對本行做任何輸出。
請參考輸入範例。
輸出說明
:
第一行輸出 Case " 密碼 ":
接下來輸出轉譯出的胺基酸,之間請以'-'作為分隔。
蛋白質可能不只一個,之間以換行作分隔
請參考輸出範例。
範例輸入 :
5'-AUGUAA 5' -AAUGUGA 3' AAUGUAAUAGUGUAA 5'-UCAUGGGGAAACCCUUUUAAAUGCGUGCAUGA 0
範例輸出 :
Case " 5'-AUGUAA ": Met Case " 5' -AAUGUGA ": Met Case " 3' AAUGUAAUAGUGUAA ": Met Met Case " 5'-UCAUGGGGAAACCCUUUUAAAUGCGUGCAUGA ": Met-Gly-Lys-Pro-Phe Met-Arg-Ala
提示
:
鹼基密碼的一端為" 5' ",另一端則為" 3' " 。
轉譯是從5'端讀到3'端,因此," 5' "代表從前面讀到後面," 3' "反之。
開始讀到"AUG",之後每3個鹼基能形成一種胺基酸,讀到"UAA"或"UGA或"UAG"作為結束。
以範例輸入第3行為例:
3' AAUGUAAUAGUGUAA
讀到3',因此可以倒轉成
5' AAUGUGAUAAUGUAA
開始讀到"AUG",之後每3個鹼基形成一種胺基酸,讀到"UAA"或"UGA或"UAG"作為結束。
A| AUG(start) UGA(end) |UA| AUG(start) UAA(end)|
Met Met
再以範例輸入第4行為例:
5'-UCAUGGGGAAACCCUUUUAAAUGCGUGCAUGA
剛開始為5',代表從前面讀到後面
開始讀到"AUG",之後每3個鹼基形成一種胺基酸,讀到"UAA"或"UGA或"UAG"作為結束。
UC| AUG(start) GGG AAA CCC UUU UAA(end) || AUG(start) CGU GCA UGA(end) |
Met Gly Lys Pro Phe Met Arg Ala
出處
:
最不喜歡這種題目了,看得頭暈目眩。
/**********************************************************************************/
/* Problem: d313 "FROM GENE TO PROTEIN" from 我自己 */
/* Language: CPP (2453 Bytes) */
/* Result: AC(4ms, 460KB) judge by this@ZeroJudge */
/* Author: morris1028 at 2013-02-07 13:25:05 */
/**********************************************************************************/
#include <stdio.h>
#include <map>
#include <string.h>
#include <iostream>
using namespace std;
map<string, string> R;
int main() {
R["UUU"] = R["UUC"] = "Phe";
R["UUA"] = R["UUG"] = R["CUU"] = R["CUC"] = "Leu";
R["CUA"] = R["CUG"] = "Leu";
R["UCU"] = R["UCC"] = R["UCA"] = R["UCG"] = "Ser";
R["AGU"] = R["AGC"] = "Ser";
R["CCU"] = R["CCC"] = R["CCA"] = R["CCG"] = "Pro";
R["CGU"] = R["CGC"] = R["CGA"] = R["CGG"] = "Arg";
R["AGA"] = R["AGG"] = "Arg";
R["ACU"] = R["ACC"] = R["ACA"] = R["ACG"] = "Thr";
R["GUU"] = R["GUC"] = R["GUA"] = R["GUG"] = "Val";
R["GCU"] = R["GCC"] = R["GCA"] = R["GCG"] = "Ala";
R["GGU"] = R["GGC"] = R["GGA"] = R["GGG"] = "Gly";
R["AUU"] = R["AUC"] = R["AUA"] = "Ile";
R["UAU"] = R["UAC"] = "Tyr";
R["CAU"] = R["CAC"] = "His";
R["CAA"] = R["CAG"] = "Gln";
R["UGU"] = R["UGC"] = "Cys";
R["AAU"] = R["AAC"] = "Asn";
R["AAA"] = R["AAG"] = "Lys";
R["GAU"] = R["GAC"] = "Asp";
R["GAA"] = R["GAG"] = "Glu";
R["AUG"] = "Met";
R["UAA"] = R["UAG"] = "end";
R["UGA"] = "end";
R["UGG"] = "Trp";
char s[32767], buf[32767];
while(gets(s) && s[0] != '0') {
printf("Case \" %s \":\n", s);
int idx = 0, i, len = strlen(s), flag = 0;
for(i = 0; s[i]; i++)
if(s[i] == '3') flag = 1;
if(flag) {
for(i = strlen(s)-1; i >= 0; i--)
if(s[i] >= 'A' && s[i] <= 'Z')
buf[idx++] = s[i];
} else {
for(i = 0; s[i]; i++)
if(s[i] >= 'A' && s[i] <= 'Z')
buf[idx++] = s[i];
}
buf[idx] = '\0';
for(i = 0; i <= idx; i++)
s[i] = buf[i];
for(i = 0; i <= idx; i++) {
if(s[i] == 'A' && s[i+1] == 'U' && s[i+2] == 'G') {
char tmp, flag = 0;
while(true) {
tmp = s[i+3];
s[i+3] = '\0';
if(R[s+i] == "end") {
s[i+3] = tmp;
i += 2;
break;
}
if(flag) putchar('-');
flag = 1;
cout << R[s+i];
s[i+3] = tmp;
i += 3;
}
puts("");
}
}
}
return 0;
}