Dengan tiga lingkaran singgung yang saling berhubungan, kita selalu dapat menemukan dua lingkaran lagi yang bersinggungan dengan ketiganya. Keduanya disebut lingkaran Apollonia . Perhatikan bahwa salah satu lingkaran Apolonia mungkin sebenarnya berada di sekitar tiga lingkaran awal.
Mulai dari tiga lingkaran singgung, kita dapat membuat fraktal yang disebut paking Apollonia , dengan proses berikut:
- Panggil 3 lingkaran awal lingkaran induk
- Temukan dua lingkaran Apollonia lingkaran induk
- Untuk setiap lingkaran Apolonia:
- Untuk setiap pasangan dari tiga pasang lingkaran induk:
- Panggil lingkaran Apollonia dan dua lingkaran induk kumpulan baru lingkaran orangtua dan mulai lagi dari langkah 2.
- Untuk setiap pasangan dari tiga pasang lingkaran induk:
Misalnya dimulai dengan lingkaran dengan ukuran yang sama, kita mendapatkan:
Gambar ditemukan di Wikipedia
Ada satu lagi notasi yang kami butuhkan. Jika kita memiliki lingkaran jari-jari r dengan pusat (x, y) , kita dapat mendefinisikan kelengkungannya sebagai k = ± 1 / r . Biasanya k akan positif, tetapi kita dapat menggunakan k negatif untuk menunjukkan lingkaran yang membungkus semua lingkaran lain di dalam paking (yaitu semua garis singgung menyentuh lingkaran itu dari dalam). Kemudian kita dapat menentukan lingkaran dengan triplet angka: (k, x * k, y * k) .
Untuk keperluan pertanyaan ini, kita akan mengasumsikan bilangan bulat positif k dan rasional x dan y .
Contoh lebih lanjut untuk lingkaran tersebut dapat ditemukan di artikel Wikipedia .
Ada juga beberapa hal menarik tentang gasket integral dalam artikel ini (di antara hal-hal menyenangkan lainnya dengan lingkaran).
Tantangan
Anda akan diberikan spesifikasi 4 lingkaran, yang masing-masing akan terlihat seperti (14, 28/35, -112/105)
. Anda dapat menggunakan format daftar dan operator divisi apa saja yang nyaman, sehingga Anda dapat dengan mudah eval
memasukkannya jika mau. Anda mungkin berasumsi bahwa 4 lingkaran memang bersinggungan satu sama lain, dan yang pertama memiliki kelengkungan negatif. Itu berarti Anda sudah diberikan lingkaran Apollonia di sekitar tiga lainnya. Untuk daftar input contoh yang valid, lihat bagian bawah tantangan.
Tulis program atau fungsi yang, jika diberi input ini, menggambar gasket Apollonia.
Anda dapat mengambil input melalui argumen fungsi, ARGV atau STDIN dan membuat fraktal di layar atau menulisnya ke file gambar dalam format pilihan Anda.
Jika gambar yang dihasilkan dirasterisasi, itu harus setidaknya 400 piksel di setiap sisi, dengan kurang dari 20% di sekitar lingkaran terbesar. Anda dapat berhenti berulang ketika Anda mencapai lingkaran yang radiusnya kurang dari 400 dari lingkaran input terbesar, atau lingkaran yang lebih kecil dari piksel, mana yang terjadi terlebih dahulu.
Anda harus menggambar hanya garis lingkaran, bukan cakram penuh, tetapi warna latar dan garis adalah pilihan Anda. Garis luar tidak boleh lebih lebar dari 200 dari diameter lingkaran luar.
Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.
Contoh Input
Berikut ini adalah semua gasket integral dari artikel Wikipedia yang dikonversi ke format input yang ditentukan:
[[-1, 0, 0], [2, 1, 0], [2, -1, 0], [3, 0, 2]]
[[-2, 0, 0], [3, 1/2, 0], [6, -2, 0], [7, -3/2, 2]]
[[-3, 0, 0], [4, 1/3, 0], [12, -3, 0], [13, -8/3, 2]]
[[-3, 0, 0], [5, 2/3, 0], [8, -4/3, -1], [8, -4/3, 1]]
[[-4, 0, 0], [5, 1/4, 0], [20, -4, 0], [21, -15/4, 2]]
[[-4, 0, 0], [8, 1, 0], [9, -3/4, -1], [9, -3/4, 1]]
[[-5, 0, 0], [6, 1/5, 0], [30, -5, 0], [31, -24/5, 2]]
[[-5, 0, 0], [7, 2/5, 0], [18, -12/5, -1], [18, -12/5, 1]]
[[-6, 0, 0], [7, 1/6, 0], [42, -6, 0], [43, -35/6, 2]]
[[-6, 0, 0], [10, 2/3, 0], [15, -3/2, 0], [19, -5/6, 2]]
[[-6, 0, 0], [11, 5/6, 0], [14, -16/15, -4/5], [15, -9/10, 6/5]]
[[-7, 0, 0], [8, 1/7, 0], [56, -7, 0], [57, -48/7, 2]]
[[-7, 0, 0], [9, 2/7, 0], [32, -24/7, -1], [32, -24/7, 1]]
[[-7, 0, 0], [12, 5/7, 0], [17, -48/35, -2/5], [20, -33/35, 8/5]]
[[-8, 0, 0], [9, 1/8, 0], [72, -8, 0], [73, -63/8, 2]]
[[-8, 0, 0], [12, 1/2, 0], [25, -15/8, -1], [25, -15/8, 1]]
[[-8, 0, 0], [13, 5/8, 0], [21, -63/40, -2/5], [24, -6/5, 8/5]]
[[-9, 0, 0], [10, 1/9, 0], [90, -9, 0], [91, -80/9, 2]]
[[-9, 0, 0], [11, 2/9, 0], [50, -40/9, -1], [50, -40/9, 1]]
[[-9, 0, 0], [14, 5/9, 0], [26, -77/45, -4/5], [27, -8/5, 6/5]]
[[-9, 0, 0], [18, 1, 0], [19, -8/9, -2/3], [22, -5/9, 4/3]]
[[-10, 0, 0], [11, 1/10, 0], [110, -10, 0], [111, -99/10, 2]]
[[-10, 0, 0], [14, 2/5, 0], [35, -5/2, 0], [39, -21/10, 2]]
[[-10, 0, 0], [18, 4/5, 0], [23, -6/5, -1/2], [27, -4/5, 3/2]]
[[-11, 0, 0], [12, 1/11, 0], [132, -11, 0], [133, -120/11, 2]]
[[-11, 0, 0], [13, 2/11, 0], [72, -60/11, -1], [72, -60/11, 1]]
[[-11, 0, 0], [16, 5/11, 0], [36, -117/55, -4/5], [37, -112/55, 6/5]]
[[-11, 0, 0], [21, 10/11, 0], [24, -56/55, -3/5], [28, -36/55, 7/5]]
[[-12, 0, 0], [13, 1/12, 0], [156, -12, 0], [157, -143/12, 2]]
[[-12, 0, 0], [16, 1/3, 0], [49, -35/12, -1], [49, -35/12, 1]]
[[-12, 0, 0], [17, 5/12, 0], [41, -143/60, -2/5], [44, -32/15, 8/5]]
[[-12, 0, 0], [21, 3/4, 0], [28, -4/3, 0], [37, -7/12, 2]]
[[-12, 0, 0], [21, 3/4, 0], [29, -5/4, -2/3], [32, -1, 4/3]]
[[-12, 0, 0], [25, 13/12, 0], [25, -119/156, -10/13], [28, -20/39, 16/13]]
[[-13, 0, 0], [14, 1/13, 0], [182, -13, 0], [183, -168/13, 2]]
[[-13, 0, 0], [15, 2/13, 0], [98, -84/13, -1], [98, -84/13, 1]]
[[-13, 0, 0], [18, 5/13, 0], [47, -168/65, -2/5], [50, -153/65, 8/5]]
[[-13, 0, 0], [23, 10/13, 0], [30, -84/65, -1/5], [38, -44/65, 9/5]]
[[-14, 0, 0], [15, 1/14, 0], [210, -14, 0], [211, -195/14, 2]]
[[-14, 0, 0], [18, 2/7, 0], [63, -7/2, 0], [67, -45/14, 2]]
[[-14, 0, 0], [19, 5/14, 0], [54, -96/35, -4/5], [55, -187/70, 6/5]]
[[-14, 0, 0], [22, 4/7, 0], [39, -12/7, -1/2], [43, -10/7, 3/2]]
[[-14, 0, 0], [27, 13/14, 0], [31, -171/182, -10/13], [34, -66/91, 16/13]]
[[-15, 0, 0], [16, 1/15, 0], [240, -15, 0], [241, -224/15, 2]]
[[-15, 0, 0], [17, 2/15, 0], [128, -112/15, -1], [128, -112/15, 1]]
[[-15, 0, 0], [24, 3/5, 0], [40, -5/3, 0], [49, -16/15, 2]]
[[-15, 0, 0], [24, 3/5, 0], [41, -8/5, -2/3], [44, -7/5, 4/3]]
[[-15, 0, 0], [28, 13/15, 0], [33, -72/65, -6/13], [40, -25/39, 20/13]]
[[-15, 0, 0], [32, 17/15, 0], [32, -161/255, -16/17], [33, -48/85, 18/17]]
sumber
Jawaban:
GolfScript (vektor 289 byte / raster 237 byte)
Pada 289 byte dan mengeksekusi dalam waktu yang wajar:
Ini membutuhkan input pada stdin dan menghasilkan file SVG ke stdout. Sayangnya butuh sedikit terlalu lama untuk demo online, tetapi versi tweak yang dibatalkan lebih awal dapat memberi Anda ide.
Mengingat masukan
[[-2, 0, 0], [3, 1/2, 0], [6, -2, 0], [7, -3/2, 2]]
yang keluaran (dikonversi ke PNG dengan Inkscape) adalahPada 237 byte dan memakan waktu terlalu lama (saya memperkirakan bahwa itu akan memakan waktu lebih dari satu minggu untuk menghasilkan output yang sama dengan di atas, meskipun dalam satu-bit hitam dan putih):
Output adalah format NetPBM tanpa baris baru, jadi mungkin tidak secara ketat mengikuti spesifikasi, meskipun GIMP akan tetap memuatnya. Jika kepatuhan yang ketat diperlukan, masukkan
n
setelah yang terakhir!
.Rasterisasi adalah dengan menguji setiap piksel terhadap setiap lingkaran, sehingga waktu yang diambil cukup linier dalam jumlah piksel kali jumlah lingkaran. Dengan menurunkan segalanya dengan faktor 10,
akan berjalan dalam 10 menit dan menghasilkan
(dikonversi ke PNG dengan GIMP). Diberikan 36 jam menghasilkan 401x401
sumber
JavaScript (
418410 byte)Diimplementasikan sebagai fungsi:
Demo online (catatan: tidak berfungsi di browser yang gagal memenuhi persyaratan spesifikasi SVG sehubungan dengan ukuran tersirat, jadi saya menawarkan versi yang sedikit lebih panjang yang yang mengatasi bug itu; peramban juga dapat membuat SVG kurang akurat daripada misalnya Inkscape, meskipun Inkscape sedikit lebih ketat dalam mengutip atribut).
Perhatikan bahwa 8 byte dapat disimpan dengan menggunakan
document.write
, tapi itu benar-benar merusak jsFiddle.sumber
S/c[0]
dalam suatu variabel dan kemudian juga menyingkirkannyaMath.abs
dengan operator ternary dll.Math.abs
sebenarnya akan membutuhkan karakter.Mathematica 289 karakter
Dengan memecahkan sistem bilinear sesuai http://arxiv.org/pdf/math/0101066v1.pdf Teorema 2.2 (sangat tidak efisien).
Spasi tidak diperlukan, masih bisa bermain golf:
Animasi ukuran dikurangi dengan input
{{-13, 0, 0}, {23, 10/13, 0}, {30, -84/65, -1/5}, {38, -44/65, 9/5}}
sumber
@{{-1, 0, 0}, {2, 1, 0}, {2, -1, 0}, {3, 0, 2}}
baris terakhir50/h
bukan400/h
. Anda akan mendapatkan hasilnya lebih cepat. juga, Anda dapat memantau kemajuan dengan memasukkanDynamic@Length@a
sebelum menjalankan fungsiInstructions for testing this answer (with a reduced number of circles) 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! - Catatan: Calcs lambat, tunggu sampai grafik muncul.Maple (960 byte)
Saya menggunakan Descartes Theorem untuk menghasilkan Gasket Apollonian dan kemudian menggunakan sistem plot Maple untuk merencanakannya. Jika saya punya waktu saya ingin golf lebih lanjut dan mengubahnya menjadi Python (Maple jelas bukan yang terbaik untuk fraktal). Berikut ini tautan ke pemain Maple gratis jika Anda ingin menjalankan kode saya.
Beberapa contoh gasket
sumber