Segitiga Sierpinsky adalah fraktal yang dibuat dengan mengambil segitiga, mengurangi tinggi dan lebar sebesar 1/2, membuat 3 salinan dari segitiga yang dihasilkan, dan menempatkan mereka sedemikian rupa sehingga setiap segitiga menyentuh dua lainnya di sudut. Proses ini diulangi berulang kali dengan segitiga yang dihasilkan untuk menghasilkan segitiga Sierpinski, seperti diilustrasikan di bawah ini.
Tulis sebuah program untuk menghasilkan segitiga Sierpinski. Anda bisa menggunakan metode apa pun yang ingin Anda hasilkan polanya, baik dengan menggambar segitiga sebenarnya, atau dengan menggunakan algoritma acak untuk menghasilkan gambar. Anda dapat menggambar dalam pixel, ascii art, atau apa pun yang Anda inginkan, selama outputnya mirip dengan gambar terakhir yang ditunjukkan di atas. Karakter yang paling sedikit menang.
Jawaban:
HTML + JavaScript, 150 karakter (lihat catatan untuk 126 karakter)
Spasi dimasukkan untuk dibaca dan tidak dihitung.
Inti dari itu adalah menerapkan aturan pewarnaan piksel yang
x & y == 0
oleh persyaratanx&y||
, yang menghasilkan "segitiga kanan Sierpinski"; danx-~y/2,k-y
merupakan transformasi koordinat untuk menghasilkan tampilan yang kira-kira sama sisi.Versi yang kurang benar (dalam HTML) adalah 126 karakter:
(Cara yang kurang tepat adalah menghilangkan
title
elemen dan tag akhircanvas
elemen, keduanya diperlukan untuk dokumen yang benar meskipun menghilangkannya tidak mengubah interpretasi dokumen.)Tiga karakter dapat diselamatkan dengan menghilangkan
k
demi konstanta64
, dengan biaya hasil yang lebih kecil; Saya tidak akan menghitung8
pilihan karena detailnya tidak mencukupi.Perhatikan bahwa ukuran 256 atau lebih tinggi memerlukan atribut pada
<canvas>
untuk meningkatkan ukuran kanvas dari default.sumber
<canvas id=c>
laluc.getContext
. Perpendek loop:for(x=k=128;x--;)for(y=k;y--;)
x&y?0:
bisa diganti denganx&y||
solusi sebaliknya.GolfScript (
4342 karakter)Keluaran:
Ubah "3" ke angka yang lebih besar untuk segitiga yang lebih besar.
sumber
Python (234)
Golf maksimal, gambar kecil:
Membutuhkan
python3-cairo
.Untuk mendapatkan gambar besar yang bagus, saya membutuhkan 239 karakter.
sumber
import cairo as c
yang dapat menyelamatkan Anda beberapa karakterMathematica - 32 karakter
Mathematica - 37 karakter
Ini akan menghasilkan tabel 2D 0 dan 1, di mana 1s menggambar Sierpinski Triangle.
sumber
ArrayPlot@CellularAutomaton[90, {{1}, 0}, 31]
atauMatrixPlot@CellularAutomaton[90, {{1}, 0}, 31]
.ReliefPlot@
...Python,
10186Menggunakan aturan 90 otomat.
Ini lebih lama, tetapi lebih cantik.
Sunting: bermain dengan string secara langsung, menyingkirkan irisan yang terlalu lama, membuat output lebih cantik.
Keluaran:
sumber
J
Tidak ideal, karena segitiga miring dan diikuti oleh banyak ruang putih - tapi tetap menarik saya pikir.
Keluaran:
Penjelasan singkat:
Kata kerjanya
(,~,.~)
adalah apa yang melakukan pekerjaan di sini. Ini adalah pengait yang pertama kali menjahit,.
argumen ke dirinya sendiri (o
->oo
) dan kemudian menambahkan argumen asli ke output:menjadi
Kata kerja ini diulang 6 kali
^:6
dengan output dari setiap iterasi menjadi input dari iterasi berikutnya. Begitumenjadi
yang pada gilirannya menjadi
dll. Saya kemudian menggunakan kata keterangan miring pada append
,/.
untuk membaca baris secara diagonal untuk meluruskan (ish) segitiga. Saya tidak perlu melakukan ini, seperti yang ditunjukkan oleh randomra . Saya bisa saja membalikkan|.
lot untuk mendapatkan hasil yang sama. Bahkan lebih baik, saya bisa saja digunakan(,,.~)^:6,'o'
untuk menyelamatkan langkah mundur sepenuhnya.Ah, kamu hidup dan belajar. :-)
sumber
|.(,~,.~)^:6,'o'
lebih pendek dan tanpa spasi tambahan. Dan(,~,.~)^:6,1
juga memberikan input yang layak hanya dalam 12 karakter!APL (51)
Penjelasan:
A←67⍴0
: A adalah vektor dari 67 nolA[34]←1
: elemen ke-34 adalah 1{...}A
: dimulai dengan A, lakukan:~⊃⍵:
: jika elemen pertama dari baris saat ini adalah nol⍵,∇
: tambahkan baris saat ini ke jawabannya, dan ulangi dengan:(1⌽⍵)≠¯1⌽⍵
: vektor di mana setiap elemen adalah XOR tetangganya pada generasi sebelumnya⋄⍬
: kalau tidak, kita sudah selesai32 67⍴
: format ini dalam matriks 67x321+
: tambahkan satu untuk memilih nilai yang tepat dari array karakter' ○'[
...]
: menghasilkan spasi (bukan bagian dari segitiga) atau lingkaran (ketika itu adalah bagian dari segitiga)Keluaran:
sumber
Haskell (291)
Saya tidak pandai golf kode haskell.
Output dari
solve 4
adalah:sumber
QBasic 151 Karakter
Sebagai contoh, berikut ini cara melakukannya dalam QBasic.
sumber
Python (42)
Saya awalnya ingin mengirim beberapa saran tentang solusi boothbys (yang sebenarnya menggunakan aturan 18 :), tetapi saya tidak memiliki reputasi yang cukup untuk berkomentar, jadi saya membuatnya menjadi jawaban lain. Karena dia mengubah pendekatannya, saya menambahkan beberapa penjelasan. Saran saya adalah:
yang akan mengarah pada kode berikut (93 karakter):
Tapi saya optimis lebih lanjut, pertama dengan menggunakan longint bukan array integer dan hanya mencetak representasi biner (75 karakter):
Dan akhirnya dengan mencetak representasi oktal, yang sudah didukung oleh printf interpolasi (42 karakter):
Semuanya akan dicetak:
Tentu saja ada juga solusi grafis (131 karakter):
: D
sumber
x=8**31;exec"print'%o'%x;x^=x/8;"*32
8086 Kode mesin - 30 byte.
CATATAN: Ini bukan kode saya dan tidak boleh diterima sebagai jawaban . Saya menemukan ini ketika sedang mengerjakan masalah CG yang berbeda untuk meniru CPU 8086 . File teks yang disertakan memuji David Stafford , tapi itu yang terbaik yang bisa saya lakukan.
Saya memposting ini karena pintar, pendek, dan saya pikir Anda ingin melihatnya.
Itu menggunakan opcode yang tumpang tindih untuk mengemas lebih banyak instruksi dalam ruang yang lebih kecil. Luar biasa pintar. Ini kode mesinnya:
Dekode langsung terlihat seperti ini:
Saat dijalankan, ketika lompatan pada 0x0115 terjadi, perhatikan lompatan kembali ke 0x010C, tepat di tengah instruksi sebelumnya:
Cemerlang! Semoga kalian tidak keberatan saya berbagi ini. Saya tahu itu bukan jawaban semata, tetapi menarik untuk tantangan.
Ini dia sedang beraksi:
sumber
C
127119116108 10865Yang ini menggunakan trik jawaban HTML
^ i & j
untuk mencetaknya dengan output yang cantik akan membutuhkan 1 karakter lagi (Anda bisa mendapatkan hasil yang benar-benar jelek dengan mengorbankannyaa^
).Untuk membuatnya berubah
(32^i&j)
menjadi(32|!(i&j))
dan mengubahnya dari++i<a
menjadi++i<=a
. Namun membuang-buang karakter pada penampilan sepertinya tidak janggal bagiku.Output jelek:
Saya sebenarnya suka bagaimana tampilannya. Tetapi jika Anda bersikeras itu cantik Anda dapat merapat empat karakter. Cukup Output:
Meninggalkan 108 char, versi automata seluler yang lebih tua.
Jadi saya tidak berpikir saya akan mendapatkannya lebih pendek dari ini jadi saya akan menjelaskan kodenya.Saya akan membiarkan penjelasan ini, karena beberapa trik bisa bermanfaat.Beberapa output
sumber
80x86 Code / MsDos - 10 Bytes
Sebagai sizecoder yang dikhususkan untuk intro yang sangat kecil pada MsDos saya berhasil membuat program yang hanya menempati 10 byte.
dalam hex:
dalam asm:
Versi pertama yang saya kodekan adalah "Colpinski" yang berukuran 16 byte, dan bahkan interaktif dengan cara Anda dapat mengubah warna dengan keyboard dan mouse. Bersama dengan "Frag" - sizecoder lain - kami membawa yang satu ke 13 byte, memungkinkan untuk program 10 byte yang hanya berisi inti rutin.
Ini menjadi sedikit lebih menarik ketika hal-hal dianimasikan, jadi saya akan menyebutkan versi lain, Zoompinski 64 - mencoba meniru perilaku tepat "Zoompinski C64" dalam 512 byte - juga untuk MsDos, dengan ukuran 64 byte seperti namanya.
Dimungkinkan untuk mengoptimalkan ini lebih jauh hingga 31 Bytes, sambil kehilangan keanggunan, warna dan simetri (sumber dan dapat dieksekusi tersedia di belakang tautan di atas)
Unduh yang asli dan komentari "Pouet"
sumber
PostScript, 120 karakter
Output Ghostscript:
Ini menggambar sosok dengan secara tiga kali lipat secara berulang apa yang sudah digambar.
Langkah pertama adalah menggambar garis. Garis disimpan sebagai jalur pengguna, lalu jalur pengguna ditambahkan dua kali lagi setelah berputar 120 derajat setiap kali.
[2 0 0 2 7 4]concat
memindahkan "titik rotasi" ke pusat "pusat segitiga" putih besar berikutnya yang akan ditutup oleh replikasi dari segitiga yang sudah kita miliki. Di sini, kita kembali ke langkah 1 (membuat upath yang tiga kali lipat oleh rotasi).Jumlah iterasi dikendalikan oleh angka pertama pada baris 3.
sumber
J (9 karakter)
Mudah paling jelek, Anda benar-benar perlu menyipitkan mata untuk melihat output;)
menghasilkan output
tentu saja Anda dapat menampilkannya secara grafis:
sumber
APL,
3732 (2823)Segitiga tegak (
3732-char)Penjelasan
1 2⍴'/\'
: Buat matriks karakter 1 × 2/\
{((-1⌷⍴⍵)⌽⍵,∊⍵)⍪⍵,⍵}
: Sebuah fungsi yang melapisi argumen kanan di kedua sisi dengan kosong untuk membuat matriks ganda selebar, lalu laminasi argumen kanan itu sendiri berlipat ganda ke bagian bawah.Misalnya
/\
akan menjadi⍣⎕
: Mengulang fungsi (input pengguna) kali.Contoh output
Skewed Triangle (
2823-char)Penjelasan
1 1⍴'○'
: Buat matriks karakter 1 × 1○
{(⍵,∊⍵)⍪⍵,⍵}
: Sebuah fungsi yang melapisi argumen kanan di sebelah kanan dengan kosong untuk membuat matriks ganda selebar, lalu laminasi argumen kanan itu sendiri berlipat ganda ke bagian bawah.Misalnya
○
akan menjadi⍣⎕
: Mengulang fungsi (input pengguna) kali.Contoh output
sumber
Python (75)
Saya terlambat dua tahun ke pesta, tetapi saya terkejut bahwa belum ada yang mengambil pendekatan ini
Menggunakan produk Kronecker untuk mengganti matriks dengan banyak salinannya sendiri.
Saya dapat menyimpan dua karakter dengan menggunakan
x=kron(x,x);x=kron(x,x)
baris tiga untuk mendapatkan gambar 16x16 piksel dengan tiga level yang terlihat atau menambahkan karakter lain ke iterator dan berakhir dengan 2 ^ 16 x 2 ^ 16 = 4,3 Gigapixel gambar dan 15 level segitiga.sumber
Logo, 75 karakter
59 karakter hanya untuk fungsi pertama, yang kedua memanggil yang pertama dengan ukuran dan kedalaman / jumlah iterasi. Jadi, Anda bisa memanggil fungsi pertama dari interpreter dengan perintah: e 99 5, atau ukuran apa pun yang Anda ingin hasilkan
sumber
to f
danend
sekitare 99 5
, Anda memiliki program runnable lengkap dalam karakter yang lebih sedikit. Juga, di UCBLogo (meskipun bukan versi lain), Anda dapat kehilangan titik dua pada variabel untuk menyimpan lebih banyak karakter.matlab 56
sumber
J (18 karakter)
Hasil
sumber
Python (90 karakter)
Cobalah online
Gambar garis fraktal mengisi Segitiga Sierpinsky
sumber
ht();speed(0);up();goto(20-window_width()/2, 20-window_height()/2);down()
setelah impor. Ini akan menjalankannya lebih cepat dan memastikan bahwa keluarannya pas di kanvas.Mathematica 67
Mathematica 92
sumber
Mathematica , 29 byte
Sierpinski tetrahedron dapat digambar dengan cara yang sama:
sumber
J ,
3735 byte-2 byte terima kasih kepada FrownyFrog
Cobalah online!
Ini adalah versi seni ascii Peter Taylor yang dikonversi menjadi J. Bisa menyimpan byte dengan versi yang kurang cantik, tetapi mengapa?
sumber
@]^:[
->@[&0
dan' /\ '
->' /\'
&0
trik didokumentasikan?,~
sekitar.Script Lua dalam Golly , 54 byte
Golly adalah simulator automata seluler dengan dukungan skrip Lua dan Python.
Script ini menetapkan aturan menjadi Wolfram Rule 60, menetapkan sel pada (0,0) menjadi 1, dan menjalankan 512 langkah.
sumber
Nota bene,
205203Menulis ulang menggunakan string dan rekursi berakhir pada jumlah yang persis sama. Tetapi keterbatasan-kedalaman dari pendekatan makro diatasi.
Sunting:
fill
lebih pendek daristroke
.Lekukan dan komentar.
Menambahkan
0 setlinewidth
memberi kesan yang lebih baik tentang seberapa dalam ini.sumber
APL (Dyalog Classic) , 12 byte
Cobalah online!
sumber
Asymptote, 152 byte
Saya akan menambahkan ini, sebagian besar karena saya telah melihat lebih atau tidak ada jawaban di asymptote di situs ini. Beberapa byte terbuang untuk format dan generalisasi yang bagus, tapi saya bisa hidup dengan itu. Mengubah A, B dan C akan mengubah di mana sudut-sudut segitiga yang mengandung berada, tetapi mungkin tidak dengan cara Anda berpikir. Tambah angka dalam ketidaksetaraan untuk menambah kedalaman.
atau ungolfed dan mudah dibaca
Jadi asymptote adalah bahasa grafis vektor yang rapi dengan sintaksis mirip C. Cukup berguna untuk diagram yang agak teknis. Output tentu saja dalam format vektor secara default (eps, pdf, svg) tetapi pada dasarnya dapat dikonversi menjadi semua yang didukung imagemagick. Keluaran:
sumber
Haskell ,
166154 byte(-12 byte terima kasih kepada Laikoni, (pemahaman zip dan daftar alih-alih zipWith dan lambda, cara yang lebih baik untuk menghasilkan baris pertama))
Cobalah online!
Penjelasan:
Fungsi ini
i#n
menggambar ASCII-Triangle dengan ketinggian2^n
setelahi
langkah-langkah iterasi.Pengkodean yang digunakan secara internal mengkodekan posisi kosong
1
dan posisi penuh sebagai0
. Oleh karena itu, baris pertama dari segitiga dikodekan sebagai[1,1,1..0..1,1,1]
dengan2^n-1
orang-orang di kedua sisi nol. Untuk membangun daftar ini, kita mulai dengan daftarx=1<$[2..2^n]
, yaitu daftar[2..2^n]
dengan semua yang dipetakan1
. Kemudian, kami membangun daftar lengkap sebagaix++0:x
Operator
k!p
(penjelasan terperinci di bawah), diberi indeks garisk
dan yang sesuaip
menghasilkan daftar garis tak terhingga yang mengikutip
. Kami memohonnya dengan1
dan garis awal yang dijelaskan di atas untuk mendapatkan seluruh segitiga, dan kemudian hanya mengambil2^n
garis pertama . Kemudian, kami cukup mencetak setiap baris, mengganti1
dengan spasi dan0
denganM
(dengan mengakses daftar"M "
di lokasi0
atau1
).Operator
k!p
didefinisikan sebagai berikut:Pertama, kami menghasilkan tiga versi
p
:1:p
yangp
dengan1
prepended,p
sendiri dantail p++[1]
yang semuanya kecuali elemen pertamap
, dengan yang1
ditambahkan. Kami kemudian zip tiga daftar ini, memberi kami secara efektif semua elemenp
dengan tetangga kiri dan kanan mereka, sebagai(l,m,r)
. Kami menggunakan pemahaman daftar untuk kemudian menghitung nilai yang sesuai di baris baru:Untuk memahami ungkapan ini, kita perlu menyadari ada dua kasus dasar untuk dipertimbangkan: Entah kita cukup memperluas baris sebelumnya, atau kita berada pada titik di mana titik kosong dalam segitiga dimulai. Dalam kasus pertama, kami memiliki tempat yang penuh jika ada tempat di lingkungan tersebut yang terisi. Ini dapat dihitung sebagai
m*l*r
; jika salah satu dari ketiganya adalah nol, maka nilai yang baru adalah nol. Kasus lainnya agak rumit. Di sini, kita pada dasarnya membutuhkan deteksi tepi. Tabel berikut memberikan delapan lingkungan yang memungkinkan dengan nilai yang dihasilkan di baris baru:Rumus sederhana untuk menghasilkan tabel ini adalah
1-m*r*(1-l)-m*l*(1-r)
yang disederhanakanm*(2*l*r-l-r)+1
. Sekarang kita harus memilih di antara dua kasus ini, di mana kita menggunakan nomor barisk
. Jikamod k (2^(n-i)) == 0
, kita harus menggunakan case kedua, jika tidak, kita menggunakan case pertama. Karena0^(mod k(2^n-i))
itu istilahnya adalah0
jika kita harus menggunakan kasus pertama dan1
jika kita harus menggunakan case kedua. Hasilnya, kita bisa menggunakantotal - jika kita menggunakan kasus pertama, kita cukup mendapatkan
m*l*r
, sementara dalam kasus kedua, istilah tambahan ditambahkan, memberikan total keseluruhanm*(2*l*r-l-r)+1
.sumber
C, 106 karakter
(Ini masih menghibur saya bahwa itu
puts("")
adalah cara terpendek untuk menghasilkan baris baru dalam C.)Perhatikan bahwa Anda dapat membuat gasket yang lebih besar (atau lebih kecil) dengan mengganti tes
32
dalamfor
loop dengan kekuatan dua (yang lebih besar) yang lebih besar, asalkan Anda juga mengganti gasket33
di tengahnyaprintf()
dengan kekuatan dua plus-plus- satu.sumber