Masalah
Buat fungsi yang dapat menentukan apakah string DNA sewenang-wenang adalah palindrom Watson-Crick. Fungsi ini akan mengambil string DNA dan menghasilkan nilai sebenarnya jika string tersebut adalah palindrom Watson-Crick dan nilai palsu jika tidak. (Benar dan Salah masing-masing dapat direpresentasikan sebagai 1 dan 0.)
String DNA dapat berada dalam semua huruf besar atau semua huruf kecil tergantung pada preferensi Anda.
Juga, string DNA tidak akan kosong.
Penjelasan
Sebuah string DNA adalah palindrom Watson-Crick ketika komplemen dari kebalikannya sama dengan dirinya sendiri.
Diberikan string DNA, pertama-tama membalikkannya, dan kemudian melengkapi setiap karakter sesuai dengan basis DNA (A ↔ T dan C ↔ G). Jika string asli sama dengan string pelengkap-terbalik, itu adalah palindrom Watson-Crick.
Untuk lebih lanjut, lihat pertanyaan ini . Ini adalah tantangan yang berbeda di mana Anda harus menemukan substring terpanjang dari string DNA di mana substring itu adalah palindrom Watson-Crick.
Tujuan
Ini adalah kode-golf dan kode terpendek menang.
Uji Kasus
Formatnya adalah <input> = <output>
.
ATCGCGAT = true
AGT = false
GTGACGTCAC = true
GCAGTGA = false
GCGC = true
AACTGCGTTTAC = false
ACTG = false
Jawaban:
05AB1E ,
107 byteKode:
Penjelasan:
Untuk memeriksa apakah string adalah palindrom, kita hanya perlu memeriksa input dengan input, dengan
at
bertukar dancg
bertukar dan kemudian membalikkannya. Jadi itulah yang akan kita lakukan. Kami mendorong input dan input terbalik menggunakanÂ
(bifurcate). Sekarang sampai pada bagian yang sulit.'š×
adalah versi terkompresi untukcreating
. Jika kami membalikkannya, Anda dapat melihat mengapa ada dalam kode:Ini akan digunakan untuk transliterasi input yang dibalik. Transliterasi dilakukan dengan
‡
. Setelah itu, kami hanya memeriksa apakah input dan input yang transliterasi benarQ
dan mencetak nilai itu. Jadi begini tampilannya seperti untuk inputactg
:Yang juga dapat dilihat dengan bendera debug ( Coba di sini ).
Menggunakan pengodean CP-1252 . Cobalah online! .
sumber
Jelly , 9 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
lambda s:
. Itu hampir solusi penuh!Python 2,
564544 bytesumber
lambda s:s==s[::-1].translate("TCG_A"*99)
bekerja di Python 3Perl, 27 byte
Termasuk +2 untuk
-lp
Berikan masukan pada STDIN, cetak 1 atau tidak sama sekali:
dnapalin.pl
:Ganti
$_=
dengan$_+=
untuk mendapatkan0
alih-alih kosong untuk kasing palsusumber
Pyth - 10 byte
Cobalah online di sini .
Ini akan menjadi 9 byte setelah perbaikan bug yang membuatnya tidak bersaing: Cobalah online di sini .
sumber
Retina ,
3433 byteCobalah online! (Sedikit dimodifikasi untuk menjalankan semua test case sekaligus.)
Penjelasan
Gandakan input dengan mencocokkan ujung string dan memasukkan
;
diikuti oleh seluruh input.Cocokkan hanya bagian kedua input dengan
;.+
dan lakukan penggantian pasangan dengan transliterasi. Adapun set targetRo
:o
referensi set yang lain , yango
diganti denganACGT
. TetapiR
membalikkan set ini, sehingga kedua set sebenarnya:Jika input adalah palindrome DNA, kita sekarang akan memiliki input diikuti oleh kebalikannya (dipisahkan oleh
;
)Berulang-ulang (
+
) menghapus sepasang karakter identik di sekitar;
. Ini akan berlanjut sampai hanya yang;
tersisa atau sampai dua karakter di sekitar;
tidak lagi identik, yang berarti bahwa string bukan kebalikan satu sama lain.Periksa apakah karakter pertama adalah
;
dan cetak0
atau1
sesuai.sumber
JavaScript (ES6), 59 byte
Yang terbaik yang bisa saya lakukan tanpa menggunakan Regexp adalah 62 byte:
sumber
Ruby, 35
Saya mencoba cara lain, tetapi cara yang jelas adalah yang terpendek:
dalam program uji
sumber
->s{s.==s.reverse.tr'ACGT','TGCA'}
lebih pendek satu byte.
. Kode terlihat lebih tepat untuk saya tanpa itu, tetapi diperlukan untuk membuatnya berjalan. Apakah ini didokumentasikan di mana saja?==
sebagai metode daripada operator, tetapi mencari dengan simbol tidak mungkin.Haskell,
4845 byteContoh penggunaan:
(==)=<<reverse.map((cycle"_T_GA__C"!!).fromEnum) $ "ATCGCGAT"
->True
.Versi non-pointfree adalah
Sunting: @Mathias Dolidon menyimpan 3 byte. Terima kasih!
sumber
cycle "TCG_A"
terlalu. :)Retina, 52 byte
sumber
Julia,
4738 byteIni adalah fungsi anonim yang menerima
Char
array dan mengembalikan boolean. Untuk menyebutnya, tetapkan ke variabel.Ini menggunakan algoritma Dennis, yang lebih pendek dari solusi naif. Kami mendapatkan sisa dari setiap titik kode dibagi dengan 8, menambahkan bahwa untuk itu sendiri dibalik, dapatkan sisanya dari pembagian dengan 5, dan memeriksa apakah semua adalah 0. Langkah terakhir dicapai menggunakan
⊆
, versi infixissubset
, yang melemparkan kedua argumen keSet
sebelum memeriksa. Ini berarti bahwa[0,0,0]
dinyatakan sebagai himpunan bagian dari0
, sejakSet([0,0,0]) == Set(0)
. Ini lebih pendek dari cek eksplisit terhadap 0.Cobalah online!
Disimpan 9 byte berkat Dennis!
sumber
Jolf, 15 Bytes
Cobalah!
Penjelasan:
sumber
Jolf, 16 byte
Coba di sini!
Penjelasan
sumber
Sebenarnya, 19 byte
Ini menggunakan algoritma Dennis .
Cobalah online!
Penjelasan:
sumber
Oracle SQL 11.2, 68 byte
sumber
Julia 0,4, 22 byte
String berisi karakter kontrol EOT (4) dan NAK (21). Input harus dalam bentuk array karakter.
Pendekatan ini XOR karakter input dengan karakter yang sesuai di input terbalik. Untuk pasangan yang valid, ini menghasilkan karakter EOT atau NAK. Pengujian untuk dimasukkan dalam string karakter tersebut menghasilkan Boolean yang diinginkan.
Cobalah online!
sumber
C, 71
2 byte disimpan oleh Dennis. Tambahan 2 byte disimpan dengan mengadaptasi input huruf kecil: konstanta
37
dan21
direvisi menjadi5
dan2
.C, 75
Disimpan satu byte: kurung dihilangkan dengan mengambil produk dari dua kode ASCII mod 37. Pasangan yang valid mengevaluasi ke 21. Mengasumsikan input huruf besar.
C, 76
Menggunakan fakta bahwa kode ASCII dari pasangan yang valid berjumlah 138 atau 149. Ketika diambil mod 11, ini adalah satu-satunya pasangan yang berjumlah 6. Asumsikan input huruf besar.
ungolfed dalam program tes
sumber
r,e;f(char*s){for(r=0,e=strlen(s)+1;*s;s++)r|=*s*s[e-=2]%37^21;return!r;}
menghemat beberapa byte.!=
>^
diriku sendiri. Saya mengurangi 2 lainnya dengan mengubah input huruf kecil: kedua angka ajaib sekarang satu digit.Faktor , 72 byte
Sayangnya regex tidak dapat membantu saya di sini.
Terbalik, tabel pencarian, bandingkan dengan yang sama.
sumber
Bash + coreutils,
4332 byteTes:
sumber
J - 21 byte
Berdasarkan metode Dennis
Pemakaian
Penjelasan
sumber
Labirin , 42 byte
Berakhir dengan kesalahan pembagian-oleh-nol (pesan kesalahan pada STDERR).
Cobalah online!
Tata letaknya terasa sangat tidak efisien tapi saya tidak melihat cara untuk golf sekarang.
Penjelasan
Solusi ini didasarkan pada trik aritmatika Dennis: ambil semua kode karakter modulo
8
, tambahkan pasangan dari kedua ujungnya dan pastikan itu habis dibagi5
.Primer labirin:
Kode dimulai dengan 2x2 kecil, searah jarum jam, yang membaca semua input modulo 8:
Sekarang
;
buang-1
. Kami memasukkan loop searah jarum jam yang menggerakkan bagian atas tumpukan utama (yaitu karakter terakhir) ke bawah:Sekarang ada sedikit linier pendek:
IP sekarang berada di persimpangan yang bertindak sebagai cabang untuk menguji kemampuan dibagi dengan 5. Jika hasil dari modulo adalah nol, kita tahu bahwa input bukan palindrom Watson-Crick dan kami berbelok ke timur:
Kalau tidak, kita harus terus memeriksa sisa input, sehingga IP terus ke selatan. The
{
tarikan atas bawah masukan yang tersisa. Jika kami telah kehabisan input, maka ini akan menjadi0
(dari bawah aux ), dan IP terus bergerak ke selatan:Jika tidak, ada lebih banyak karakter dalam string yang akan diperiksa. IP berubah ke barat dan bergerak ke loop 2x2 (searah jarum jam) berikutnya yang sebagian besar terdiri dari no-ops:
Setelah loop ini, kami mendapat input pada tumpukan utama lagi, kecuali untuk karakter pertama dan terakhir dan dengan nol di atas. The
;
membuang yang0
kemudian=
swap puncak tumpukan, tapi ini hanya untuk membatalkan pertama=
dalam lingkaran, karena kita sekarang sedang memasuki loop di lokasi yang berbeda. Bilas dan ulangi.sumber
sed,
6761 byte(67 byte)
Uji
Keluaran
Dengan menggunakan ekspresi reguler yang diperluas, jumlah byte dapat dikurangi menjadi 61.
sumber
C #, 65 byte
.NET memiliki beberapa nama metode kerangka kerja yang cukup panjang di waktu, yang tidak selalu membuat kerangka golf kode terbaik. Dalam hal ini, nama metode kerangka terdiri dari 33 karakter dari 90. :)
Berdasarkan trik modulus dari tempat lain di utas:
Sekarang berbobot 67 karakter dimana 13 adalah nama metode.
Optimalisasi kecil lainnya untuk mengurangi 2 karakter:
Jadi, 65 di antaranya 13 adalah nama kerangka kerja.
Sunting: Menghilangkan beberapa "boilerplate" terbatas dari solusi dan menambahkan beberapa kondisi membuat kita memiliki ekspresi
Yang memberi 0 jika dan hanya jika string s adalah jawaban yang valid. Seperti yang ditunjukkan oleh kucing, "bool F (string s) =>" sebenarnya dapat diganti dengan "s =>" jika dinyatakan jelas dalam kode bahwa ekspresi adalah a
Func<string,bool>
, yaitu. memetakan string ke boolean.sumber
!s.Zip...
bukans.Zip...==0
? (Atau tidak bisakah Anda!
memasukkan C #?) Sekalipun Anda tidak dapat meniadakan boolean, Anda dapat mengabaikan segala jenis inversi dan menyatakan jawaban Anda bahwa ini mengembalikan <hal ini> untuk falsy dan <deterministik lainnya ini, hal yang jelas dapat dilihat untuk kebenaran.REXX 37
sumber
R, 101 byte
Uji Kasus
sumber
strsplit(x,"")[[1]]
adalah 3 byte lebih pendek dariunlist(strsplit(x,""))
dan, di sini, sama karenax
selalu satu string karakter.Oktaf, 52 byte
Mengikuti trik Denis ... ambil nilai ASCII mod 8, balik dan tambahkan bersama; jika setiap jumlah adalah kelipatan dari lima, Anda adalah emas.
sumber
f=
tugas; fungsi tanpa nama tidak apa-apa.Clojure / ClojureScript, 49 karakter
Bekerja pada string. Jika persyaratan dilonggarkan untuk memungkinkan daftar, saya bisa melepas
(list* )
dan menyimpan 7 karakter.sumber
R, 70 byte
Pemakaian:
sumber
C, 71 byte
Memerlukan kode ASCII untuk karakter yang relevan, tetapi menerima input huruf besar, huruf kecil atau campuran.
Kode ini mempertahankan dua petunjuk,
s
danp
, melintasi string ke arah yang berlawanan. Pada setiap langkah, kami membandingkan karakter yang sesuai, menetapkanb
true jika mereka tidak cocok. Pencocokan didasarkan pada XOR dari nilai karakter:Kita dapat melihat pada tabel di atas bahwa kita ingin mencatat keberhasilan
xx10x
dan kegagalan untuk hal lain, jadi kita XOR dengan00100
(empat) dan menyamarkan dengan00110
(enam) untuk mendapatkan nol untukAT
atauCG
tidak nol sebaliknya. Akhirnya, kita mengembalikan true jika semua pasangan mengumpulkan hasil nolb
, false jika tidak.Program uji:
sumber
𝔼𝕊𝕄𝕚𝕟, 13 karakter / 17 byte
Try it here (Firefox only).
Penjelasan
Input transliterasi dari
ACGT
keTGCA
dan periksa apakah string yang dihasilkan adalah palindrom.sumber