Siapa yang tidak suka fraktal yang baik? The Sierpinski Karpet adalah contoh klasik dari fraktal.
Untuk menyelesaikan tugas ini, Anda akan diminta untuk membuat karpet jenis dan mencetak gambar yang dihasilkan ke stdout
(lihat contoh di bawah ini untuk memformat) , mewakili karpet tingkat. Langkah-langkahnya dapat ditemukan di artikel Wikipedia ini.
Nilai ini akan diambil dari stdin
atau setara.
Misalnya, input 4 akan menghasilkan karpet level 4:
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
Input 3 akan menghasilkan karpet level 3:
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
Input 2 akan menghasilkan karpet level 2:
■ ■ ■
■ ■
■ ■ ■
Dan input 1 akan menghasilkan karpet level 1 (hanya persegi):
■
Perhatikan spasi di antara kolom.
Idenya adalah untuk menggunakan karakter ■ untuk blok dan ruang untuk celah
Baris dimulai dengan karakter ■.
Seperti biasa, solusi terkecil menang dengan jumlah karakter (karena karakter non-standar).
Atau, # dapat digunakan sebagai ganti karakter ■ dalam bahasa yang tidak mendukung Unicode.
Jawaban:
CJam,
3837313028 karakterOh well, kami menghitung berdasarkan karakter, jadi mari kita lakukan beberapa Unicode membongkar:
Uji di sini. Masukkan saja level yang diinginkan ke dalam kolom input.
Penjelasan
Setelah konversi basis, ini
yang sama dengan yang berikut, hanya dengan karakter Unicode ditulis sebagai
9632c
:Kode ini didasarkan pada pengamatan berikut: jika kita melihat koordinat (x, y) dari masing-masing sel, maka kita mendapatkan sel kosong, setiap kali kedua x dan y memiliki
1
pada posisi yang sama dalam representasi basis-3 mereka. Jika Anda memikirkannya, pola pengulangan skala kecil adalah digit basis-3 yang signifikan, maka digit berikutnya yang lebih signifikan mengatur pengulangan skala besar berikutnya dan seterusnya.Isi dari array yang dihasilkan dicetak secara otomatis.
Terima kasih kepada Dennis karena telah memangkas tiga byte.
sumber
#0<'■S
->#~S'■
menyimpan 1 karakter.[1_]a#~
dengan3Yba&
.&
menghasilkan nilai kebenaran / kepalsuan (atau bahkan itu ada). Mungkin layak posting di tips CJam untuk cara kanonik untuk menguji apakah array mengandung beberapa elemen.Matlab
(113) (110) (99)(85)Anda dapat mencobanya di sini (Anda harus mengganti
input('')
dengan input yang Anda inginkan.)Sekarang 99 berkat feersum! Dan sekarang turun ke 85 berkat RTL!
Golf:
Tidak Disatukan:
Penjelasan:
Saya menyalahgunakan produk Kroner untuk tugas ini. (Ini adalah produk khusus yang ditentukan untuk dua matriks ukuran masing-masing sewenang-wenang. Contoh:
Kemudian
Jadi inilah contoh untuk n = 5 (Dalam metode penghitungan yang lama, itu adalah 4);
sumber
d=zeros(size([c,c]))
Anda harus menggunakand=[c c]*0
.d
dapat dihindari dengan menyalahgunakankron
sekali lagi:disp(char(kron(c,[1,0])*3+32));
,Haskell,
114108sumber
Python - 100
sumber
Perl 5: 68 karakter
n di stdin.
Representasi ternary berkode desimal dari daftar koordinat pertama kali dihasilkan di
@,
(nama dipilih sehingga tidak perlu ruang antara@,
danfor
) menggunakan digit 0, 1, dan 3. Sekarang menambahkan koordinat x dan y dalam domain desimal akan memiliki 2 dalam hasil jika dan hanya jika ada dua yang ada di posisi yang cocok.//
digunakan untuk menyebarkan variabel default$_
dari loop luar (for
) ke variabel postmatch$'
ketika itu dibayangi olehmap
variabel default di loop dalam.sumber
Java,
330283 KarakterParam adalah ukuran yang Anda inginkan. Kecuali ada optimasi untuk algoritme, saya mencoba menekan semuanya.
Terima kasih kepada @StretchManiac menghapus
i
metode dan membersihkan deklarasi sedikit diperas .Kode yang Dapat Dibaca
sumber
String[]a
, dan jika Anda hanya menggunakani
sekali, maka Anda akan lebih baik menyingkirkan metode ini.""+s
dalamp
metode Anda ? Itu tiga karakter tambahan tanpa tujuan. Bahkan jika jeniss
selain apa punString
, itu masih sama sekali tidak perlu.static void p(int s){System.out.print((char)s);}
dan di make utama ituint s=35;
,s=32;
danp(10);
(bukanp("\n");
) dan menyimpan beberapa karakter lebih.Integer.valueOf
kenew Byte
Raket
230229225220Bukan jam terbaik Racket untuk bermain golf.
Golf:
Tidak Disatukan:
sumber
C:
123 118 111104 karakterBerdasarkan ide yang sama dengan solusi perl saya. Setelah menambahkan beberapa spasi:
Menggunakan sistem ternary yang mengkodekan setiap digit dengan 2 bit. Nilai ilegal (memiliki dua yang dalam posisi ganjil) difilter dengan
x & (x>>1) & 0b01010101
. Kedua koordinat disimpan dalam satu nilai, jadi memeriksa warna piksel turun kex & (x >> 2 * n) & 0b01010101
.n
disimpan sebagai kekuatan 2 untuk kenyamanan.Edit
Diganti
define
dengan konstanta sederhanam
.Edit 2
0x5555555
mask dapat diwakili dengan(1LL<<32)/3
, tetapi kita hanya membutuhkann
bit-bit itu sehinggan/3
cukup.Edit 3
Tweak kecil. Satu 2 char gain mengandalkan scanf dieksekusi sebelum nilai pemuatan
n
untuk eksekusi--n
. Eol hanya bisa mengikuti#
, ya.sumber
HTML / JavaScript, 205 Karakter
Obfuscatweet , 205 Chars
HTML / JS, 298 Karakter
Karena cara HTML bermain dengan spasi, beberapa karakter harus didedikasikan untuk nbsp char. Selain itu, font default sebagian besar browser bukanlah Courier, jadi saya harus mengaturnya juga. Tentang gaya penataan 20 karakter. Jika ini membutuhkan metode input langsung, saya bisa menambahkannya, tetapi mengubah input saat ini adalah pengaturan n ke nilai yang berbeda.
Demo
HTML / JS yang bisa dibaca
sumber
CJam,
38353231 karakterCobalah online.
Contoh dijalankan
Bagaimana itu bekerja
mengkonversi string Unicode dari basis 60.000 (
6e4b
) ke basis 128 (128b
), dilemparkan ke Karakter (:c
) dan mengevaluasi string yang dihasilkan (~
).Akibatnya, kode berikut ini dijalankan:
sumber
Python 3 -
116113 karakterEDIT: Yah, gunakan trik yang saya tidak suka terlalu banyak dan kompres kode oleh 3 byte. Entah itu cara terbaik yang mungkin, tetapi saya akan pergi dengan itu.
Mungkin berisi beberapa karakter yang tidak patut dicetak, jadi inilah versi string yang dapat dicetak.
Tidak terlalu hebat, tapi setidaknya mengalahkan beberapa bahasa.
Apa yang diperluas ke:
Agak tidak terserang jika seseorang tidak dapat melihat cara kerjanya:
sumber
Mathematica, 71 byte
memasukkan
keluaran
sumber
CJam, 76 karakter
Ini adalah terjemahan langsung dari rumus yang diberikan di sini
Coba di sini
sumber
Bash + coreutils, 105 karakter unicode
Karena kami menghitung karakter dan bukan byte:
Dalam bentuk yang diterjemahkan:
Pure Bash, 143 byte
Input diambil dari baris perintah args:
Keluaran:
sumber
C #
Program lengkap - 237:
LINQPad - 166 +
Math.Ceiling(Math.Log(a + 1) / Math.Log(10))
sumber
using System;class P{static void Main(string[]a){string g,h;for(int b=(int)Math.Pow(3,int.Parse(a[0])-1),c=-1,d,e,f;++c<b;Console.WriteLine(g))for(g="",d=0;d<b;g+=h)for(h="■",e=c,f=d++;e>0|f>0;e/=3,f/=3)h=e%3==1&f%3==1?" ":h;}}
( 229 byte / 227 karakter ) (■
= 3 byte, sehingga Anda dapat menggantinya dengan#
untuk menyimpan 2 byte juga). Saya terutama meletakkan segala sesuatu di dalam for-loop sehingga tidak perlu lagi tanda kurung.C - 154
Masukan dari stdin. Saya mencoba menemukan cara yang baik untuk menghindari fungsi tambahan, tetapi tidak dapat menemukan apa pun.
Hitungan karakter hanya mencakup ruang yang diperlukan.
sumber
PHP, 194 karakter
The
n
diterima sebagai argumen pertama di baris perintah.Dapat dibaca
sumber
■
sebagai gantinya#
, Anda dapat menyimpan 2 karakter dengan menghapus tanda kutip.Scala 230 karakter
Kode golf:
Kode tidak dikunci:
Hanya ruang yang diperlukan yang disertakan.
sumber
V , 21 byte (tidak bersaing)
Cobalah online!
Hexdump:
V lebih baru daripada tantangan, sehingga harus ditandai sebagai tidak bersaing. Tapi tetap, itu bagus untuk melihat jawaban ini menjadi waaaaay lebih pendek dari semua yang lain, bahkan ketika menghitung dalam byte daripada karakter.
sumber
OK, 40 byte
Cobalah online.
Dimulai dengan
1
, dan kemudian menariknya dalam kotak(1 1 1;1 0 1;1 1 1)
, yang kemudian menarik dalam kotak dengan cara yang sama, dll. Mengulangi jumlah yang diperlukan kali.sumber
Python 2 , 91 byte
Cobalah online!
sumber
C # (.NET Core) , 162 byte
Cobalah online!
Merosot
sumber
SOGL V0.12 , 27 byte
Coba Di Sini!
sumber
R , 92 karakter
94 byte dengan karakter khusus.
Cobalah online!
sumber
Kanvas ,
171617 karakterCoba di sini!
-1: Digunakan
[
alih-alih{
menghapus yang pertama;
di dalam loop.+1: Memperbaiki perilaku errenous:
■
sekarang terkait dengan level 1, sebagaimana ditentukan dalam pos asli.sumber
■
bersifat multibyte. Mengatakan demikian ke bagian bawah di pos asli.Pip
-S
, 30 karakterCobalah online!
Ide dasarnya: pertimbangkan kisi koordinat di pangkalan 3. Lubang-lubang di karpet terjadi di mana 1) trit di koordinat x adalah
1
, dan 2) trit di posisi yang sama di koordinat y juga1
.Solusi serupa, jumlah karakter yang sama tetapi -2 byte:
{2N({aTB3R2i}MSg)?s'■}MC3**a/3
sumber
K (ngn / k) , 50 byte
terima kasih @Dosc untuk mengingatkan saya, saya harus menampilkan spasi antara kolom
Cobalah online!
sumber