Masalah:
Dengan serangkaian titik yang tidak kosong di pesawat Cartesian, temukan lingkaran terkecil yang melingkupinya semua ( tautan Wikipedia ).
Masalah ini sepele jika jumlah titik tiga atau kurang (jika ada satu titik, lingkaran memiliki jari-jari nol; jika ada dua titik, segmen garis yang menghubungkan titik-titik tersebut adalah diameter lingkaran; jika ada tiga (non-colinear) poin, dimungkinkan untuk mendapatkan persamaan lingkaran yang menyentuh mereka semua jika mereka membentuk segitiga non-tumpul, atau lingkaran yang menyentuh hanya dua titik dan menutup ketiga jika segitiga tumpul). Jadi, demi tantangan ini, jumlah poin harus lebih dari tiga.
Tantangan:
- Input: Daftar 4 atau lebih poin non-colinear. Poin harus memiliki koordinat X dan Y; koordinat bisa mengapung. Untuk meringankan tantangan, tidak ada dua poin yang harus berbagi koordinat X yang sama.
Sebagai contoh:[(0,0), (2,1), (5,3), (-1,-1)]
- Keluaran: Satu tupel nilai,
(h,k,r)
sehingga adalah persamaan dari lingkaran terkecil yang melingkupi semua titik.
Aturan:
- Anda dapat memilih metode input apa pun yang sesuai dengan program Anda.
- Output harus dicetak ke
STDOUT
atau dikembalikan oleh suatu fungsi. - "Normal", tujuan umum, bahasa lebih disukai, tetapi esolang apa pun dapat diterima.
- Anda dapat mengasumsikan bahwa poinnya tidak colinear.
- Ini adalah kode-golf, jadi program terkecil dalam byte menang. Pemenang akan dipilih satu minggu setelah tantangan diposting.
- Harap sertakan bahasa yang Anda gunakan dan panjang dalam byte sebagai tajuk di baris pertama jawaban Anda:
# Language: n bytes
- Harap sertakan bahasa yang Anda gunakan dan panjang dalam byte sebagai tajuk di baris pertama jawaban Anda:
Kasus uji:
- 1:
- Memasukkan:
[(-8,0), (3,1), (-6.2,-8), (3,9.5)]
- Keluaran:
[-1.6, 0.75, 9.89]
- Memasukkan:
- 2:
- Memasukkan:
[(7.1,-6.9), (-7,-9), (5,10), (-9.5,-8)]
- Keluaran:
[-1.73, 0.58, 11.58]
- Memasukkan:
- 3:
- Memasukkan:
[(0,0), (1,2), (3,-4), (4,-5), (10,-10)]
- Keluaran:
[5.5, -4, 7.5]
- Memasukkan:
- 4:
- Memasukkan:
[(6,6), (-6,7), (-7,-6), (6,-8)]
- Keluaran:
[0, -0.5, 9.60]
- Memasukkan:
Selamat bermain golf !!!
Jawaban:
Bahasa Wolfram (Mathematica) ,
2827 byteCobalah online!
Built-in berguna di sini. Output adalah objek disk dengan pusat dan jari-jari. Seperti yang lain, saya telah menemukan kasus uji 2 dan 3 berbeda dengan pertanyaan.
Terima kasih kepada @ lirtosiast karena telah menghemat satu byte!
Jika daftar diperlukan sebagai output, ini dapat dilakukan dalam 35 byte (dengan biaya tambahan 8 byte) . Terima kasih kepada @Roman untuk menunjukkan ini.
sumber
Append@@BoundingRegion[#,"MinDisk"]&
JavaScript (ES6),
298 ... 243242 byteMengembalikan array
[x, y, r]
.Cobalah online!
atau lihat versi yang diformat
Bagaimana?
metode
Dan kami akhirnya mengembalikan lingkaran valid terkecil.
Pelaksanaan
sumber
R , 59 byte
Cobalah online!
Mengambil input sebagai vektor koordinat kompleks.
Mod
adalah jarak (modulus) dalam bidang kompleks dannlm
merupakan fungsi optimisasi: ia menemukan posisi pusat (keluaran sebagaiestimate
) yang meminimalkan jarak maksimum ke titik input, dan memberikan jarak yang sesuai (keluaran sebagaiminimum
), yaitu jari-jari . Akurat hingga 3-6 digit; footer TIO membulatkan output menjadi 2 digit.nlm
mengambil vektor numerik sebagai input:y%*%c(1,1i)
bisnis mengubahnya menjadi kompleks.sumber
Jelly ,
10098 byteCobalah online!
Berbeda dengan jawaban bahasa Wolfram saya , Jelly membutuhkan cukup banyak kode untuk mencapai ini (kecuali saya kehilangan sesuatu!). Program lengkap ini mengambil daftar poin sebagai argumennya dan mengembalikan pusat dan jari-jari lingkaran terlampir terkecil. Ini menghasilkan circumcircles untuk semua set tiga titik, dan diameter untuk semua set dua titik, cek yang mencakup semua titik dan kemudian memilih satu dengan jari-jari terkecil.
Kode untuk bit make_circumcircle terinspirasi oleh kode di situs ini , yang pada gilirannya terinspirasi oleh Wikipedia.
sumber
APL (NARS), 348 karakter, 696 byte
Ini adalah salah satu 'implementasi' dari formula dalam solusi Arnauld ... Hasil dan komentar:
f: menemukan kombinasi alpha ojets di set omega
((X, Y), r) dari sekarang mewakili satu lingkaran dari jari-jari r dan pusat di (XY).
c: menemukan jika titik di ⍺ berada di dalam keliling ((XY) r) di ⍵ (hasil <= 0) atau itu eksternal (hasil> 0) Dalam hal input lingkar di ⍵ itu adalah ⍬ sebagai input, itu akan mengembalikan 1 (di luar keliling) setiap kemungkinan input di ⍺.
p: jika ⍵ adalah array dari ((XY) r); untuk masing-masing ((XY) r) di ⍵ menulis 1 jika semua titik dalam array ⍺ adalah internal ke ((XY) r) jika tidak menulis 0 NB Berikut adalah sesuatu yang tidak berjalan karena saya harus membulatkan ke epsilon = 1e¯ 13. dengan kata lain dalam kasus batas poin di pesawat (dan mungkin dibangun dengan sengaja) itu bukan solusi 100% diasuransikan
s2: dari 2-titik di ⍵, ia mengembalikan keliling dalam format ((XY) r) yang memiliki diameter dalam 2 titik tersebut
s3: dari 3 titik itu mengembalikan keliling dalam format ((XY) r) melewati tiga poin Jika ada masalah (misalnya poin disejajarkan), itu akan gagal dan kembali ⍬.
perhatikan bahwa -. × menemukan penentu matriks nxn dan
s: dari n titik di ⍵, ia menemukan tipe keliling dari yang ditemukan oleh s2 atau dari tipe s3 yang berisi semua n poin.
s1: dari set yang ditemukan dari s di atas menghitung yang memiliki radius minimum dan mengembalikan yang pertama yang memiliki radius minimal. Tiga angka sebagai array (koordinat pertama dan kedua adalah koordinat tengah, sedangkan yang ketiga adalah jari-jari keliling yang ditemukan).
sumber
Python 2 (PyPy) ,
244242 byteCobalah online!
Ini menggunakan algoritma brute-force O (n ^ 4), iterasi melalui setiap pasangan dan segitiga titik, menghitung pusat, dan menjaga pusat yang membutuhkan jari-jari terkecil untuk melampirkan semua titik. Ini menghitung keliling dari 3 poin melalui menemukan persimpangan dari dua garis-garis tegak lurus (atau, jika dua titik sama, ia menggunakan titik tengah dengan yang ketiga).
sumber
P={x+y*1j for x,y in input()}
menghemat 2 byte juga.Python
212190 byteSolusi ini salah, dan saya harus bekerja sekarang jadi saya tidak punya waktu untuk memperbaikinya.
Cobalah online!
Saya menemukan dua titik mana yang paling jauh dan kemudian saya menghasilkan persamaan untuk lingkaran berdasarkan dari titik-titik itu!
Saya tahu ini bukan yang terpendek dalam python, tapi itu yang terbaik yang bisa saya lakukan! Juga ini adalah upaya pertama saya untuk melakukan salah satu dari ini, jadi harap mengerti!
sumber
if g>c:\n c=g\n d=[e,f]
untukif g>c:c=g;d=[e,f]
, menghemat banyak spasi. Saya tidak berpikir Anda perlu menginisialisasi d sebelumnya, juga menggunakan dua variabel danE,F=e,f
di baris 10 akan membuat Andaprint
jauh lebih pendek. Saya pikir solusi denganmax
dan pemahaman daftar akan lebih pendek dari dua loop, tapi saya mungkin salah. Sayangnya, solusi Anda tidak tepat. Untuk titik (-1,0), (0,1.41), (0,5, 0), (1,0) solusi Anda menghitung lingkaran di sekitar 0 dengan jari-jari 1. Tetapi titik (1, 1,41) tidak dalam lingkaran.