RNA การแปลโปรตีน


18

RNAเช่นเดียวกับ DNA เป็นโมเลกุลที่พบในเซลล์ที่เข้ารหัสข้อมูลทางพันธุกรรม มันประกอบไปด้วยนิวคลีโอไทด์ซึ่งถูกแสดงโดยเบสอะดีนีน (A), ไซโตซิน (C), กัวนีน (G) และ uracil (U) * โคดอนเป็นลำดับของนิวคลีโอไทด์สามตัว

โปรตีนเป็นโมเลกุลขนาดใหญ่ที่มีฟังก์ชั่นมากมายเช่นเคราตินที่พบในเส้นผมและเล็บและเฮโมโกลบินซึ่งมีออกซิเจนในเซลล์เม็ดเลือด พวกเขาประกอบด้วยกรดอะมิโนซึ่งถูกเข้ารหัสเป็น codons ในโมเลกุล RNA บางครั้ง codons ที่แตกต่างกันอาจเข้ารหัสสำหรับกรดอะมิโนเดียวกัน โดยทั่วไปแล้วกรดอะมิโนแต่ละตัวจะแสดงด้วยตัวอักษรเดียวเช่น H หมายถึงฮิสทิดีน

ที่กำหนดลำดับของACGUคุณสามารถแปลเป็นสตริงโปรตีนที่สอดคล้องกัน?

* DNA ประกอบด้วย ACGT โดยที่ T คือ thymine ในระหว่างการถอดรหัส DNA เป็น RNA, ไทมีนจะถูกแทนที่ด้วย uracil


อินพุต

ข้อมูลที่ป้อนจะเป็นสตริงเดียวที่ประกอบด้วยอักขระตัวACGUพิมพ์ใหญ่เท่านั้น คุณอาจจะเขียนฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบสำหรับความท้าทายนี้

เอาท์พุต

คุณอาจเลือกที่จะแสดงผลด้วยการพิมพ์หรือส่งกลับสตริง

แปลควรเริ่มต้นที่ codon เริ่มต้น ( AUGแสดงเป็นM) และสิ้นสุดที่หยุด codon (หนึ่งUAA, UAGหรือUGA, แสดงเป็น*) มีสี่กรณีที่อินพุตอาจไม่ถูกต้อง:

  • อินพุตไม่เริ่มต้นด้วย codon เริ่มต้น
  • อินพุตไม่ได้ลงท้ายด้วยรหัสหยุด
  • ความยาวของอินพุตไม่เท่ากับ 3
  • อินพุตมีตัวหยุดโค้ดที่อื่นนอกเหนือจากตอนท้าย

ในทุกกรณีเหล่านี้Errorควรได้รับผลลัพธ์ โปรดทราบว่าแตกต่างจากหยุด codons เริ่ม codons อาจปรากฏขึ้นหลังจากการเริ่มต้นของสตริง

มิฉะนั้นคุณควรแปลงโคดอนแต่ละตัวเป็นกรดอะมิโนตามลำดับผ่านตารางรหัส RNAต่อไปนี้:

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

... และส่งออกสตริงที่แปล

ตัวอย่าง

กรณีไม่ถูกต้อง:

<empty string> -> Error
AUG -> Error
UAA -> Error
AUGCUAG -> Error
AAAAAAA -> Error
GGGCACUAG -> Error
AUGAACGGA -> Error
AUGUAGUGA -> Error
AUGUUUGUUCCGUCGAAAUACCUAUGAACACGCUAA -> Error

กรณีที่ถูกต้อง:

AUGUGA -> M*
AUGAGGUGUAGCUGA -> MRCS*
AUGGGUGAGAAUGAAACGAUUUGCAGUUAA -> MGENETICS*
AUGCCAGUCGCACGAUUAGUUCACACGCUCUUGUAA -> MPVARLVHTLL*
AUGCUGCGGUCCUCGCAUCUAGCGUUGUGGUUAGGGUGUGUAACUUCGAGAACAGUGAGUCCCGUACCAGGUAGCAUAAUGCGAGCAAUGUCGUACGAUUCAUAG -> MLRSSHLALWLGCVTSRTVSPVPGSIMRAMSYDS*
AUGAAAAACAAGAAUACAACCACGACUAGAAGCAGGAGUAUAAUCAUGAUUCAACACCAGCAUCCACCCCCGCCUCGACGCCGGCGUCUACUCCUGCUUGAAGACGAGGAUGCAGCCGCGGCUGGAGGCGGGGGUGUAGUCGUGGUUUACUAUUCAUCCUCGUCUUGCUGGUGUUUAUUCUUGUUUUAA -> MKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF*

