Tantangan ini adalah tentang menemukan disk terkecil yang berisi beberapa poin tertentu. Ini dibuat agak rumit, oleh kenyataan bahwa dalam tantangan ini, koordinat disk dan jari-jari keduanya harus bilangan bulat.
Input Anda akan menjadi daftar poin dengan koordinat bilangan bulat x
dan y
. Anda dapat mengambil ini sebagai daftar tupel, daftar daftar, atau cara lain untuk mewakili kumpulan pasangan. x
dan y
keduanya akan (mungkin negatif) bilangan bulat. Setiap poin dijamin unik, dan akan ada setidaknya satu poin.
Output Anda akan menjadi disk dalam bentuk tiga angka, X
, Y
, dan R
. X
,, Y
dan R
semuanya bilangan bulat, X
dan Y
mewakili pusat disk dan R
mewakili radiusnya. Jarak antara setiap titik dan pusat harus kurang dari atau sama dengan R
, dan tidak boleh ada disk dengan yang lebih kecil R
yang juga memenuhi kondisi ini.
Ada kemungkinan bahwa akan ada beberapa solusi yang mungkin untuk input yang diberikan, kode Anda harus menampilkan setidaknya satu dari mereka dalam hal ini.
Anda dapat menggunakan segala jenis geometri bawaan dalam dukungan bahasa Anda jika ada, dan input / output mungkin melalui objek titik / disk bawaan bukan hanya angka.
Uji Kasus
Input (Possible) Output(s)
(x,y) (X,Y,R)
-------------------------
(0,0) (0,0,0)
-------------------------
(0,1) (0,0,1)
(1,0) (1,1,1)
-------------------------
(1,4) (4,4,3)
(3,2)
(4,1)
(4,5)
(5,2)
(7,4)
-------------------------
(-1,0) (0,0,2)
(2,0) (1,0,2)
-------------------------
(-1,0) (1,0,2)
(2,1) (0,1,2)
-------------------------
(0,0) (1,0,1)
(1,1) (0,1,1)
Bytes paling sedikit menang.
Jawaban:
Jelly ,
252422212018 byteTerima kasih kepada @EriktheOutgolfer karena memberi tahu saya
)
, menghemat 1 byte.Terima kasih kepada @Dennis karena telah menghemat 2 byte.
Cobalah online!
Penjelasan
sumber
€
?Brachylog v2, 19 byte
Cobalah online!
Program ini mudah ditulis - Brachylog hampir sempurna untuk masalah seperti ini - tetapi sulit untuk bermain golf. Tidak akan mengejutkan saya jika ada penghematan byte di suatu tempat di sini, karena beberapa hal yang saya lakukan tampaknya memiliki efek (dan itu berisi instruksi peta bersarang, biasanya tanda bahwa Anda harus menggunakan anggota / findall, tetapi saya tidak bisa lihat cara untuk melakukannya).
Ini adalah pengiriman fungsi. Input dari argumen kiri ke fungsi dalam format
[[x,y],[x,y],…]
, output dari argumen kanan dalam formulir[r,[[x,y]]]
. (Jika Anda ingin mencoba angka negatif dalam input, perhatikan bahwa Brachylog menggunakan_
untuk tanda minus, tidak-
. Ini membingungkan karena fungsi → pembungkus program lengkap yang dikirimkan oleh Brachylog, diminta menggunakan argumen baris perintahZ
, akan menampilkan angka negatif dalam output dengan tanda minus reguler.)Penjelasan
Ini menarik karena kami meminta Brachylog untuk menemukan nilai properti tertentu (dalam hal ini, jari-jari disk terpusat pada titik
A
yang cocok dengan semua titik input), tetapi sulit menempatkan persyaratan apa pun di atasnya (yang kami butuhkan hanyalah bahwa jari-jari adalah angka). Namun, Brachylog secara internal akan menghitung jari-jari yang dimaksud secara simbolis daripada mencoba menggunakan angka konkret, jadi ketika final≜
tercapai, ia menyelesaikan dua hal sekaligus: pertama, itu memastikan bahwa hanya bilangan bulat yang digunakan untuk koordinatA
dan untuk jari-jari (memaksa jari-jari kuadrat menjadi angka kuadrat, dan menjelaskan penggunaan≤ᵛ
untuk menemukan "maksimum atau lebih besar"); kedua, ia menemukan jari-jari paling layak yang mungkin ada (karena jari-jari lebih dulu dalam output).Satu hal yang tidak ditentukan dalam program sama sekali adalah bahwa semua titik diukur terhadap pusat disk yang sama; seperti yang tertulis, tidak ada kendala bahwa kami tidak menggunakan pusat yang berbeda untuk setiap poin. Namun, urutan tiebreak (yang dalam hal ini ditetapkan oleh yang ketiga
ᵐ
, dan yang sebagai batasan struktur akan dievaluasi sebelum batasan nilai yang disiratkan oleh≜
) inginA
sesingkat mungkin (yaitu elemen tunggal, jadi kami menggunakan yang sama pusat setiap kali; ia mencoba panjang nolA
pertama tapi itu jelas tidak berhasil, jadi coba daftar singleton berikutnya). Akibatnya, kami akhirnya mendapatkan kendala yang berguna (bahwa kami hanya memiliki satu disk) "gratis".Solusi ini terjadi untuk menggeneralisasi ke sejumlah dimensi , tanpa perubahan pada kode sumber; tidak ada asumsi di sini bahwa benda itu dua dimensi. Jadi jika Anda membutuhkan bola integer terkecil, Anda dapat memilikinya juga.
sumber
Perl 6 , 81 byte
Cobalah online!
Mengambil daftar poin sebagai daftar 2-elemen
((X1, Y1), (X2, Y2), ...)
. Mengembalikan daftar(R, (X, Y))
. Menggunakan pendekatan yang sama dengan jawaban Jelly Pietu1998:The
minmax
Metode ini berguna di sini seperti mengembalikanRange
. Produk Cartesian dari rentang langsung menghasilkan semua titik dengan koordinat bilangan bulat.sumber
05AB1E , 26 byte
Port dari jawaban Jelly @ Pietu1998 .
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Matlab, 73 byte
Cukup temukan solusi terkecil (titik apung) dan bulatkan ke titik terdekat dan potong jari-jarinya (kasus terburuk untuk masalah minimax). Saya tidak tahu pasti apakah itu menghasilkan solusi yang benar untuk semua kasus yang mungkin (dalam presisi), tetapi untuk kasus uji itu harus bekerja (jika saya tidak membuat kesalahan pengetikan).
Sebut saja dengan
sumber
fminimax
Pyth ,
3433 byteOutput dalam bentuk
[R,x,y]
Coba online di sini , atau verifikasi semua uji sekaligus di sini .
Sunting: Menyimpan byte dengan mengatur ulang format output, versi sebelumnya:
heDm+d.EeSm@s^R2-Vdk2Q*Fm}FhM_BSdC
sumber
Bahasa Wolfram (Mathematica) , 66 byte
Inilah pendekatan brute force. Saya menganggap fungsi jauh lebih pendek
BoundingRegion[#,"MinDisk"]&
tetapi tidak ada cara untuk memaksa koordinat bilangan bulat & jari-jari.Cobalah online!
sumber
{Round@#[[1]], Ceiling@#[[2]]} &@BoundingRegion[#, "MinDisk"]&
?Java 10,
283279277257 byte-20 byte berkat tip penggunaan @nwellnhof
Math.hypot
.Array hasil berada dalam urutan
[R,X,Y]
.Cobalah online.
Penjelasan:
sumber
Math.hypot
.Math.hypot
, yang sempurna untuk tantangan ini! -20 byte di sana. Terima kasih. :)Javascript, 245 byte
(Agak) versi yang lebih mudah dibaca:
Temukan saja kotak pembatas, dan uji setiap koordinat dalam kotak itu untuk mengetahui apakah itu yang terbaik.
Saya bisa menyimpan 8 byte dengan jawaban perkiraan, dengan mengganti:
Math.ceil(Math.sqrt(n[2]))
dengan~~(n[2]+1-1e-9)
sumber
for(f=c;f<b;f++){for(g=e;g<d;g++){s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);n=n?n[2]>s?[f,g,s]:n:[f,g,s]}}
kefor(f=c;f<b;f++)for(g=e;g<d;n=n?n[2]>s?[f,g,s]:n:[f,g,s],g++)s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);
. Dan saya cukup yakin Anda dapat menghapus ruang direturn[
.Math.hypot
.Ruby , 113 byte
Cobalah online!
sumber
Arang , 65 byte
Cobalah online!Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Dapatkan koordinat y
z
.Dapatkan koordinat x ke
h
.Putaran atas rentang inklusif dari minimum ke maksimum
h
danz
menghasilkan daftar semua pusat disk yang potensial.Ulangi semua pusat cakram, lalu putar semua titik awal, lalu lewati kedua koordinat, kurangi, kuadrat, jumlah, ambil maksimum, dan simpan daftar yang dihasilkan.
Temukan posisi diameter maksimum minimal dan cetak pusat disk yang sesuai.
Cetak diameter maksimum minimal, tetapi bulatkan ke bilangan bulat berikutnya.
sumber