Tugas Anda hari ini: menggambar kurva naga!
Jika Anda tidak tahu apa itu Dragon Curve, berikut adalah video pengantar ViHart (Sungguh keren, tolong tonton!)
Tugas Anda: menggambar kurva naga, iterasi setidaknya 9 kali. Anda tidak harus menunjukkan iterasi 1 hingga 9, Anda hanya harus menunjukkan kurva akhir yang dihasilkan setelah menyelesaikan (setidaknya) 9 iterasi. Kurva harus digambarkan sebagai garis lurus yang menghubungkan titik-titik pada kurva; output harus cocok dengan salah satu gambar di bawah ini yang menunjukkan 9 atau lebih iterasi (hingga refleksi, rotasi, penskalaan, dan variasi dalam lebar garis, warna garis, dan warna latar belakang). Output Anda harus cukup besar sehingga garis individual dan "kotak" yang mereka bentuk dapat dibedakan satu sama lain; jika dua garis tidak berpotongan dalam kurva, mereka seharusnya tidak menempati piksel yang sama atau berdekatan dalam output (harus ada setidaknya satu piksel dari latar belakang yang terlihat di antara mereka). Anda dapat menampilkan gambar ke layar atau menyimpan gambar ke file diterima. Outputnya harus grafis - tidak boleh ASCII art.
Kode terpendek dalam byte menang, namun termasuk arahan untuk perpustakaan tidak boleh dimasukkan dalam jumlah byte, dan Anda dapat menggunakan perpustakaan grafis atau perpustakaan lain yang ditulis untuk bahasa pilihan Anda jika ditulis sebelum posting.
Harap sertakan gambar output program Anda.
Lewati paragraf ini jika Anda menonton video:Bagi Anda yang memutuskan untuk tidak menonton video, 12 iterasi pertama dari kurva naga ditampilkan di bawah ini. Untuk keperluan tugas ini, kurva naga adalah kurva yang dihasilkan oleh aturan berikut: ambil titik akhir dari kurva saat ini, buat kurva kedua diputar 90 derajat di sekitar titik-akhir sehingga titik akhir dari dokumen asli kurva adalah titik awal dari kurva baru, dan bergabung dengan dua kurva menjadi kurva tunggal di mana mereka bertemu. Pada gambar yang ditunjukkan di bawah ini, setiap iterasi baru dihasilkan dengan memutar iterasi sebelumnya 90 derajat ke kiri di sekitar titik akhir setiap iterasi. Ketika kurva ditampilkan di layar, tidak jelas ujung mana yang dianggap sebagai "titik akhir", namun ketika kurva disimpan sebagai array titik, mudah untuk menentukan "titik akhir" sebagai titik terakhir dalam array.
Seni Ascii dihargai, tetapi tidak diterima: Ini adalah keluaran grafis, bukan seni-ascii.
sumber
Jawaban:
x86, MSDOS, 16 byte
Saya menulis ini beberapa waktu yang lalu, setahu saya rutin terkecil untuk menghasilkan fraktal naga. Tidak menggunakan iterasi nyata, melainkan plot setiap pixel disk yang terkandung di dalam fraktal secara langsung, menunjukkan gambar akhir . Sudah termasuk dengan banyak produksi kecil lainnya dalam paket ini . Versi 16 byte adalah akhir dari upaya saya untuk mendapatkan fraktal naga sekecil mungkin, mulai 2014 dengan produksi 32 byte ini .
Hex
Kode
sumber
Python 2/3,
1691671501119878 BytesPerhatikan bahwa impor tidak termasuk dalam hitungan byte, sesuai dengan spesifikasi tantangan.
Terima kasih kepada @AlexHall untuk menghemat 39 (!) Byte dan @ nedla2004 untuk 13 lainnya
Mulai dengan membuat daftar atau belok kanan (90) dan kiri (-90), kemudian menelusuri daftar dan memindahkan kura-kura.
Output yang dihasilkan:
EDIT: Jika ini terlalu membosankan, tonton
speed(0)
tepat sebelum yang pertamafd(5)
. Ini akan berjalan sama, kecuali kura-kura akan bergerak lebih cepat.sumber
Logo, 43 byte
Coba dengan penerjemah di http://www.calormen.com/jslogo/#
Ini menggunakan prinsip yang sama dengan jawaban seni ASCII saya sebelumnya dan rumus di wikipedia kecuali saya membalik arah untuk mencocokkan gambar dalam pertanyaan:
bitand :i -:i
menemukan sedikit signifikani
. Kami membagii
ini untuk mengurangii
jumlah yang diperlukan, memberikan jumlah ganjil yang diperlukank
. Tidak perlu membedakan antara belokan kiri dan kanan; kita belok kiri sedikit demi sedikitk*90
dan mengandalkan fakta bahwa rotasi adalah operasi modulo 360 untuk melakukan modulo bagi kita.Keluaran
gunakan
ht
untuk menyembunyikan kura-kura jika diperlukan.Keluaran (dimodifikasi)
Berikut ini menunjukkan bagaimana kurva adalah untai tunggal.
sumber
LindenMASM , 51 Bytes
LindenMASM adalah bahasa yang saya buat untuk suatu tantangan beberapa waktu lalu yang akan selamanya hidup di Sandbox. Itu menggunakan konsep sistem Lindenmayer untuk menggambar hal-hal seperti kurva Naga, tanaman fraktal, segitiga Sierpinski, dll.
Kode sumber adalah sebagai berikut:
Untuk mengatur ini
n = 6
misalnya:Ini menghasilkan gambar berikut melalui Python 3
turtle
:Mungkin ada sedikit perbedaan penomoran untuk iterasi, seperti dalam sistem Lindenmayer, iterasi pertama adalah satu baris. Begini tampilannya
n = 10
:Hanya untuk bersenang-senang, inilah yang terlihat seperti dengan 15 generasi (dengan instruksi tambahan
MOV 2
untuk membuatnya sedikit lebih kecil):Setelah Anda mendapatkan hingga 20 generasi (dengan
MOV 0.5
) Anda tidak dapat benar-benar melihat garis lagi, dan dibutuhkan BANYAK langkah untuk membuat (pasang+-
dan-+
tidak dioptimalkan). Inilah yang Anda dapatkan:Perhatikan bahwa juru bahasa saat ini dapat menyajikan masalah grafis untuk jumlah generasi yang lebih kecil, yaitu mungkin tidak menarik ke layar. Sayangnya ketika penerjemah ini dibuat tidak ada masalah, kemungkinan perubahan pada Python 3 bisa menyebabkan ini atau itu bisa saja sistem saya
sumber
Di bawah beban, 196 byte
Saya pikir mungkin menarik untuk mencoba tantangan ini di esolang bertenaga rendah; Underload cukup baik untuk bahasa dengan jumlah perintah yang rendah.
Outputnya adalah file SVG dengan tag yang sangat bersarang, dan beberapa pintasan golf. Sejauh ini, saya belum menemukan browser yang dapat menampilkannya (Firefox hang selama beberapa menit mencoba memuatnya, dan baik Firefox maupun Chromium memberikan layar kosong). Sebagian besar program pengolah gambar tidak dapat memuatnya (membuatnya sulit untuk dikonversi ke format lain), tetapi saya berhasil memuatnya di Eye view Gnome (yang merupakan bagian dari penginstalan default pada Ubuntu). Jadi saya mengambil tangkapan layar gambar sehingga Anda dapat melihatnya (gambar sebenarnya memiliki latar belakang transparan, tetapi Anda tidak dapat benar-benar tangkapan layar transparan):
Kita perlu menentukan ukuran gambar secara eksplisit. Memilih orientasi yang tepat untuk gambar, menggambar semuanya pada ukuran hukum minimum, dan melakukan jumlah minimum iterasi yang ditentukan oleh tantangan, memberi kita sebuah gambar yang hanya cocok menjadi lebar 99 piksel, menyimpan byte. Sangat menyenangkan ketika semuanya berjalan seperti itu.
Algoritma umum yang digunakan untuk menggambar gambar adalah untuk mempertahankan dua variabel (Underload tidak menamai variabel, tetapi saya menganggapnya sebagai x dan y ), keduanya awalnya kosong. Kemudian kami berulang kali mengganti ( x , y ) dengan ( x , belok kiri dan bergerak maju, y ) dan ( x , belok kanan dan bergerak maju, y ). Setelah sepuluh iterasi, baik x dan y memegang kurva naga sembilan iterasi.
Ada juga beberapa optimasi mikro dan trik khusus yang kurang memuat. Untuk menghindari terlalu banyak bermain-main dengan bagian atas tumpukan, setiap iterasi loop, kita mulai dengan menggabungkan x dan y ke fungsi "mengembalikan string yang dibuat dengan menggabungkan: x , instruksi belok, argumen fungsi, argumen instruksi ke depan, dan y . " Fungsi ini hanya memakan satu ruang di stack, jadi kita bisa menduplikasinya, menyebutnya dengan
-90
argumen, menukar nilai kembali di bawah duplikat, dan menyebutnya dengan90
sebagai argumen, untuk mendapatkan nilai-nilai baru untuk x dan ytanpa perlu menyentuh lebih dari dua elemen teratas tumpukan (yang sejauh ini paling mudah diakses). Fungsi ini dihasilkan kode saat runtime. Generator itu sendiri juga dihasilkan kode saat runtime, untuk memungkinkannya menggunakan kembali string<g transform="translate
yang juga digunakan untuk mengatur asal gambar. Kami membuat semua tag terbuka terlebih dahulu, dan kemudian karena semua tag dekat itu adil</g>
, kami dapat menampilkan 1024 tag dekat hanya dengan mengulangi string, tanpa khawatir akan mencocokkannya dengan tag terbuka. (Menulis angka secara efisien dalam Underload adalah masalah yang menarik dalam dirinya sendiri;(:*)::*:**:*
mungkin merupakan cara paling efisien untuk menulis 1024, meskipun, menerjemahkan ke "2 pangkat dari (1 + 2 × 2) × 2".Underload tidak memiliki pustaka grafis, jadi saya membuat SVG menggunakan kombinasi garis gambar pada posisi tetap, dan memutar gambar di sekitar titik tertentu; alih-alih membalikkan pena, kita membalikkan kertas. Idenya adalah dengan menggambar garis, memutar seluruh gambar, menggambar garis lain, memutar gambar lagi, dll., Kita dapat secara efektif mensimulasikan grafik penyu tanpa harus melakukan aritmatika atau menggunakan perpustakaan grafik, karena semua garis digambar di lokasi yang sama. Tentu saja, itu berarti bahwa kami memiliki beberapa tag rotate-the-image yang sangat bersarang, yang membingungkan banyak pemirsa SVG.
Styling gambar akan dihitung melawan jumlah byte, jadi saya perlu memberikan styling minimum yang diperlukan untuk menampilkan gambar. Ini ternyata
stroke="#"
, yang kurang lebih diterjemahkan sebagai "garis harus berwarna"; ini tampaknya diperluas untuk menggambarnya dalam warna hitam. (Biasanya Anda akan menentukan warna sebagai, katakanlah, "# 000".) Latar belakang transparan secara default. Kami tidak menentukan lebar goresan, tetapi pilihan yang dipilih oleh Eye of Gnome membuat semuanya terlihat.Banyak penerjemah Underload berjuang dengan program ini, misalnya yang ada di Try It Online mogok, karena menghasilkan beberapa string yang sangat besar secara internal. Namun, penerjemah Underload online asli berfungsi. (Yang menarik, juru bahasa pertama sedang online, jadi bahasanya bisa digunakan online sebelum bisa digunakan secara offline.)
Sesuatu yang saya sedikit tidak nyaman adalah sepertinya hanya ada 1023 segmen garis di sini, dan kita harapkan 1024. Bisa jadi salah satu segmen pada akhirnya tidak tertarik dengan algoritma ini (itu akan menjadi digambar pada iterasi berikutnya sebagai gantinya). Jika itu mendiskualifikasi, itu mungkin untuk mengadaptasi program, tetapi mungkin berakhir jauh lebih lama. (Bukannya tantangan ini akan memenangkan persaingan; sudah ada beberapa entri yang lebih pendek.)
sumber
MATL , 26 byte
Jika skala yang berbeda dalam dua sumbu diterima, kode dapat dikurangi menjadi 19 byte:
Angka-angka di bawah ini sesuai dengan versi skala yang sama (26-byte).
Kode di atas menghasilkan iterasi ke 9 (berbasis 0), yaitu gambar kesepuluh dalam tantangan:
Untuk nilai-nilai lain, ubah
9
kode tersebut, atau ganti dengani
mengambil nomor tersebut sebagai input pengguna. Misalnya, hasilnya13
adalah:Penjelasan
Ini menggunakan loop untuk secara bertahap membangun array langkah - langkah yang diikuti oleh kurva di bidang kompleks. Misalnya, dua langkah pertama adalah
1j
(atas) dan-1
(kiri).Di setiap iterasi, array langkah sejauh ini disalin. Salinan array dibalik , dikalikan dengan
1j
(untuk memutar 90 derajat), dan disatukan dengan aslinya.Setelah loop, jumlah kumulatif dari langkah-langkah memberikan poin yang sebenarnya, yang kemudian diplot dalam bidang kompleks.
sumber
Mathematica 86 byte
Cara kerjanya:
{1,-1}
Output{1,-1}
. Ini pada dasarnya "mendorongnya ke tumpukan". Nilai ini dapat ditarik kembali dengan%
.r=Reverse
pada dasarnya hanya mengganti nama fungsi Reverse karena saya menggunakannya dua kali dalam kode. TheGraphics@Line@
hanya membutuhkan daftar poin dan menarik garis yang menghubungkan mereka. Daging yang sebenarnya dari masalah yang terjadi di segmen kode ini:Nest[Join[l=Last@#;h=#-l&/@#,r[r@#%&/@h]]&,{{0,0},%},9]
. Biar saya katakan - segmen itu rumit seperti f ****** ck. BeginiNest
caranya:Nest[f,x,9]
menampilkan hasil panggilanf[f[f[f[f[f[f[f[f[x]]]]]]]]]
.Dalam kode saya, argumen pertama ini
f
adalahJoin[l=Last@#;h=#-l&/@#,r[r@#%&/@h]]&
:, argumen keduax
adalah{{0,0},%}
(yang mengevaluasi ke{{0,0},{1,-1}}
), dan argumen ketiga adalahn
, yang hanya 9 (yang hanya akan menerapkan argumen pertama ke argumen kedua sebanyak 9 kali).Bagian paling kompleks dari semuanya adalah argumen pertama ini:,
Join[l=Last@#;h=#-l&/@#,r[r@#%&/@h]]&
yang merupakan kekacauan besar dari sintaksis gula yang hampir murni. Saya benar - benar menyalahgunakan gula sintaksis matematika untuk yang satu ini. Baris kode itu mewakili versi matematika dari fungsi anonim, kecuali untuk mempersingkat hal-hal yang sebenarnya saya definisikan dua fungsi anonim yang terpisah di dalam fungsi anonim itu. Ya, itu legal, kawan. Mari kita jabarkan.Join
Dibutuhkan dua argumen. Yang pertama adalahl=Last@#;h=#-l&/@#
, dan yang kedua adalahr[r@#%&/@h]
.Argumen pertama Gabung: Di dalam fungsi anonim "utama",
#
adalah daftar semua titik pada iterasi saat ini di kurva. Jadil=Last@#;
berarti "Ambil titik dalam daftar poin yang Anda terima sebagai input, dan tetapkan titik itu ke variabell
. Segmen berikutnya,,h=#-l&/@#
sedikit lebih kompleks. Ini berarti" Anda memiliki fungsi. Fungsi ini mengambil titik sebagai input, mengurangil
, dan mengembalikan hasilnya. Sekarang, terapkan fungsi itu ke setiap elemen dalam daftar poin yang Anda terima sebagai input untuk menghasilkan daftar poin bergeser, dan tetapkan daftar baru itu ke variabelh
.Argumen kedua dari Join:
r[r@#%&/@h]
memiliki sintaks yang paling kompleks yang pernah saya tulis. Saya tidak percaya ada segmen kode yang berisi sesuatu@#%&/@
- sepertinya saya mengutuk seperti karakter kartun di tengah program! Tetapi mungkin untuk memecahnya. Ingat -r[x]
mengambil daftar poin dan mengembalikan daftar itu dalam urutan terbalik.r@#%&
adalah fungsi anonim yang membalikkan inputnya, lalu mengalikannya dengan nilai yang bertingkat%
(yaitu{1,-1}
), dan mengembalikan hasilnya. Pada dasarnya itu memutar input 90 derajat, tetapi dalam kode sesingkat mungkin saya bisa menulis. Kemudianr@#%&/@h
berarti "Keluarkan daftar baru yang setiap titiknyah
diputar 90 derajat."Jadi secara keseluruhan,
Join[l=Last@#;h=#-l&/@#,r[r@#*%&/@h]]&
adalah fungsi yang mengambil daftar poin sebagai input, dan menambahkan daftar poin yang sama diputar 90 derajat untuk mendapatkan iterasi kurva berikutnya. Ini diulangi 9 kali untuk mendapatkan kurva naga. Maka inilah daftar poin yang dihasilkan ditarik ke layar sebagai garis. Dan hasilnya:sumber
0{,}
... bekerja karena0 x
merupakan0
untuk hampir semuax
dan{,}
gula sintaksis untuk{Null,Null}
.Python 2, 43 byte
Jawaban ini adalah 43 byte tidak termasuk pernyataan impor dan sebagian besar didasarkan pada jawaban Logo Level River dan penggunaannya
i/(i&-i)
dalam kode mereka. Cobalah online di trinket.ioIni adalah gambar dari output.
sumber
The shortest code in bytes wins, however include directives for libraries shouldn't be included in the byte count, and you may use graphics libraries or other libraries written for your language of choice if they were written before the posting.
Mathematica,
5655 bytePenjelasan: OEIS A034947
Hanya untuk bersenang-senang, ini adalah versi berwarna dari iterasi ke-19.
sumber
Mathematica, 63 byte
Menggunakan
AnglePath
sumber
HTML + JavaScript, 182
sumber
Diagram Haskell +, 179 byte
Output adalah file svg lebar 99 piksel dengan latar belakang transparan (gambar dengan lebar 9 piksel akan memiliki garis yang terlalu tebal untuk melakukan recoqnize apa pun). Di sini itu diubah skala dan dikomposisi di atas latar belakang putih:
sumber
tosh , 518 byte
tosh adalah Scratch , tetapi dengan teks alih-alih blok. Pada 518 byte, jawaban ini mungkin bahkan lebih buruk daripada Java.
Jawaban ini menggunakan logika yang sama dengan jawaban Thethon Python @ , tetapi dengan string "L" dan "R" bukan angka, karena kemampuan daftar Scratch (dan dengan demikian tosh) mengerikan.
Anda dapat menjalankannya sebagai proyek Awal di sini . (tosh mengkompilasi ke Scratch proyek)
Penjelasan:
Bagian pertama ini membuat program berjalan ketika bendera hijau diklik (
when flag clicked
), menetapkan variabel path ke "R", dan membuat sprite dan stage dalam keadaan yang tepat untuk siap menggambar.Sekarang kita sampai pada kode pembuatan jalur. Ia menggunakan logika yang sama dengan jawaban Thethon Python , kecuali dengan string "R" dan "L" alih-alih angka, dan kami menggunakan loop bersarang alih-alih daftar pemahaman.
Akhirnya, kita menggambar path dengan menelusuri setiap huruf dari variabel path dan berbelok ke kiri atau kanan tergantung pada surat itu.
sumber