Di bawah beban, 196 byte
()()(<svg width="99" height="147">)S(<g transform="translate):S((33,33)">)S((3,0)rotate)*a(*a(~*)*~("><path d="M0h3" stroke="#"/>)~*a(*)**:(-90)a~^~(90)a~^)*::*:**:*^S(</g>)(:*)::*:**:*^S(</svg>)S
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 dengan 90
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.)