Ikhtisar
Tulis program yang mencetak pola fraktal sederhana yang diberi pola bit yang mengkodekan fraktal, ditambah faktor skala per generasi dari fraktal dan jumlah generasi.
Penjelasan
Berikut adalah representasi ASCII dari Karpet Sierpinski :
Generasi 0:
#
Generasi 1:
# # #
# #
# # #
Generasi 2:
# # # # # # # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # # # # # # #
Generasi n +1 dari ASCII Sierpinski Carpet terdiri dari kisi 3x3 yang berisi 8 salinan generasi n, dengan elemen sentral kisi tersebut hilang.
Jadi, karena didefinisikan menggunakan kisi 3x3 dan mendapatkan lebar dan tinggi 3 kali lebih besar setiap generasi, kita dapat mengatakan ia memiliki faktor skala 3.
Kita dapat mendefinisikan pola bit untuk karpet Sierpinski dengan memberi nomor elemen pada kisi 3x3 dari 0 hingga 8, dari atas ke bawah, dari kiri ke kanan, dan mengatur bit integer yang sesuai jika generasi n +1 mengandung salinan generasi n pada posisi grid itu:
bit: place value: bit pattern: bit value:
0 1 2 1 2 4 1 1 1 1 2 4
3 4 5 8 16 32 1 0 1 8 0 32
6 7 8 64 128 256 1 1 1 64 128 256
integer value = 1 + 2 + 4 + 8 + 32 + 64 + 128 + 256 = 495
Untuk faktor skala 2, pola bit akan disusun seperti ini:
0 1
2 3
dan seterusnya.
Tugas Anda adalah menulis program yang menerima pola bit dalam formulir ini, faktor skala (mis. 3 untuk Karpet Sierpinski) dan nomor generasi serta menghasilkan fraktal ASCII.
Memasukkan
Program Anda harus menerima 3 bilangan bulat dengan urutan sebagai berikut: pola bit, faktor skala (mulai dari 2 hingga 5, inklusif) dan jumlah generasi (mulai dari 0 hingga 5, inklusif).
Anda tidak perlu melakukan validasi input apa pun pada nilai-nilai ini dan tidak apa-apa jika program bekerja untuk nilai yang lebih besar dari rentang yang ditentukan.
Input dapat dikirimkan dalam bentuk apa pun (tupel, koma / daftar yang dipisahkan ruang, dll)
Keluaran
Program harus menampilkan fraktal yang terdiri dari #
karakter diikuti oleh spasi di posisi di mana fraktal didefinisikan, spasi ganda di mana tidak, dan karakter baris baru di akhir setiap baris, baik mencetaknya atau mengembalikan string dari suatu fungsi.
Contohnya
Memasukkan:
495,3,3
Keluaran (Sierpinski Carpet generasi 3):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
Memasukkan:
7,2,5
Output ( Segitiga Sierpinski ):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # #
# # # #
# # # #
# #
# # # #
# #
# #
#
Memasukkan:
325,3,3
Output ( Debu Cantor ):
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
Memasukkan
186,3,3
Output ( fraktal Vicsek ):
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
# # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
Memasukkan:
279,3,3
Output (contoh fraktal asimetris):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
dll.
Catatan:
- Ini adalah kode-golf sehingga jawaban tersingkat dalam byte menang
- Program Anda dapat berupa fungsi yang berdiri sendiri atau yang disebut dengan 3 parameter input dan mengembalikan (atau mencetak) string
- Generasi 0 didefinisikan sebagai
#
(a#
diikuti oleh spasi) bahkan untuk pola bit 0. - Baris tambahan di baris terakhir adalah opsional tetapi diizinkan, seperti halnya jumlah spasi putih di setiap baris.
"##"
menjadi"# "
. Saya melihat satu ruang trailing di ujung garis termasuk dalam contoh Anda, apakah itu diperlukan? . Per aturan terakhir saya akan menganggap itu opsional, tetapi fakta bahwa Anda memerlukan ruang tambahan untuk generasi 0 membuat saya bertanya-tanya. Juga saya pikir Anda harus menunjukkan spasi putih dan baris baru (Anda memilikinya jamak) diperbolehkan. Sebagai contoh ekstrim saya selalu bisa mulai dengan array 5 ^ 6 = 15625 baris 2 * 5 ^ 6 spasi kemudian gantikan dengan#
s. Dalam sebagian besar kasus masukan, jumlah ruang putih yang tidak terpakai sangat banyak279,3,3
?Jawaban:
APL (Dyalog Unicode) , 37 byte SBCS
Cobalah online!
sumber
Gangguan umum,
248242 byteTidak disatukan
Penjelasan
dotimes
) dan menghitung apakah setiap sel harus diambil (pendekatan seperti raycasting). Hal ini dilakukan dengan melihat secara rekursif ke dalam fraktal denganf
fungsi tambahan."# "
, atau dicetak" "
. Tentu saja kami juga mencetak baris baru di akhir setiap baris.Misalnya, segitiga Sierpinsky diwakili oleh
S=7
danR=2
. Pada generasi 3 ukuran persegi adalah 2 3 = 8. Untuk setiap sel (x, y) , terjadi hal berikut:f
disebut dengan x , y , g terikat ke 3 dan s terikat ke 4 (8/2)truncate
mengembalikan hasil bagi dan sisanya, yang terikat masing-masing ke px dan x (kami menggunakan kembali simbol yang sama x , tetapi ini bukan masalah).f
secara rekursif dengan binding baru untuk x dan y . Itu sekarang posisi relatif di dalam fraktal dalam. Kami melewati G-1 untuk generasi dan s / 2 untuk mewakili setengah panjang fraktal.Contoh
Menghitung generasi ke-8 Karpet Sierpinski menggunakan
(fractal 495 3 8)
waktu 24,7 detik dan menghasilkan file teks keluaran 83 MB. Saya menulis versi yang sedikit dimodifikasi yang menampilkan gambar. Untuk parameter yang sama, file GIF memiliki bobot 1,5 MB (waktu komputasi yang sama):Vicsek (klik untuk melihat ukuran asli):
sumber
)
berturut-turut!Pyth, 38 byte
Cobalah online: Input Reguler / Test Suite
Penjelasannya nanti.
sumber
186 3 5
(penerjemah online), tetapi terlepas dari itu saya sangat terkesan dengan betapa singkatnya ini.Ruby, 154
Skor hanya untuk fungsi. Disajikan tanpa lemak di bawah ini dalam program uji. Satu-satunya golf yang saya klaim saat ini adalah penghapusan komentar dan indentasi. Saya akan bermain golf nanti. Saat ini, saya bersenang-senang bermain dengan program ini.
Fungsi ini mengambil enam argumen, tetapi pada panggilan awal hanya 3 pertama disediakan per spec. Ini menyebabkan tiga argumen yang tersisa diatur ke nilai default, dan khususnya string
a
tempat output disimpan dibuat dan diinisialisasi ke baris spasi yang diakhiri oleh baris baru. Sebagai efek samping, variabel global$w
juga dibuat, yang menunjukkan jumlah simbol per baris.Ketika fungsi memanggil dirinya sendiri secara rekursif, ia menyediakan semua enam argumen, termasuk string
a
dan koordinat x dan y dari sudut kiri atas rekursi berikutnyaSisa program ini cukup mudah, seperti yang ditunjukkan dalam komentar.
Keluaran
Berikut adalah satu set fraktal yang longgar berdasarkan pada bentuk huruf dari kata GOLF. Huruf yang lebih realistis dapat dicapai dengan bitmap yang lebih besar. Seperti yang ditunjukkan contoh terakhir, fraktal yang paling menarik ditemukan secara tidak sengaja.
sumber
CJam, 45
Implementasi ide pertama saya. Cobalah online
Pada dasarnya, ini dimulai dengan matriks 1 * 1 yang mengandung 3 (perbedaan antara '#' dan ''), kemudian berulang kali mengalikan setiap angka dalam matriks dengan pola bit (matriks 0/1), dan menggabungkan matriks yang dihasilkan menjadi satu matriks yang lebih besar. Pada akhirnya, ia menambahkan spasi untuk setiap angka, dan bergabung dengan spasi dan baris baru.
Ide 2, 49
Cobalah online
Ini menghasilkan semua koordinat matriks keluaran sebagai array dari <generation count> pasangan angka yang lebih kecil dari faktor skala (semua kombinasi seperti itu), kemudian untuk setiap pasangan angka ia mendapatkan bit yang sesuai dari pola, dan untuk setiap array koordinat itu mengalikan bit dan mengalikan dengan 3. Pemrosesan akhir adalah sama.
Mungkin ada ruang untuk bermain golf lebih banyak.
sumber
C, 316 byte
Tidak golf:
sumber
Scala
293299ungolfed:
contoh:
potongan pertama, mungkin bisa bermain golf sedikit lebih jauh ...
sumber
#
. Selain dibutuhkan oleh spek, itu benar-benar meningkatkan penampilan output Anda.Matlab, 115 byte
Produk Kronecker
kron
membuat semuanya lebih mudah:sumber
de2bi
hanya berfungsi jika Anda memiliki Kotak Alat Sistem Komunikasi. Tidak akan berhasil tanpanya. Itu perludec2bin
.de2bi
tidak sama dengandec2bin
.)C, 158 byte
sumber
K5, 70 byte
Ini awal:
Dalam aksi:
sumber