แก้ไข: เพิ่มกรณีทดสอบเพิ่มเติม

เกณฑ์การให้คะแนน

นี่คือรหัสกอล์ฟดังนั้นโค้ดในจำนวนไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ

หมายเหตุ: ฉันไม่มีความเชี่ยวชาญในด้านอณูชีววิทยาดังนั้นโปรดแก้ไขให้ฉันถ้าฉันทำอะไรผิดไป :)


1
นักแปลที่เหมาะสมควรสามารถหากรอบการอ่านที่เปิดอยู่ในสตริงใด ๆ ไม่ใช่เฉพาะที่เริ่มต้นด้วย AUG!
แคนาดา

@canadianer Ahaha ใช่ฉันเริ่มคิดแล้ว แต่ฉันไม่ต้องการที่จะทำให้คำถามซับซ้อนเกินไปด้วยการนำเฟรมการอ่านแบบเปิด (หรือแม้แต่การแปลโปรตีนหลาย ๆ ตัวจากสตริงเดียว) :)
Sp3000

สตริงที่ว่างเปล่าจะเป็นกรณีทดสอบที่มีประโยชน์เพราะมันจะทำลายบางแนวทางสำหรับการทดสอบว่าลำดับถอดรหัสเริ่มต้นด้วยและจบลงด้วยM *
Peter Taylor

@PeterTaylor เพิ่มแล้วพร้อมกับกรณีทดสอบสั้น ๆ อีกสองสามข้อ :)
Sp3000

1
หากคุณต้องการความเจ็บปวดอย่างแท้จริงคุณสามารถใช้ DNA แทน RNA ดังนั้นคุณจึงมีกรอบการอ่านย้อนหลังด้วย
user137

คำตอบ:


6

CJam ( 97 93 92 91 ไบต์)

q"GACU"f#3/{4b"GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF"{_s"MW""I*"er}%=}%s_'*/(1<"M"=*Qa=\"Error"?

นี่คือพอร์ตของโซลูชัน GolfScript ของฉันที่มีฟังก์ชั่นแฮชที่ปรับแต่งเล็กน้อยเพราะสิ่งหนึ่งที่ฉันประหลาดใจที่ CJam ไม่ได้ยืมจาก GolfScript นั้นกำลังรักษาสตริงเป็นอาร์เรย์จำนวนเต็ม

บันทึกได้ 6 ไบต์ด้วยคำแนะนำจากเครื่องมือเพิ่มประสิทธิภาพ (รวมถึงสองไบต์จากสิ่งที่ฉันคิดว่าฉันพยายามและไม่ทำงาน - huh)


1
q"GACU"f#3/{4b"GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF"{_s"MW""I*"er}%=}%s_'*/(1<"M"=*Q="Error"@?- 90
เครื่องมือเพิ่มประสิทธิภาพ

@ ออพติไมเซอร์บางส่วนดูเหมือนจะเป็นการปรับปรุง อย่างไรก็ตามมันให้ข้อผิดพลาดรันไทม์และการเปรียบเทียบกับQแทนที่จะ[Q]เป็นเพียงแค่ไม่ถูกต้อง
Peter Taylor

1. คุณยังไม่ได้คัดลอกรหัสอย่างถูกต้องเมื่อรหัสครอบคลุมหลายบรรทัดในความคิดเห็นจะได้รับอักขระ Unicode แปลกที่ตัวแบ่งบรรทัด คุณจะต้องพิมพ์รหัสด้วยตนเองแล้ว 2. ดูเหตุผลมันได้รับการแก้ไขให้ทำงานอย่างถูกต้องดังนั้น[Q]การQเปลี่ยนแปลงจึงถูกต้อง
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ให้ลองกรณีทดสอบAUGUAGUGA
Peter Taylor


10

JavaScript (ES6) 167 177ตัวอักษรที่เข้ารหัสใน UTF8 เป็น167 177ไบต์

... ดังนั้นฉันหวังว่าทุกคนจะมีความสุข

แก้ไขตามความเป็นจริงไม่จำเป็นต้องมีกรณีพิเศษสำหรับบล็อกสุดท้ายสั้นเกินไป หากตัวอักษร 2 (หรือ 1) ตัวสุดท้ายไม่ถูกแมปสตริงผลลัพธ์จะไม่ลงท้ายด้วย '*' และนั่นจะให้ข้อผิดพลาดอยู่ดี

