Lingkaran dan bujur sangkar memiliki satu titik pusat yang pasti. Namun, gagasan tentang pusat segitiga telah lama dibahas. Empat pusat yang berbeda diketahui oleh orang Yunani Kuno:
- Incenter : Persimpangan dari garis-bagi sudut segitiga
- Centroid : Perpotongan garis-garis dari setiap sudut segitiga ke tengah sisi yang berlawanan
- Circumcenter : Perpotongan garis-garis tegak lurus sisi
- Orthocenter : Persimpangan ketinggian segitiga
Euler kemudian membuktikan bahwa centroid, circumcenter dan orthocenter adalah collinear dalam segitiga apa pun. Garis di mana ketiga titik ini berada dalam segitiga disebut Garis Euler . Ini didefinisikan untuk setiap segitiga kecuali segitiga sama sisi, di mana semua titik bertepatan.
Tantangan Anda adalah membuat program atau fungsi terpendek yang, ketika diberi dua input, menghasilkan pusat tertentu atau Garis Euler pada segitiga. Yang pertama menentukan koordinat masing-masing simpul dari sebuah segitiga. Yang kedua adalah bilangan bulat dari 1 hingga 5, menentukan apa yang akan dihasilkan.
1 - Incenter
2 - Centroid
3 - Circumcenter
4 - Orthocenter
5 - Equation of Euler Line
(if the Euler Line is vertical, output the `x` value of the line
(e.g. output `5` if the equation of the line is `x = 5`))
Anda dapat mengasumsikan bahwa simpul yang diberikan tidak akan pernah menjadi linear, dan bahwa mereka akan selalu menjadi koordinat bilangan bulat (ini juga mengecualikan kemungkinan memiliki segitiga sama sisi sebagai input, sesuai komentar @Kap ).
Array input harus berupa array bertingkat yang valid dalam bahasa Anda, dan input harus dalam format apa pun yang masuk akal. Nilai float apa pun harus ditampilkan ke setidaknya 3 tempat desimal, tetapi tidak kurang. Titik keluaran harus berupa array yang valid dalam bahasa Anda, cocok dengan format input.
Kasus uji:
Input: [(-2, 0), (1, 0), (0, 1)] 1
Output: (-0.089, 0.451)
Input: [(-2, 0), (1, 0), (0, 1)] 2
Output: (-0.333, 0.333)
Input: [(-2, 0), (1, 0), (0, 1)] 3
Output: (-0.5, -0.5)
Input: [(-2, 0), (1, 0), (0, 1)] 4
Output: (0, 2)
Input: [(-2, 0), (1, 0), (0, 1)] 5
Output: 5x + 2
Klarifikasi: Masukan dapat dari stdin, spasi atau baris baru dipisahkan, atau sebagai argumen untuk suatu fungsi. Outputnya, bagaimanapun, harus ditulis ke stdout.
y=f(x)
.(if the triangle is equilateral, output the point at which the centers meet)
karena tidak mungkin untuk membuat segitiga sama sisi pada bidang koordinat menggunakan hanya koordinat bilangan bulat.Jawaban:
Python -
908870Baris baru ditambahkan untuk mengurangi pengguliran. Ini mungkin bisa golf lebih lanjut.
Kasus uji (beranotasi):
Seperti yang Anda lihat, ada kemungkinan kesalahan yang disebabkan oleh penggunaan floating point.
Golf selanjutnya:
Berdasarkan saran dalam komentar di bawah ini, saya berhasil membuatnya lebih kecil.
sumber
R=r.append
dan kemudian menggunakannya untuk menghemat byte?AutoHotkey - 731
Fungsi ini dapat lebih diperkecil (sekitar 600 karakter atau kurang) dengan memperpendek nama variabel seperti midx_a, midx_b, dan sebagainya.
Memanggil fungsi
sumber
Python 3.5,
851772 byte:Mengambil input sebagai urutan koordinat yang dipisahkan koma, diikuti oleh integer yang menyampaikan apa yang akan ditampilkan. Misalnya, jika koordinat input adalah
(1,0),(2,1),(1,4)
dan Anda ingin orthocenter dari segitiga sesuai dengan koordinat tersebut, Anda cukup memanggil fungsi seperti:Output dalam format tuple jika titik tertentu diperlukan, dalam format string dengan persamaan dalam bentuk
y=mx+b
jika garis Euler diperlukan dan garis tidak vertikal, atau hanyax
nilai garis jika garis Euler adalah diperlukan tapi garis adalah vertikal.Jadi, menggunakan segitiga dengan simpul
(1,0),(2,1),(1,4)
, outputnya adalah:Saya akan mencoba bermain golf ini lebih dari waktu di mana dan kapan saya bisa.
Cobalah secara Online! (Ideone)
sumber