The Chaos Game adalah metode sederhana untuk menghasilkan fraktal. Diberi titik awal, rasio panjang r dan satu set titik 2D, berulang kali lakukan hal berikut:
- Dari kumpulan poin Anda, pilih satu secara acak (seragam).
- Rata-rata titik itu dan titik yang ditarik terakhir (atau titik awal) menggunakan r dan 1 - r sebagai bobot (yaitu r = 0 berarti Anda mendapatkan titik awal, r = 1 berarti Anda mendapatkan titik acak dan r = 0,5 berarti Anda dapatkan titik di tengah-tengahnya.)
- Gambarkan titik yang dihasilkan.
Misalnya, jika Anda memilih simpul segitiga sama sisi dan r = 0,5 , titik yang diplot akan memetakan segitiga Sierpinski:
Anda harus menulis sebuah program atau fungsi yang "memainkan" permainan kekacauan untuk membuat fraktal.
Memasukkan
Anda dapat menulis suatu program atau fungsi, dan mengambil input berikut melalui ARGV, STDIN atau argumen fungsi:
- Jumlah poin untuk plot.
- Koordinat awal (yang harus diplot juga!).
- Berat rata-rata r dalam interval [0,1] .
- Daftar poin untuk dipilih.
Keluaran
Anda dapat menampilkan di layar atau menulis file gambar. Jika hasilnya dirasterisasi, harus setidaknya 600 piksel di setiap sisi, semua titik harus ada di kanvas, dan setidaknya 75% dari batas horizontal dan vertikal gambar harus digunakan untuk titik (ini untuk menghindari menjawab dengan satu piksel hitam yang mengatakan "sangat jauh diperbesar"). The x dan y axis harus pada skala yang sama (yang adalah garis dari (0,0) ke (1,1) harus berada pada sudut 45 derajat) dan setiap titik diplot pada game kekacauan harus diwakili sebagai tunggal pixel (jika metode plotting Anda anti-alias maksudnya, itu mungkin tersebar lebih dari 2x2 piksel).
Warna adalah pilihan Anda, tetapi Anda membutuhkan setidaknya dua warna yang dapat dibedakan: satu untuk latar belakang dan satu untuk titik-titik yang diplot selama permainan kekacauan. Anda mungkin tetapi tidak harus memplot poin input.
Harap sertakan tiga contoh output menarik dalam jawaban Anda.
Mencetak gol
Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.
Sunting: Anda tidak perlu lagi memplot poin input, karena mereka sebenarnya tidak terlihat sebagai piksel tunggal.
sumber
Jawaban:
Mathematica, 89
Bagaimana itu bekerja
Dalam Mathematica,
Graphics[]
fungsi ini menghasilkan grafik yang dapat diskalakan, Anda merendernya ke ukuran apa pun yang Anda inginkan hanya dengan menyeret sudut gambar. Bahkan, ukuran awal dari semua grafik yang ditampilkan adalah pengaturan ".ini" yang dapat Anda atur pada 600 atau pada nilai lain yang Anda inginkan. Jadi tidak perlu melakukan sesuatu yang khusus untuk persyaratan 600x600.The
AbsolutePointSize[]
hal menentukan bahwa ukuran titik tidak akan diubah dengan memperbesar ukuran gambar.Konstruk intinya adalah
atau dalam pseudo-code non-golf:
Secara rekursif membangun daftar mulai dari
(start point)
dan menerapkan fungsi (vectorial) dalam argumen pertama ke setiap titik berturut-turut, akhirnya mengembalikan daftar semua poin yang dihitung untuk diplot olehPoint[]
Beberapa contoh replikasi diri:
sumber
Instructions for testing this answer without Mathematica installed:
1) Unduh ini dari pastebin dan simpan sebagai * .CDF 2) Unduh dan instal lingkungan CDF gratis dari Wolfram Research at (bukan file kecil). Nikmati. Katakan padaku jika itu berhasil!#r
untukr#
pergi tanpa spasi atau*
di antara.#
danr
.#key
. Saya yakin itu akan berguna. :)Jawa: 246
253447Sebagai fungsi
m()
:Jeda baris (dalam program untuk menunjukkan penggunaan):
Menggambar titik input dihapus dari persyaratan (yay 80 byte!). Mereka masih ditampilkan di tangkapan layar lama di bawah, tetapi tidak akan muncul jika Anda menjalankannya. Lihat riwayat revisi jika tertarik.
Input diberikan sebagai array float. Yang pertama adalah iterasi, dua berikutnya dimulai
x y
. Keempatr
, dan terakhir adalah daftar koordinat, dalamx1 y1 x2 y2 ...
mode.Ninja Star
Menyeberang
Gurita
sumber
show
sudah usangshow()
sudah usang, tetapi masih berfungsi. Ketika Anda mengatakan "tidak berhasil", apa artinya itu? Jika Anda tidak memiliki Java 8, Anda harus menambahkanfinal
untukString[]a
di utama setidaknya.JavaScript (E6) + Html 173
176 193Sunting: potongan besar, terima kasih kepada William Barbosa
Sunting: 3 byte lebih sedikit, terima kasih kepada DocMax
173 byte menghitung fungsi dan elemen kanvas yang diperlukan untuk menampilkan output.
Tes simpan sebagai file html dan buka di FireFox.
JSFiddle
sumber
<canvas id=C><script>F=(n,x,y,r,p)=>{t=C.getContext("2d"),C.width=C.height=600;for(;n--;)t.fillRect(x,y,1,1),i=Math.random()*p.length&~1,x-=(x-p[i])*r,y-=(y-p[i+1])*r}</script>
panjangnya 176 byte, saya tidak mengerti hitungan Andafor
panggilan:for(C.width=C.height=600;n--;y-=(y-p[i+1])*r)
Python -
200189Mengambil input sebagai argumen fungsi ke a, menulis hasilnya ke stdout sebagai file pgm.
n
adalah iterasi,s
adalah titik awal,r
r, danz
daftar poin input.Sunting: Tidak lagi menggambar titik input berwarna abu-abu.
Output menarik:
sumber
p=[255]*360000
dapat pergi sebagai parameter opsional ke fungsi; tubuh for for semua bisa berjalan pada baris yang sama jika tidak memiliki aliran kontrol; Anda dapat mencukur orangtua[1]*(n+1)
sebagai[1]*-~n
; karena Anda tidak menggunakani
di luar untuk loop, lebih pendek untuk menjalankan koden
kali sebagaiexec"code;"*n
); Saya pikir parens difor i in(0,1)
dapat dihapus.SuperCollider - 106
SuperCollider adalah bahasa untuk menghasilkan musik, tetapi dapat melakukan grafik dengan cepat.
Saya telah menggunakan beberapa cara pintas sintaksis yang tidak jelas untuk menghemat beberapa byte - versi yang lebih mudah dibaca dan lebih hemat memori adalah
pada 109 karakter.
Seperti contoh Mathematica, Anda harus mengubah ukuran jendela secara manual untuk mendapatkan 600x600 piksel. Anda harus menunggu sampai menggambar ulang ketika Anda melakukan ini.
Ini menghasilkan segitiga Sierpinsky dasar (tidak ditampilkan karena Anda pernah melihatnya sebelumnya)
Ini membuat semacam jenis pentagon Sierpinsky:
Hal yang sama dengan 6 poin membuat kepingan salju Koch terbalik di tengah:
Akhirnya, inilah riff pada piramida 3D dari jawaban ace. (Perhatikan bahwa saya telah menggunakan salah satu poin dua kali, untuk mendapatkan efek bayangan.)
sumber
Python,
189183175Sunting: memperbaiki rasio r terbalik , dan beralih ke gambar B&W untuk menghemat beberapa byte.
Membawa jumlah poin sebagai
n
, poin pertama sebagaip
, rasio sebagair
dan daftar poin sebagail
. Membutuhkan modul Bantal.Contoh:
Saya menghasilkan titik dalam lingkaran di sekitar pusat gambar
Pengulangan XOXO, hanya mengubah rasio dari 0,4 menjadi 0,6
Semacam serpihan salju
sumber
n,p,r,l=input()
. Anda juga dapat menghapus tanda kurung dari*=
operasi dan gunakanimport random as R
.*=
:(input
Masalahnya akan menjadi sangat tidak menyenangkan untuk bekerja dengan, dan impor saat ini adalah bentuk yang paling ringkas mungkin (atau apakah saya melewatkan sesuatu?).import random as R,PIL.Image as I
dan kemudianrandom.choice
bisaR.choice
. Ya, menggunakan input lemah, tetapi Anda dapat menggunakan versi fungsi untuk menguji dan mempostinginput()
satu untuk skor yang lebih baik !! 1! : Py=x*(1-r)+w
==y=x-x*r-w
.JavaScript
(407)(190)Saya senang mendapatkan umpan balik tentang skrip saya dan golf karena saya tidak nyaman dengan JS =) (Jangan ragu untuk menggunakan ini / ubah untuk kiriman Anda sendiri!)
Input Input (Agar dapat dibandingkan dengan entri edc65 , saya tidak menghitung input.):
Pengaturan & Perhitungan Kanvas
Agak lebih ungolfed (termasuk input contoh di mana input nyata dijanjikan hanya dikomentari, jadi siap digunakan):
Contohnya
sumber
Memproses, 153
Ported @Geobits 'Java menjawab untuk Memproses dan melakukan lebih banyak bermain golf, menghasilkan pengurangan 100 karakter. Saya awalnya bermaksud untuk menghidupkan proses, tetapi batasan input terlalu keras pada ini (Pemrosesan tidak memiliki stdin atau argv, yang berarti bahwa saya harus menulis fungsi saya sendiri daripada menggunakan
draw()
loop asli Pemrosesan ).Program lengkap dengan jeda baris:
Program di atas memberikan Crosses:
Ini memberi Piramida:
Ini memberikan segitiga Sierpinski:
sumber
"Implementasi referensi" yang tidak disatukan, Python
Pembaruan : jauh, jauh lebih cepat (atas perintah besarnya)
Lihatlah shell interaktif!
Edit file dan set
interactive
keTrue
, lalu lakukan salah satu dari ini:polygon numberOfPoints numeratorOfWeight denominatorOfWeight startX startY numberOfSides
menghasilkan, menyimpan, dan menampilkan poligon.points numberOfPoints numeratorOfWeight denominatorOfWeight startX startY point1X point1Y point2X point2Y ...
melakukan apa yang diminta oleh spec.sumber
Python (202 karakter)
Mengambil jumlah poin sebagai
n
, berat rata-rata sebagair
, titik awal sebagaituple
s
dan daftar poin sebagai daftar XYtuple
disebutl
.sumber