F=s=>/^M[^*]*\*$/.test(s=s.replace(/.../g,x=>
"KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSS*CWCLFLF"
[[for(c of(r=0,x))r=r*4+"ACGU".search(c)]|r]))?s:'Error'

อธิบาย

ถ่านแต่ละตัวใน triplet สามารถมี 4 ค่าดังนั้นจึงมีค่า 4 ^ 3 == 64 ทริปเปิล ฟังก์ชั่น C จับคู่ triplet กับตัวเลขระหว่าง 0 และ 63 ไม่จำเป็นต้องตรวจสอบข้อผิดพลาดเนื่องจากตัวอักษรอินพุตเป็น ACGU เท่านั้น

C=s=>[for(c of(r=0,s))r=r*4+"ACGU".search(c)]|r

triplet แต่ละแผนที่ไปยังอะมิโนซิซิดที่ระบุโดยตัวอักษรตัวเดียว เราสามารถเข้ารหัสได้ในสตริง 64 ตัวอักษร ในการรับสตริงให้เริ่มด้วย Map Codon:

zz=["* UAA UAG UGA","A GCU GCC GCA GCG","C UGU UGC","D GAU GAC","E GAA GAG"
,"F UUU UUC","G GGU GGC GGA GGG","H CAU CAC","I AUU AUC AUA","K AAA AAG"
,"L UUA UUG CUU CUC CUA CUG","M AUG","N AAU AAC","P CCU CCC CCA CCG","Q CAA CAG"
,"R CGU CGC CGA CGG AGA AGG","S UCU UCC UCA UCG AGU AGC","T ACU ACC ACA ACG"
,"V GUU GUC GUA GUG","W UGG","Y UAU UAC"]
a=[],zz.map(v=>v.slice(2).split(' ').map(x=>a[C(x)]=v[0])),a.join('')

... การรับ "KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLEDEDAAAAGGGGVVVV * Y * YSSSS * CWCLFLF"

ดังนั้นเราจึงสามารถสแกนสตริงอินพุตและใช้ตรรกะเดียวกันของฟังก์ชัน C เพื่อรับโค้ด 0..63 และจากรหัสคืออะมิโนอะซิดถ่าน ฟังก์ชั่นแทนที่จะแยกสตริงอินพุตใน 3 บล็อกตัวอักษรในที่สุดก็ปล่อย 1 หรือ 2 ตัวอักษรที่ไม่ได้รับการจัดการ (ที่จะให้สตริงผลลัพธ์ที่ไม่ถูกต้องไม่สิ้นสุดใน '*')

ในที่สุดตรวจสอบว่าสตริงที่เข้ารหัสนั้นถูกต้องโดยใช้ regexp หรือไม่: ต้องเริ่มต้นด้วย 'M' ต้องไม่มี '*' และต้องลงท้ายด้วย '*'

ทดสอบในคอนโซล FireBug / FireFox

;['AUGCUAG','GGGCACUAG','AUGAACGGA','AUGUAGUGA','AAAAAAA',
'AUGUUUGUUCCGUCGAAAUACCUAUGAACACGCUAA',
'AUGAGGUGUAGCUGA','AUGCCAGUCGCACGAUUAGUUCACACGCUCUUGUAA',
'AUGCUGCGGUCCUCGCAUCUAGCGUUGUGGUUAGGGUGUGUAACUUCGAGAACAGUGAGUCCCGUACCAGGUAGCAUAAUGCGAGCAAUGUCGUACGAUUCAUAG']
.forEach(c=>console.log(c,'->',F(c)))

เอาท์พุต

AUGCUAG -> Error
GGGCACUAG -> Error
AUGAACGGA -> Error
AUGUAGUGA -> Error
AAAAAAA -> Error
AUGUUUGUUCCGUCGAAAUACCUAUGAACACGCUAA -> Error
AUGAGGUGUAGCUGA -> MRCS*
AUGCCAGUCGCACGAUUAGUUCACACGCUCUUGUAA -> MPVARLVHTLL*
AUGCUGCGGUCCUCGCAUCUAGCGUUGUGGUUAGGGUGUGUAACUUCGAGAACAGUGAGUCCCGUACCAGGUAGCAUAAUGCGAGCAAUGUCGUACGAUUCAUAG -> MLRSSHLALWLGCVTSRTVSPVPGSIMRAMSYDS*

