Diberikan 5 titik berbeda pada bidang dua dimensi, tentukan jenis penampang kerucut yang dibentuk oleh titik tersebut. Output akan menjadi satu dari circle
, hyperbola
, ellipse
, atau parabola
.
Aturan
- Titik-titik akan berada pada posisi linear umum, yang berarti bahwa tidak ada tiga titik yang collinear, dan dengan demikian kerucut yang melewatinya akan menjadi unik.
- Koordinat dari 5 poin akan berupa angka desimal antara -10 dan 10, inklusif.
- Ketepatan untuk nilai desimal / float haruslah ketepatan jenis float / desimal asli bahasa Anda. Jika bahasa / tipe data Anda memiliki ketelitian yang arbitrer, Anda dapat menggunakan 12 digit setelah titik desimal sebagai ketelitian maksimum yang diperlukan, membulatkan ke nol (misalnya
1.0000000000005 == 1.000000000000
). - Kapitalisasi output tidak menjadi masalah.
- Mengeluarkan
ellipse
ketika bagian kerucut sebenarnya lingkaran tidak diizinkan. Semua lingkaran adalah elips, tetapi Anda harus menampilkan yang paling spesifik.
Pada ketidakakuratan dan presisi floating point:
Saya mencoba membuat ini sesederhana mungkin, sehingga masalah dengan ketidakakuratan floating point tidak menghalangi. Tujuannya adalah, jika tipe data adalah "nilai presisi magis tak terbatas" alih-alih float / double, maka semuanya akan bekerja dengan sempurna. Tetapi, karena "nilai ketelitian tak terbatas magis" tidak ada, Anda menulis kode yang mengasumsikan bahwa nilai Anda adalah ketepatan tak terbatas, dan setiap masalah yang muncul sebagai akibat ketidakakuratan titik mengambang adalah fitur, bukan bug.
Uji Kasus
(0, 0), (1, 5), (2, 3), (4, 8), (9, 2) => hyperbola
(1.2, 5.3), (4.1, 5.6), (9.1, 2.5), (0, 1), (4.2, 0) => ellipse
(5, 0), (4, 3), (3, 4), (0, 5), (0, -5) => circle
(1, 0), (0, 1), (2, 1), (3, 4), (4, 9) => parabola
circle
tampaknya membutuhkan pemeriksaan kesetaraan pelampung untuk membedakan dari elips yang sangat bulat. Apa presisi yang harus kita asumsikan di sini?Jawaban:
Matlab, 154 byte
Menyimpan beberapa byte berkat saran Suever.
Mengambil input sebagai
[x1 y1;x2 y2;x3 y3; etc]
. Ini menggunakan matriks Vandermonde, dan menemukan dasar ruang nolnya, yang akan selalu menjadi vektor tunggal. Kemudian menghitung diskriminan dan menggunakannya untuk membuat indeks antara 1 dan 4 yang digunakan untuk mendapatkan string.Tidak Disatukan:
Bagian
sign(...)
menghitung diskriminan, memberi 1 jika itu positif (hiperbola), -1 jika itu negatif (elips), dan 0 jika itu 0 (parabola). Themax(...)
mengurangi 1 pergi jika itu adalah lingkaran. Array Matlab adalah satu-diindeks, jadi tambahkan 3 untuk memberikan nilai 1, 2, 3, 4, dan gunakan itu untuk mengindeks array nama bagian kerucut.sumber
max() == 0
Anda dapat menyederhanakannya~max()
ones(length(p),1)
Anda tidak dapat melakukannya1+p(:,1)*0
max()
hal itu konyol bagi saya, saya memang punya perbandingan di sana sebelumnya dan jelas malas! Cara mendapatkan ituones
juga sangat bagus.JavaScript (ES6), 316
323 347Bahasa apa pun yang lebih cocok untuk menangani matriks dan penentu harus mendapat skor yang lebih baik (APL, J, CJAM, Jelly)
Referensi: Bentuk umum kerucut , Lima poin menentukan kerucut , Sistem persamaan linear , Penentu
Dalam bidang kartesius, persamaan umum dari sebuah kerucut adalah
memiliki A atau B atau C tidak sama dengan 0 (kalau tidak itu adalah garis lurus)
A ... F adalah enam yang tidak diketahui yang dapat ditemukan. Dengan lima pasang (x, y) kita dapat membangun sistem linier dengan lima persamaan, dan penskalaan menghapus satu dimensi. Yaitu, kita dapat mengatur satu dari A, B atau C ke 1 jika bukan 0 (dan kita tahu bahwa setidaknya satu bukan 0).
Saya membangun dan mencoba menyelesaikan 3 sistem: pertama mencoba A = 1. Jika tidak dapat dipecahkan maka B = 1, maka C. (Mungkin ada cara yang lebih baik, tapi itu yang terbaik saat itu)
Memiliki nilai-nilai A, B, C kita dapat mengklasifikasikan kerucut melihat diskriminan
d=B*B-4*A*C
Kurang golf
Uji
sumber
Python - 234 byte
Saya tidak pernah mencetak
circle
atauparabola
karenat
dand[1]
tidak pernah menekan persis0
, tetapi OP mengatakan itu baik-baik saja.sumber
C, 500
Jawaban JavaScript saya porting ke C. Hanya untuk melihat apakah itu bisa dilakukan.
Penggunaan: membaca 10 nilai dari input standar
Keluaran:
Tes (ideone)
Kurang golf
sumber
Sage, 247 byte
Cobalah online
Fungsi ini mengambil iterable dari
(x,y)
pasangan sebagai masukan, mencoba menghitung diskriminan dari masing-masing 3 kemungkinan sistem linear (A=1
,B=1
, danC=1
), dan output jenis irisan kerucut berdasarkan nilai-nilai diskriminan,A
,B
, danC
.Mungkin ada beberapa golf yang harus dilakukan, tapi aku berkarat dengan Sage dan mengantuk sekarang, jadi aku akan mengerjakannya lebih banyak di pagi hari.
sumber