Kode Anda akan menghasilkan representasi DNA ASCII-art yang sangat sederhana, selamanya. Dibutuhkan dua angka sebagai input dalam format apa pun yang Anda inginkan: sebagai daftar, sebagai argumen untuk fungsi, di stdin, dll.
- Interval titik-mengambang
I
dalam detik antara 0,0 dan 1,0 (inklusif) - Level zoom
Z
sebagai bilangan bulat dari 1 hingga 64 (inklusif)
Kode Anda akan mencetak satu baris ke stdout atau yang setara setiap I
detik, menghasilkan output tanpa batas yang terlihat seperti ini (untuk level zoom 4):
A
T-----a
G-------c
G-----c
g
t-----A
a-------T
c-----G
T
A-----t
C-------g
...
Secara khusus, representasi kami DNA adalah sepasang gelombang sinus dihubungkan dengan tanda hubung, salah satu yang terdiri dari karakter a
, c
, g
, dan t
, yang lain dari karakter A
, C
, G
, dan T
. Jika x
nomor 0-diindeks dari garis yang sedang kita cetak, posisi berbasis-0 karakter dalam gelombang huruf kecil diberikan oleh (sin(πx / Z) + 1) * Z
, dan pada gelombang huruf besar diberikan oleh (-sin(πx / Z) + 1) * Z
, keduanya bulat (tidak berlantai) ke terdekat bilangan bulat. Keterangan lebih lanjut:
- Dalam kasus di mana kedua gelombang tumpang tindih, Anda harus mengganti gelombang yang ada di depan, dimulai dengan gelombang huruf besar. (Dimulai dengan gelombang huruf kecil akan memberi kita heliks ganda yang tidak ada !)
- Mengabaikan kasus, A selalu berpasangan dengan T dan C selalu berpasangan dengan G, seperti pada DNA asli. Pasangan itu sendiri harus dipilih secara acak dengan distribusi yang seragam atas empat kemungkinan. Tidak masalah jika pilihan pasangan sama atau berbeda pada berturut-turut menjalankan kode Anda. Kualitas statistik dari pilihan acak Anda tidak menjadi masalah selama output tidak memiliki pola yang jelas dan periode setidaknya dalam miliaran (PRNG cacat seperti RANDU baik-baik saja.)
- Anda tidak boleh memiliki spasi tambahan atau gabungkan setiap baris ke posisi maksimum gelombang pada level zoom tersebut (dalam contoh di atas, sembilan karakter.) Level zoom 1 mungkin memiliki satu ruang tambahan tambahan opsional untuk alasan matematis.
Karena DNA kecil, kode Anda harus sesingkat mungkin.
Lebih banyak contoh:
Tingkat zoom 8:
T
C-----g
A-----------t
C-------------g
G---------------c
T-------------a
T-----------a
T-----a
c
g-----C
t-----------A
g-------------C
a---------------T
...
Tingkat pembesaran 2:
A
T---a
c
g---C
G
A---t
c
a---T
...
Tingkat zoom 1 (perhatikan ruang utama):
G
a
C
t
...
Jawaban:
Ruby, Rev B
171161 byteMemperbaiki output untuk z = 1 biaya 10 byte. Ini adalah kasus khusus: heliks benar-benar lebar 3 karakter jika Anda melihatnya pada 90 derajat, tetapi seperti yang kita lihat pada 0 derajat itu terlihat hanya lebar 1 karakter.nol spasi di depan pada z = 1 tidak lagi diperlukanBeberapa penghematan dengan menghilangkan tanda kurung dan dengan mengalikan y.ab dengan 2 sebelum pemotongan saat menghitung jumlah - karakter yang diperlukan.
Akhirnya, saya menghindari
include Math
(diperlukan untuksin
danPI
) dengan menggunakan bilangan aritmatika kompleks dengan kekuatan bilangani
. Bagian imajiner dari bilangan kompleks setara dengan sin x, kecuali bahwa ia mengulangi dengan periode 4 bukannya periode 2 * PI. Menyimpan untuk perubahan ini adalah 1 atau 0 byte.Ruby, Rev A 165 byte
Ini jauh lebih lama dari yang diharapkan. Ada beberapa peluang golf potensial untuk dieksplorasi.
Berkomentar dalam program uji
sumber
I=gets.to_i
seharusnya dalam program pengujian AndaI=gets.to_f
.C,
294289285283281270265237218 byteAtau versi yang lebih panjang yang mem-parsing input dari main:
Ini adalah implementasi keseluruhan yang cukup bodoh, dengan beberapa trik printf dilemparkan. Ada beberapa yang hilang termasuk, menggunakan sintaks K&R untuk fungsi, dan bergantung pada range initializer GCC, jadi ini tidak terlalu standar. Juga versi fungsi masih menggunakan global, jadi hanya bisa dipanggil sekali!
Versi fungsi mengambil 2 parameter; tunggu (dalam detik) dan perbesar. Ini peneleponnya:
Jalankan sebagai:
Kerusakan:
sumber
strtod
danatof
.C,
569402361 byteMengocok ini dengan cukup cepat sehingga saya yakin ada beberapa hal lain yang bisa saya lakukan untuk mengurangi skor saya tetapi saya senang saya mendapatkan program ini untuk dikompilasi dan berjalan dengan baik pada upaya pertama.
Versi de-golf:
UPDATE: Saya menyesuaikan loop untuk mencetak semuanya dalam satu pernyataan cetak dan menggunakan fakta bahwa variabel didefinisikan sebagai int secara default untuk mencukur beberapa byte. UPDATE2: Beberapa var renaming dan beberapa pemendekan logika untuk mencukur beberapa byte lagi.
sumber
JavaScript (ES6)
241244227222231 byteIni terlihat menarik - Saya suka seni ASCII!
Baru mulai, masih dalam proses bermain golf ...
--- EDIT: ternyata saya tidak bisa memasukkannya ke eval () - jika tidak, ia tidak bisa mengakses vars I dan Z (jadi tambah 9 byte)
- Disimpan 6 byte berkat pengguna81655
- disimpan 5 byte berkat Dave
Penjelasan
sumber
c^=!e
alih-alihc+=a==b
(memungkinkan Anda menghapus%2
cek nanti). Juga-m+2
bisa2-m
!c=c^(e==0)
; itu berlaku XOR dengan cara yang sama seperti sebelumnya Anda memiliki tambahan. Jika Anda tidak terbiasa dengan XOR, ini adalah operasi bitwise: eXclusive OR (wikipedia dapat menjelaskannya dengan benar)