ความคิดดี! แค่คิดจะทำสิ่งนี้ คุณเอาชนะฉันมัน!
เครื่องมือเพิ่มประสิทธิภาพ

8

C, 190 ไบต์ (ฟังก์ชัน)

f(char*x){int a=0,i=0,j=0,s=1;for(;x[i];i%3||(s-=(x[j++]=a-37?a-9?"KNRSIITTEDGGVVAA*Y*CLFSSQHRRLLPP"[a/2]:77:87)==42,x[j]=a=0))a=a*4+(-x[i++]/2&3);puts(*x-77||i%3||s||x[j-1]-42?"Error":x);}

199 194 ไบต์ (โปรแกรม)

a,i,j;char x[999];main(s){for(gets(x);x[i];i%3||(s-=(x[j++]=a-37?a-9?"KNRSIITTEDGGVVAA*Y*CLFSSQHRRLLPP"[a/2]:77:87)==42,x[j]=a=0))a=a*4+(-x[i++]/2&3);puts((*x-77||i%3||s||x[j-1]-42)?"Error":x);}

บันทึกสองสามไบต์โดยการปรับปรุงสูตรแฮช

นี่คือกรณีทดสอบที่สนุก:

AUGUAUCAUGAGCUCCUUCAGUGGCAAAGACUUGACUGA --> MYHELLQWQRLD* 

คำอธิบาย

triplet ของตัวอักษรถูกแปลงเป็นตัวเลขฐาน 4 จดหมายแต่ละฉบับถูกแฮชดังนี้

x[i]       ASCII code       Hashed to (-x[i]/2&3) 
A        64+ 1  1000001            00   
G        64+ 7  1000111            01
U        64+21  1010101            10   
C        64+ 3  1000011            11

0..63นี้จะช่วยให้ตัวเลขในช่วง แนวคิดตอนนี้คือการใช้ตารางการค้นหาคล้ายกับที่ใช้โดย edc65 และเครื่องมือเพิ่มประสิทธิภาพ อย่างไรก็ตามแฮชได้รับการออกแบบเพื่อให้ G และ A อยู่ติดกันและ U และ C อยู่ติดกัน

มองไปที่โต๊ะที่ https://en.wikipedia.org/wiki/Genetic_code#RNA_codon_tableเราจะเห็นว่าด้วยตัวอักษรที่สั่งในลักษณะนี้โดยทั่วไปแล้วบิตสุดท้ายจะถูกละเว้น จำเป็นต้องใช้ตารางการค้นหา 32 อักขระยกเว้นในกรณีพิเศษสองกรณี

ดูตัวอักษรสองตัวแรกด้านล่างและกรดอะมิโนที่เกี่ยวข้อง (ที่ตัวอักษรตัวที่ 3 คือ G / A และตัวอักษรตัวที่ 3 คือ U / C) การแก้ไขสำหรับกรณีพิเศษสองกรณีที่ไม่พอดีกับตาราง 32 อักขระจะถูกฮาร์ดโค้ด

     A/G U/C          A/G U/C            A/G U/C         A/G U/C  
AAX> K   N       AGX> R   S         AUX> I   I      ACX> T   T
GAX> E   D       GGX> G   G         GUX> V   V      GCX> A   A
UAX> *   Y       UGX> *   C         UUX> L   F      UCX> S   S
CAX> Q   H       CGX> R   R         CUX> L   L      CCX> P   P

Corrections for special cases (where last bit cannot be ignored)
AUG 001001=9 -->  M
UGG 100101=37-->  W

รหัสแสดงความคิดเห็น

ในเวอร์ชั่น golfed i%3รหัสอยู่ในตำแหน่งที่เพิ่มขึ้นของforวงเล็บ แต่มันจะถูกย้ายไปยังตำแหน่งที่อ่านได้มากขึ้นในรหัสความคิดเห็น

