Jalankan Sistem Lindenmayer
Sebuah Lindenmayer Sistem (atau L-system) terkait dengan Thue dan Pos sistem, dan digunakan dalam pemodelan botani dan generasi fraktal .
Sistem-L dijelaskan dengan penulisan ulang string di mana simbol dari simbol-alfabet dipetakan ke urutan penggantian simbol. Kumpulan pemetaan ini merupakan sistem L yang tepat.
Metode output grafis seperti yang dirancang oleh Prusinkiewicz menginterpretasikan urutan yang dihasilkan setelah pemetaan diterapkan pada urutan awal untuk jumlah iterasi tertentu , seperti perintah Turtle-Drawing: maju, mundur, kiri, kanan, hal-hal semacam itu. Ini mungkin memerlukan kode tambahan untuk mengontrol skala gambar karena jumlah iterasi yang berbeda dapat menghasilkan gambar dengan ukuran yang berbeda secara drastis.
Tugas Anda adalah menjalankan sistem-L dalam jumlah karakter paling sedikit. Program Anda harus dapat me-render Kurva Naga dan Batang Bercabang dari halaman Wikipedia dengan memberikan input yang sesuai (file, baris perintah, tetapi eksternal ke sumbernya, silakan).
Ini kode golf.
Sunting: Berikut adalah beberapa contoh yang telah saya posting di sekitar kota. jawaban untuk SO / rotate-to-north { Di mana saya pertama kali menemukan sistem-L } , jawaban untuk SO / bagaimana-program-a-fraktal , jawaban untuk SO / rekursi-dalam-postscript , diskusi comp.lang.postscript / resital , koleksi sistem-l postscript , codegolf.SE/draw-a-sierpinski-triangle {asal kompetisi antara saya dan thomasW} .
sumber
Jawaban:
Mathematica
200198188171168Spaces ditambahkan untuk kejelasan:
Dimana:
Tata bahasa aturan produksi:
Urutan {2,4,6,8} ada di sana karena saya menggunakan
I^n
(I
= unit imajiner) untuk berbelok.Contoh:
sumber
Graphics@k
olehGraphics@Flatten@k
jika Anda berencana untuk menggunakan banyak iterasi. Kalau tidak, Batas Rekursi akan menggigit Anda dan sesi Mma Anda akan dibatalkan.Python,
369294Bukan pemenang, tetapi saya akan tetap memposting apa yang saya coba.
Tidak pandai bermain golf Python ...... Mungkin orang lain bisa melakukannya.
Memasukkan
Input berasal dari file eksternal bernama "l" (tanpa ekstensi), dengan format berikut:
Baris 1 : Status awal (Aksioma)
Baris 2 : Aturan yang dipisahkan koma
Simbol
f
danF
: Menggambar ke depan+
: Belok kanan 5 derajat-
: Belok kiri 5 derajat[
: Simpan posisi dan tajuk]
: Posisi pop dan tajukSimbol lainnya diabaikan oleh fungsi menggambar.
Aturan
Aturan ada dalam format.
"predecessor":"successor(s)"
Perhatikan bahwa tanda kutip diperlukan, baik tunggal atau ganda.
predecessor
harus berupa karakter tunggal.Juga, tidak ada konstanta implisit: Anda harus secara eksplisit menetapkan aturan tidak ada perubahan untuk itu.
Contohnya
Batang percabangan
Keluaran
Perhatikan bahwa sumber dimodifikasi untuk mengeluarkan ini HANYA UNTUK MENURUNKAN GRAFIK KE DAERAH YANG TAMPAK. Konsol juga digunakan untuk menyembunyikan "kura-kura".
Kurva naga
Keluaran
Lagi, konsol digunakan untuk menyembunyikan "kura-kura".
Segitiga Sierpinski
Generasi Keluaran dikurangi menjadi 5 di sini.
sumber
f
,r
,l
; menambahkan parameter dummy keo
danc
; dan kemudian mengubah pseudo-switch ke{'f':fd,'F':fd,'+':rt,'-':lt,'[':o,']':c}[k](5)
g
, dan saya pikiro
danc
layak dihilangkan denganif
pernyataan inline (lebih murah daripadaglobal
deklarasi)o
danc
langsung di pseudo-switch) memberikan kesalahan sintaks, tetapi yang lain tidak t.s,R,*p=input().split()
. 3. Hasilkan nilai akhir daris
olehexec('s="".join(map(eval(R).get,s));'*8)
. 4. Tinggalkancontinue
. 5. Hanya indentasi 1 spasi. 6. Hemat ruang setelahif
dengan beralih sisi untuk tes. 7. Putk:int
dalamdict
(entri pertama) dan kemudian Anda tidak perluexcept: try:
. (Saya mendapatkan 215 karakter.)Javascript (179 byte)
Tidak sepenuhnya yakin ini memenuhi syarat, karena objek aturan melakukan semua gambar yang sebenarnya.
Demo (Naga, animasi):
- Diperluas: http://jsfiddle.net/SVkMR/9/show/light
- Dengan Kode: http://jsfiddle.net/SVkMR/9/
Diperkecil:
Dapat dibaca (ish):
Memasukkan:
Pemakaian:
Bonus: Golden Spiral http://jsfiddle.net/SVkMR/35/show/light/
sumber
Nota bene
264298295255Inilah usaha saya untuk melakukannya secara berbeda. Daripada ekspansi makro yang biasanya saya gunakan, yang ini memeriksa ukuran tumpukan eksekusi untuk mengikat rekursi. Jika batas terlampaui, ia berhenti memeriksa prosedur secara rekursif dan mencoba menafsirkan perintah kura-kura (dan membuang yang
pop pop
lain). Keuntungan dari metode ini adalah tidak memerlukan memori yang sangat besar. Kerugiannya adalah kontrol rekursi agak canggung, karena ukuran tumpukan tumbuh lebih dari hanya 1 dari satu tingkat rekursi ke yang berikutnya.Sunting: +34 karakter untuk bercabang.
Edit: -3 karakter. Didesain ulang untuk menggunakan tumpukan operan untuk kontrol rekursi. Ini membuat sistem dasar lebih sederhana. Tapi kurung memerlukan tumpukan independen, jadi saya meletakkan posisi yang disimpan dalam tumpukan kamus, dan hampir membayar semua tabungan.
Juga, didesain ulang untuk menggunakan string dan integer, bukan array dan nama.
Edit: -40 karakter. Menambahkan dua prosedur untuk memanggil nama sistem dengan nomor (Sepertinya saya tidak bisa mendapatkan token biner mentah untuk bekerja. Tapi idiom ini bekerja untuk saya.)
Biner semi-komentar.
Hapus "biner".
Ini membutuhkan sistem-L untuk didefinisikan dalam kamus pada dictstack, dengan string awal dan posisi awal kura-kura pada tumpukan operan (digantungkan pada sumbernya, mis.
gs dragon.sys lsys.ps
).Kurva Naga.
Batang Percabangan.
Tidak diikat dan dikomentari.
Untuk menjalankannya, 3 blok ini dapat disimpan sebagai 3 file: dragon.ps, stems.ps, lsys.ps (salah satu dari blok program di atas akan bekerja secara identik). Kemudian jalankan dengan gs:
gs dragon.ps lsys.ps
orgs stems.ps lsys.ps
. Mereka juga dapat digabungkan terlebih dahulu, jika diinginkan:cat dragon.ps lsys.ps | gs -
ataucat stems.ps lsys.ps | gs -
.Tidak ada gambar batang. Tidak ada yang lebih menarik di kedalaman yang lebih tinggi.
sumber
Mathematica 290
Implementasi telanjang-tulang ini berfokus pada output daripada pemrosesan. Itu tidak menggunakan aturan produksi. Jadi itu mungkin bukan jawaban yang cocok untuk tantangan.
Batang percabangan diadaptasi dari demonstrasi Theo Gray .
Kode
Pemakaian
Parameter pertama menentukan apakah Kurva Naga atau Batang Cabang akan ditampilkan. Istilah kedua mengacu pada generasi.
Lebih banyak contoh
sumber
A->F[+A][-A]
manaF
bergerak,+
putar ke kiri 30,-
putar ke kanan 30, dan[
/]
push / pop