RNA , seperti DNA, adalah molekul yang ditemukan dalam sel yang mengkode informasi genetik. Ini terdiri dari nukleotida , yang diwakili oleh basa adenin (A), sitosin (C), guanin (G) dan urasil (U). * Kodon adalah urutan dari tiga nukleotida.
Protein adalah molekul besar yang melakukan beragam fungsi, seperti keratin yang ditemukan pada rambut dan kuku serta hemoglobin yang membawa oksigen dalam sel darah. Mereka terbuat dari asam amino , yang dikodekan sebagai kodon dalam molekul RNA. Terkadang kodon yang berbeda dapat dikodekan untuk asam amino yang sama. Setiap asam amino biasanya diwakili oleh satu huruf, misalnya H berarti histidin.
Dengan urutan ACGU
, dapatkah Anda menerjemahkannya ke dalam string protein yang sesuai?
* DNA terdiri dari ACGT, di mana T adalah timin. Selama transkripsi DNA ke RNA, timin digantikan oleh urasil.
Memasukkan
Input akan berupa string tunggal yang hanya terdiri dari karakter ACGU
dalam huruf besar. Anda dapat menulis fungsi atau program lengkap untuk tantangan ini.
Keluaran
Anda dapat memilih untuk mencetak melalui pencetakan atau pengembalian string (pilihan terakhir hanya tersedia dalam kasus fungsi).
Penerjemahan harus dimulai dengan kodon awal ( AUG
, direpresentasikan sebagai M
) dan berakhir pada kodon berhenti (salah satu UAA
, UAG
atau UGA
, diwakili sebagai *
). Ada empat kasus di mana input mungkin tidak valid:
- Input tidak dimulai dengan kodon start
- Input tidak diakhiri dengan kodon stop
- Panjang input bukan kelipatan 3
- Input berisi kodon stop di tempat lain selain di akhir
Dalam semua kasus ini, Error
harus dikeluarkan. Perhatikan bahwa, tidak seperti stop kodon, kodon start dapat muncul setelah dimulainya string.
Jika tidak, Anda harus mengubah setiap kodon menjadi asam amino masing-masing melalui tabel kodon RNA berikut :
* 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
... dan tampilkan string yang diterjemahkan.
Contohnya
Kasus tidak valid:
<empty string> -> Error
AUG -> Error
UAA -> Error
AUGCUAG -> Error
AAAAAAA -> Error
GGGCACUAG -> Error
AUGAACGGA -> Error
AUGUAGUGA -> Error
AUGUUUGUUCCGUCGAAAUACCUAUGAACACGCUAA -> Error
Kasus yang valid:
AUGUGA -> M*
AUGAGGUGUAGCUGA -> MRCS*
AUGGGUGAGAAUGAAACGAUUUGCAGUUAA -> MGENETICS*
AUGCCAGUCGCACGAUUAGUUCACACGCUCUUGUAA -> MPVARLVHTLL*
AUGCUGCGGUCCUCGCAUCUAGCGUUGUGGUUAGGGUGUGUAACUUCGAGAACAGUGAGUCCCGUACCAGGUAGCAUAAUGCGAGCAAUGUCGUACGAUUCAUAG -> MLRSSHLALWLGCVTSRTVSPVPGSIMRAMSYDS*
AUGAAAAACAAGAAUACAACCACGACUAGAAGCAGGAGUAUAAUCAUGAUUCAACACCAGCAUCCACCCCCGCCUCGACGCCGGCGUCUACUCCUGCUUGAAGACGAGGAUGCAGCCGCGGCUGGAGGCGGGGGUGUAGUCGUGGUUUACUAUUCAUCCUCGUCUUGCUGGUGUUUAUUCUUGUUUUAA -> MKNKNTTTTRSRSIIMIQHQHPPPPRRRRLLLLEDEDAAAAGGGGVVVVYYSSSSCWCLFLF*
Sunting: Menambahkan lebih banyak kasus uji
Mencetak gol
Ini adalah kode golf, jadi kode dalam byte paling sedikit menang.
Catatan: Saya bukan ahli dalam biologi molekuler, jadi jangan ragu untuk mengoreksi saya jika saya salah menyatakan :)
sumber
M
dan diakhiri dengan*
.Jawaban:
CJam (
97 93 9291 byte)Ini adalah port dari solusi GolfScript saya dengan fungsi hash yang sedikit berubah karena yang mengejutkan saya satu hal yang CJam belum pinjam dari GolfScript adalah memperlakukan string sebagai array bilangan bulat.
6 byte disimpan berkat saran dari Pengoptimal (termasuk dua byte dari sesuatu yang saya pikir saya sudah mencoba dan tidak berfungsi - ya).
sumber
q"GACU"f#3/{4b"GGEDAAVVRSKNTTMIRRQHPPLLWC*YSSLF"{_s"MW""I*"er}%=}%s_'*/(1<"M"=*Q="Error"@?
- 90Q
bukan[Q]
hanya tidak benar.[Q]
untukQ
perubahan adalah benar.AUGUAGUGA
[Q]
->Qa
JavaScript (ES6) 167
177karakter dikodekan dalam UTF8 sebagai 167177byte... jadi saya harap semua orang senang.
Edit Bahkan, tidak perlu untuk kasus khusus untuk blok terakhir terlalu pendek. Jika 2 karakter terakhir (atau 1) tidak dipetakan, string hasil tidak diakhiri dengan '*' dan itu tetap memberikan kesalahan.
Dijelaskan
Setiap karakter dalam triplet dapat memiliki 4 nilai, jadi ada tepat 4 ^ 3 == 64 triplet. Fungsi C memetakan setiap triplet ke angka antara 0 dan 63. Tidak diperlukan pemeriksaan kesalahan karena karakter input hanya ACGU.
Setiap triplet memetakan asam amino yang diidentifikasi oleh satu arang. Kami dapat menyandikan ini dalam string 64 karakter. Untuk mendapatkan string, mulailah dengan Peta Codon:
... memperoleh "KNKNTTTTRSRSIIMIQHQHPPPPRRRLLLEDEDAAAAGGGGVVVV * Y * YSSSS * CWCLFLF"
Jadi kita dapat memindai string input dan menggunakan logika fungsi C yang sama untuk mendapatkan kode 0..63, dan dari kode char aminoacid. Fungsi ganti akan membagi string input menjadi 3 blok karakter, akhirnya meninggalkan 1 atau 2 karakter tidak terkelola (yang akan memberikan string hasil yang tidak valid, tidak berakhir pada '*').
Akhirnya, periksa apakah string yang disandikan valid menggunakan regexp: itu harus dimulai dengan 'M', tidak boleh mengandung '*' dan harus diakhiri dengan '*'
Uji di konsol FireBug / FireFox
Keluaran
sumber
C, 190 byte (fungsi)
199194 byte (program)Disimpan beberapa byte dengan meningkatkan formula hash.
Berikut ini adalah test case yang menyenangkan:
Penjelasan
Tiga huruf diubah menjadi nomor basis 4. Setiap huruf di-hash sebagai berikut.
Ini memberikan angka dalam kisaran
0..63
. Idenya sekarang adalah menggunakan tabel pencarian yang mirip dengan yang digunakan oleh edc65 dan Pengoptimal. Namun, hash dirancang sedemikian rupa sehingga G dan A saling bersebelahan dan U dan C saling bersebelahan.Melihat tabel di https://en.wikipedia.org/wiki/Genetic_code#RNA_codon_table , kita melihat bahwa dengan huruf yang dipesan dengan cara ini, umumnya bit terakhir dapat diabaikan. Hanya tabel pencarian 32 karakter yang diperlukan, kecuali dalam dua kasus khusus.
Lihat di bawah dua huruf pertama, dan asam amino yang sesuai (di mana huruf ke-3 adalah G / A, dan di mana huruf ke-3 adalah U / C). Koreksi untuk dua kasus khusus yang tidak sesuai dengan tabel 32 karakter hardcoded.
Kode yang dikomentari
Dalam versi golf,
i%3
kode berada pada posisi tambahanfor
braket, tetapi dipindahkan ke posisi yang lebih mudah dibaca dalam kode komentar.sumber
O
! Saya menambahkan test case untuk ituMGENETICS*
, karena itu adalah kata yang paling tematis yang bisa saya buat: PCJam,
317 121104 byteIni masih bisa bermain golf lebih lanjut.
Memperbarui mekanisme pemetaan ke yang digunakan dalam jawaban edc65. Meskipun saya datang dengan ini sendiri, dia mengalahkan saya untuk itu :)
UPDATE : Mempersingkat peta tabel kodon dengan mengamati pola di dalamnya.
Cobalah online di sini
sumber
GolfScript (103 byte)
Demo online (NB tidak termasuk dua kasus uji terbesar karena perlu dijalankan dalam 15 detik).
Pembedahan
Seperti yang ditunjukkan Steve Verrill di kotak pasir, tabel pencarian dapat dikurangi menjadi 32 elemen ditambah dua case khusus. Ternyata kasus khusus keduanya melibatkan karakter (
M
danW
masing - masing) yang hanya terjadi sekali, dan dengan pemetaan karakter yang tepat untuk mendasarkan 4 digit dimungkinkan untuk membangun tabel pencarian 64-elemen penuh dari 32 elemen dengan melakukan duplikat -dan-tr
:Kemudian setelah kita melakukan decode, validasi memungkinkan banyak pendekatan. Yang terpendek yang saya temukan adalah
sumber
M
merupakan salah satu kasus khusus untuk menguji awal yang valid, tetapi tidak berhasil seperti itu. Masih ada 8 pasang huruf identik dalam string itu. Saya bertanya-tanya apakah mereka dapat dikompres sebagai huruf kecil:g-->GG
a-->AA
dll. Jika dekompresi dapat dicapai di bawah 8 karakter itu akan bermanfaat.Python, 473 byte
sumber
Python 2,
370358354 byteIni adalah pendekatan yang sangat lurus ke depan tanpa menggunakan kompresi, hanya mencoba mengemas informasi dengan cukup padat:
Sunting: Memotong beberapa karakter mengikuti saran xnor.
sumber
s
lebih pendek secara rekursifs=lambda x:x and[x[:3]]+s(x[3:])
.Scala (317 karakter)
Fungsi utamanya adalah
f
. Tentu saja, pilihan yang lebih baik adalah mengembalikanOption[String]
.sumber
JavaScript (ES6), 143 byte
Cobalah online!
sumber