a,i,j;char x[999];                                                             //Array x used for storing both input and output. i=input pointer, j=output pointer.
main(s){                                                                       //s is commandline string count. if no arguments, will be set to zero. Will be used to count stops.
  for(gets(x);x[i];)                                                           //Get a string, loop until end of string (zero byte) found
    a=a*4+(-x[i++]/2&3),                                                       //Hash character x[i] to a number 0-3. leftshift any value already in a and add the new value. Increment i.
    i%3||(                                                                     //if i divisible by 3,
      s-=(x[j++]=a-37?a-9?"KNRSIITTEDGGVVAA*Y*CLFSSQHRRLLPP"[a/2]:77:87)==42,  //lookup the correct value in the table. for special cases a=24 and a=32 map to 'M' and 'W' (ASCII 77 and 87). If character is '*' (ASCII42) decrement s.   
      x[j]=a=0                                                                 //reset a to 0. clear x[j] to terminate output string.                                                     
    );   
  puts((*x-77||i%3||s||x[j-1]-42)?"Error":x);                                  //if first character not M or i not divisible by 3 or number of stops not 1 or last character not * print "Error" else print amino acid chain.
}

ถ้าเพียง แต่มีO! ฉันได้เพิ่มกรณีทดสอบสำหรับMGENETICS*เพราะเป็นคำที่ฉันสามารถสร้างได้: P
Sp3000

6

CJam, 317 121 104 ไบต์

q3/{{"ACGU"#}%4b"KN T RS IIMI QH P R L ED A G V *Y S *CWC LF"S/{_,4\/*}%s=}%_('M=\)'*=\'*/,1=**\"Error"?

ยังสามารถเล่นกอล์ฟต่อไปได้

Updatedกลไกการจับคู่กับกลไกที่ใช้ในคำตอบของ edc65 แม้ว่าฉันจะทำสิ่งนี้ด้วยตัวเอง แต่เขาก็เอาชนะฉันได้ :)

UPDATE : ย่อแผนที่ตาราง codon ด้วยการสังเกตรูปแบบ

ลองออนไลน์ได้ที่นี่


สิ่งนี้จะหยุดถ้าอินพุตเป็นสตริงว่าง
Peter Taylor

@PeterTaylor กฎที่เพิ่มไว้ในคำแนะนำของคุณหลังจากคำตอบถูกโพสต์;) ฉันจะอัปเดตรหัสในไม่ช้า
เครื่องมือเพิ่มประสิทธิภาพ

1
มันไม่ใช่กฎที่ถูกเพิ่มเข้ามามันเป็นกรณีทดสอบที่กฎนั้นต้องการโดยปริยายแล้ว
Peter Taylor

3

GolfScript (103 ไบต์)

{)7&2/}%3/{4base'GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF'{..'MW'?'I*'@),+=}%=}%''+.'*'/(1<'M'=*['']=*'Error'or

การสาธิตออนไลน์ (NB ไม่ได้รวมกรณีทดสอบที่ใหญ่ที่สุดสองรายการเพราะต้องทำงานใน 15 วินาที)

การผ่า

เมื่อสตีฟเวอร์ริลล์ชี้ไปที่กล่องทรายตารางการค้นหาสามารถลดลงได้ถึง 32 องค์ประกอบบวกสองกรณีพิเศษ ปรากฎว่ากรณีพิเศษทั้งสองเกี่ยวข้องกับตัวละคร ( MและWตามลำดับ) ซึ่งเกิดขึ้นเพียงครั้งเดียวและการแมปที่ถูกต้องของตัวละครไปยังฐาน 4 หลักเป็นไปได้ที่จะสร้างตารางการค้นหาองค์ประกอบที่ 64 จาก 32 องค์ประกอบโดยการทำซ้ำ - และ - tr:

'GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF'  # 32-element lookup table
{                                   # Map over the 32 elements...
  .                                 #   Duplicate the element
  .'MW'?'I*'@),+=                   #   Apply tr/MW/I*/ to the duplicate
}%

จากนั้นเมื่อเราถอดรหัสเสร็จแล้วการตรวจสอบจะอนุญาตให้มีหลายวิธี สั้นที่สุดที่ฉันพบคือ

