Latar Belakang
Sistem L (atau sistem Lindenmayer) adalah sistem penulisan ulang paralel yang, antara lain, dapat dengan mudah digunakan untuk memodelkan fraktal. Pertanyaan ini menyangkut deterministik, sistem-L-bebas konteks . Ini terdiri dari alfabet simbol, string aksioma awal dan seperangkat aturan penulisan ulang yang memetakan setiap simbol alfabet ke string baru. Aturan diterapkan pada aksioma secara paralel, menghasilkan string baru. Proses ini kemudian diulang.
Sebagai contoh, sistem dengan aksioma "A" dan aturan A = ABA; B = BBB menghasilkan urutan string "ABA", "ABABBBABA", "ABABBBABABBBBBBBBABABBBABA", dll. Untuk keringkasan, kami tidak secara eksplisit menyebutkan alfabet saat mendefinisikan sistem-L. Lebih lanjut, simbol apa pun tanpa aturan penulisan ulang eksplisit diasumsikan tidak berubah (yaitu aturan default untuk simbol A adalah A = A).
Sistem-L dapat divisualisasikan menggunakan bentuk grafik penyu. Dengan kebiasaan, kura-kura mulai menghadap ke kanan. Sebuah string kemudian digambar dengan mengulangi simbolnya: F berarti "menggambar maju satu unit", G berarti "bergerak maju satu unit", a + berarti "belok kiri satu unit sudut" dan a - berarti "belok kanan satu sudut satuan". Semua simbol lain dalam string diabaikan. Untuk tujuan pertanyaan ini, unit sudut diasumsikan selalu 90 °.
Tugas
Diberikan spesifikasi dari setiap sistem-L dan sejumlah iterasi, program Anda harus menampilkan rendering ASCII dari string yang dihasilkan (seperti dijelaskan di atas) menggunakan karakter gambar kotak.
- Parameter dilewatkan sebagai string yang dipisahkan oleh spasi yang terdiri dari aksioma, aturan penulisan ulang (sebagai; - daftar persamaan yang dipisah) dan jumlah iterasi yang ditulis ulang. Misalnya, input "FF = FGF; G = GGG 2" menghasilkan string "FGFGGGFGF" dan karenanya menggambar empat garis dengan celah yang sesuai.
- Simbol yang digunakan oleh sistem-L dapat berupa karakter ASCII selain dari ruang dan titik koma. Paling banyak ada satu aturan eksplisit yang ditentukan per simbol (dengan aturan penulisan ulang default menjadi pemetaan identitas seperti dijelaskan di atas).
- Anda dapat mengasumsikan bahwa output akan selalu mengandung setidaknya satu F.
- Outputnya harus menggunakan karakter gambar kotak UNICODE berikut untuk mewakili visualisasi: ─ (U + 2500), │ (U + 2502), ┌ (U + 250C), ┐ (U + 2510), └ (U + 2514) , ┘ (U + 2518), ├ (U + 251C), ┤ (U + 2524), ┬ (U + 252C), ┴ (U + 2534), ┼ (U + 253C), ╴ (U + 2574), ╵ (U + 2575), ╶ (U + 2576) dan ╷ (U + 2577). Lihat contoh di bawah ini.
- Output tidak boleh berisi baris kosong di atas karakter kotak paling atas atau di bawah yang paling bawah. Seharusnya juga tidak mengandung spasi di sebelah kiri kotak characer paling kiri atau di sebelah kanan yang paling kanan. Garis dengan spasi tambahan yang tidak melampaui karakter kotak paling kanan diizinkan.
Anda dapat menulis program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi. Hasil harus dicetak ke STDOUT (atau alternatif terdekat), disimpan ke file atau dikembalikan sebagai string.
Contohnya
# Cantor dust
>> "F F=FGF;G=GGG 0"
╶╴
>> "F F=FGF;G=GGG 1"
╶╴╶╴
>> "F F=FGF;G=GGG 2"
╶╴╶╴ ╶╴╶╴
>> "F F=FGF;G=GGG 3"
╶╴╶╴ ╶╴╶╴ ╶╴╶╴ ╶╴╶╴
# Koch curve
>> "F F=F+F−F−F+F 1"
┌┐
╶┘└╴
>> "F F=F+F-F-F+F 2"
┌┐
┌┘└┐
┌┘ └┐
┌┼┐ ┌┼┐
╶┘└┘ └┘└╴
Contoh lain untuk menguji program Anda dengan termasuk:
# Dragon curve
>> "FX X=X+YF+;Y=-FX-Y n"
# Hilbert curve
>> "A A=-BF+AFA+FB-;B=+AF-BFB-FA+ n"
# Sierpinski carpet
>> "F F=F+F-F-F-G+F+F+F-F;G=GGG n"
Dua yang pertama terlihat sebagai berikut (diproduksi menggunakan jawaban @ edc65):
Anda dapat menguji salah satu sistem di halaman ini .
Mencetak gol
Kode terpendek (dalam byte) menang. Aturan standar berlaku.
Lain-lain
Tantangan ini terinspirasi oleh Draw a Random Walk with Slashes . Bahkan, mungkin untuk merepresentasikan jalan acak sebagai sistem-L jika kita memperluas sistem untuk memungkinkan banyak aturan per simbol, dengan ekspansi yang dipilih secara non-determis selama penulisan ulang. Salah satu formulasinya adalah:
"F F=FF;F=F+F;F=F++F;F=F+++F"
Ekstensi umum lainnya, yang sering digunakan ketika memodelkan pabrik, adalah untuk menafsirkan karakter [dan] sebagai mendorong dan muncul posisi dan sudut saat ini. Sebagian besar tanaman menggunakan sudut yang lebih kecil dari 90 °, tetapi di sini ada satu contoh yang tidak:
"FAX X=[-FAX][FAX][+FAX];A=AFB;B=A"
Tak satu pun dari contoh ini yang perlu didukung dalam tantangan ini.
Tantangan ini juga mirip dengan "Maaf, anak muda, tetapi Turtles sepenuhnya turun!" . Namun, tantangan itu menggunakan render garis daripada ASCII dan memungkinkan sintaks yang lebih fleksibel.