Terkait dengan pertanyaan ini .
Sebuah ruangan didefinisikan sebagai poligon non-berpotongan (tidak harus cembung), dinyatakan sebagai daftar koordinat 2 dimensi yang terurut. Bola lampu yang cukup terang ditempatkan pada titik tertentu di dalam ruangan, dan memancarkan cahaya ke segala arah. Tugas Anda adalah menemukan area total yang diterangi ruangan. Anda dapat menerima input dalam format apa pun yang masuk akal. Titik-titik pada poligon / ruang serta koordinat sumber cahaya adalah bilangan rasional. Mereka dapat diambil searah jarum jam atau berlawanan arah jarum jam, format apa pun baik-baik saja. Kasus uji dalam masalah diberikan berlawanan arah jarum jam.
Gambar berikut menunjukkan dua ruang contoh, di mana titik keunguan mewakili sumber cahaya, dan wilayah berbayang mewakili area yang diterangi.
Kasus cobaan:
(1/2, 18)
(1,3)
(5,1/2)
(7,5)
(12,7)
(16,3)
(15,11)
(8,19)
(3,7)
Light source located at (5,8)
Answer: 815523/6710 ≈ 121.538
Berikut ini adalah penggambaran grafis dari solusi untuk kasus uji tersebut. Dua poin yang menentukan solusi yang tidak ada pada poligon asli adalah (55/61, 363/61) dan (856/55, 357/55).
Formula ini mungkin membantu dalam menghitung area.
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
[tag:code-golf]
Jawaban:
Python 3 , 388
398408409415417493byteUntuk membuatnya lebih akurat, tingkatkan
n
Pendekatan dasar Monte-Carlo. Langkah-langkah yang tercantum di bawah ini.
s
s
dengan jumlah total, lalu kalikan dengan total rentang area.Versi tidak disatukan:
Cobalah online!
Kredit untuk algoritme persimpangan garis
Juga, berikan penghargaan kepada semua komentator yang membantu tentang cara bermain golf ini lebih jauh.
sumber
from random import*
(break baris)u=uniform
untuk -2 byteg=lambda i:
n
harus memiliki kekuatan 10? Kalau tidak, Anda dapat menyimpan byte dengan menggunakan kekuatan 9.i:(min
, ruang dix[i]for
dapat dihapus juga. Jugareturn float(s/n)*(r*t)
bisareturn(r*t)*float(s/n)
. Dan aku tidak sepenuhnya yakin, tapi tidak bisa variabelr
dane
dihapus dan digunakan secara langsung, karena Anda hanya menggunakannya sekali? Entah bagaimana itu memang memberikan hasil yang sedikit berbeda walaupung
tidak dimodifikasi, sehingga bagian itu sedikit membingungkan saya (saya tidak terlalu terbiasa dengan Python untuk mengerti mengapa hasilnya sedikit berbeda).Haskell , 559
618632byteSolusi tepat (pembatasan bug). Haskell memiliki aritmatika rasional tepat bawaan. Cobalah online!
Perhatikan bahwa ini memberi
815523/6710
, bukan814643/6710
, untuk ruang contoh, dan persimpangan dinding pertama dihitung sebagai(55/61, 363/61)
. Saya cukup yakin ini benar karena entri Monte Carlo (perlahan) menyatu dengan hasil yang sama.Legenda:
Bonus: Gloss GUI untuk pengujian. Klik di sebelah poin untuk memindahkannya.
sumber
APL + MENANG
Ini adalah versi tanpa tantangan dari tantangan menarik ini yang saya tawarkan untuk menunjukkan logika saya. APL + WIN versi kuno saya tidak cocok untuk struktur kontrol bersarang golf. Semakin banyak APL modern yang dapat melakukan tantangan dengan lebih baik?
Jika pembaca memvalidasi logika saya akan mencoba golf solusi ini. Jika logikanya salah saya hanya akan menghapus.
sumber
R ,
296.225byteCobalah online!
Ini adalah versi pengurangan lebih lanjut dari jawaban Python . Metode inti Monte Carlo adalah sama, tetapi saya mengatur ulang beberapa fungsi untuk membuatnya lebih pendek. Dalam iterasi pertama saya, saya sudah terlalu agresif dalam penataan ulang, dan saya kemudian menyadari bahwa saya bisa mengoptimalkan panjang dan kecepatan dengan kembali ke versi algoritma persimpangan yang lebih dekat dengan python.
Berikut adalah versi yang tidak dikoleksi yang juga memplot hasilnya:
sumber