.'*'/       # Duplicate and split the copy around '*' retaining empty strings
(1<'M'=*    # Pull out the first string from the split (guarantee to exist even if input is
            # the empty string); if it starts with 'M' leave the rest of the split intact;
            # otherwise reduce it to the empty array
['']=       # Check whether we have ['']. If so, the split produced [prefix ''] where
            # prefix begins with 'M'. Otherwise we want an error.
*           # If we have an error case, reduce the original decoded string to ''
'Error'or   # Standard fallback mechanism


@Optimizer, การแปลโดยตรงไปยัง CJam จะประหยัดไม่กี่ไบต์เพราะมีบิวด์อินที่เกี่ยวข้องมากมาย
Peter Taylor

ฟังก์ชั่นการแฮชของฉันมีความยาว 57 ไบต์ในขณะที่คุณอยู่ที่ 52 ดังนั้นฉันจะเห็นได้เพียง 5 ไบต์เท่านั้นที่ประหยัดได้ ...
เครื่องมือเพิ่มประสิทธิภาพ

ฉันดีใจที่ความคิดเห็นของฉันในกล่องทรายมีประโยชน์ ฉันหวังว่าอาจเป็นไปได้ที่จะใช้ความจริงที่Mเป็นหนึ่งในกรณีพิเศษเพื่อทดสอบการเริ่มต้นที่ถูกต้อง แต่มันก็ไม่ได้เป็นอย่างนั้น ยังมีตัวอักษรเหมือนกัน 8 คู่ในสตริงนั้น ฉันสงสัยว่าพวกเขาสามารถบีบอัดเป็นตัวอักษรตัวเล็ก: g-->GG a-->AAฯลฯ หากการคลายการบีบอัดสามารถทำได้ต่ำกว่า 8 ตัวอักษรมันจะคุ้มค่า
เลเวลริเวอร์เซนต์

1

Python 473 ไบต์

t={'U(A[AG]|GA)':'*','GC.':'A','UG[UC]':'C','GA[UC]':'D','GA[AG]':'E','UU[UC]':'F','GG.':'G','CA[UC]':'H','AU[UCA]':'I','AA[AG]':'K','(UU[AG]|CU.)':'L','AUG':'M','AA[UC]':'N','CC.':'P','CA[AG]':'Q','(CG.|AG[AG])':'R','(UC.|AG[UC])':'S','AC.':'T','GU.':'V','UGG':'W','UA[UC]':'Y'}
import re
i=raw_input()
a=''
for x in[i[y:y+3]for y in range(0,len(i),3)]:
 a+=[t[u]for u in t.keys()if re.match(u, x)][0]
print["Error",a][all((a[0]+a[-1]=="M*",len(i)%3==0,not"*"in a[1:-1]))]

1

Python 2, 370 358 354 ไบต์

นี่เป็นวิธีการไปข้างหน้าอย่างตรงไปตรงมาโดยไม่มีการบีบอัดเพียงพยายามแพ็คข้อมูลอย่างหนาแน่น:

s=lambda x:x and[x[:3]]+s(x[3:])or[]
def f(I):O=''.join(d*any(0==x.find(p)for p in e)for x in s(I)for d,e in zip('*ACDEFGHIKLMNPQRSTVWY',map(s,'UAAUAGUGA,GC,UGUUGC,GAUGAC,GAAGAG,UUUUUC,GG,CAUCAC,AUUAUCAUA,AAAAAG,UUAUUGCU,AUG,AAUAAC,CC,CAACAG,AGAAGGCG,AGUAGCUC,AC,GU,UGG,UAUUAC'.split(','))));return['Error',O][len(I)%3==0==len(O)-O.find('*')-(O[0]=='M')]

แก้ไข:โกนอักขระบางตัวตามคำแนะนำของ xnor


ฉันเชื่อว่าคุณสามารถเขียนsสั้นลงs=lambda x:x and[x[:3]]+s(x[3:])เรื่อย ๆเช่น
xnor

@ xnor ดีฉันไม่ได้คิดอย่างนั้น มันไม่ทำงานอย่างนั้นเพราะในตอนท้ายของการเรียกซ้ำมันจะส่งออกสตริงว่างเปล่าไม่ใช่รายการที่ว่างเปล่า แต่ด้วยตัวละครอีกสี่ตัวฉันสามารถทำให้มันใช้ได้ ขอบคุณ!
Emil

1

สกาลา (317 ตัวอักษร)

def g(c:Char)="ACGU"indexOf c;def h(s:String,i:Int)=g(s(i))*16+g(s(i+1))*4+g(s(i+2));def p(a:Int)=a!=48&&a!=50&&a!=56;def f(s:String)=if(s.length%3!=0||h(s,0)!=14||p(h(s,s.length-3)))"Error"else{var r="";for(i<-0 to s.length-3 by 3)r+="KNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVV*Y*YSSSS*CWCLFLF"charAt h(s,i);r}

fฟังก์ชั่นหลักคือ Option[String]แน่นอนว่าเป็นทางเลือกที่ดีกว่าจะกลับ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.