Dari http://en.wikipedia.org/wiki/Triangle :
Tulislah sebuah program yang membutuhkan tiga tupel koordinat 2d (Kartesius), dan klasifikasikan bentuk apa yang dijelaskan ketiga poin ini.
Dalam hampir semua kasus, titik-titik ini akan menggambarkan segitiga dengan berbagai jenis. Dalam beberapa kasus yang merosot, titik-titik tersebut akan menggambarkan titik tunggal atau garis lurus. Program akan menentukan tag mana yang berlaku untuk bentuk yang dijelaskan:
- Poin (3 poin adalah insiden bersama)
- Garis (3 poin terletak pada garis lurus - tidak lebih dari 2 poin dapat terjadi bersamaan)
- Sama sisi (3 sisi sama, 3 sudut sama)
- Sama kaki (2 sisi sama, 2 sudut sama)
- Scalene (0 sisi sama, 0 sudut sama)
- Kanan (1 sudut tepat π / 2 (atau 90 °))
- Miring (0 sudut persis π / 2 (atau 90 °))
- Obtuse (1 sudut> π / 2 (atau 90 °))
- Akut (3 sudut <π / 2 (atau 90 °))
Perhatikan bahwa untuk beberapa bentuk yang dijelaskan, lebih dari satu tag di atas akan berlaku. Sebagai contoh, setiap sudut siku-siku juga akan sama kaki atau sama sisi.
Memasukkan
- Program ini dapat membaca 3 input koordinat dari STDIN, baris perintah, variabel lingkungan atau metode apa pun yang sesuai untuk bahasa pilihan Anda.
- Input mengoordinasikan format saya namun nyaman untuk bahasa pilihan Anda. Dapat diasumsikan bahwa semua nomor input terbentuk dengan baik sehubungan dengan tipe data yang akhirnya Anda gunakan.
- Tidak ada yang dapat diasumsikan tentang pemesanan koordinat input.
Keluaran
- Program akan menampilkan ke STDOUT, kotak dialog atau metode tampilan apa pun yang sesuai untuk bahasa pilihan Anda.
- Output akan menampilkan semua tag yang berlaku untuk bentuk yang dijelaskan oleh koordinat input.
- Tag dapat berupa output dalam urutan apa pun.
Peraturan Lainnya
- Pustaka / API trigonometri bahasa Anda diizinkan, tetapi API apa pun yang secara spesifik menghitung jenis segitiga dilarang.
- Saat menentukan persamaan sudut atau panjang sisi, Anda mungkin akan akhirnya membandingkan nilai titik apung. Dua nilai tersebut harus dianggap "sama" jika satu berada dalam 1% dari yang lain.
- Standar “celah” yang tidak lagi lucu
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Contohnya
Input Output
(1,2) (1,2) (1,2) Point
(1,2) (3,4) (5,6) Line
(0,0) (1,1) (2,0) Isosceles Right
(0,0) (2,1) (10,1) Scalene Oblique Obtuse
Jawaban:
C (451 byte)
Hanya menggunakan panjang dan lereng yang persegi.
Tidak disatukan (dan operator ternary diganti dengan jika / lain):
Input (melalui stdin) Format: xyxyxy
ex. 0 0 1 1 2 0 untuk Kanan Sama Kaki
sumber
./triangle <<< "1 2 1 2 1 2"
harus digunakan, dengan tanda kutip.C, 333
Saya meninggalkan ruang putih untuk saat ini. Ini bekerja tetapi mungkin bisa dilakukan dengan beberapa merapikan dan bermain golf. Mirip dengan
@es1024
jawaban matematika , tetapi menggunakan loop dan array. Masukkan formatx y x y x y
Variabel
t[]
menyimpan input dan kuadrat dari panjang. Pada akhir program terlihat seperti tabel di bawah ini (meningkatkan jumlah iterasi dari loop akan menyebabkan repitition tak terbatas dari panjang kuadrat.) Pada awal loop kuadrat dari panjang (sampah karena tidak semua data tersedia ) tidak perlu disimpan dalam sel 1,3 dan 5, tetapi segera ditimpa olehscanf.
data yang berguna ditulis kez,b,c
ahds
ketikai
= 9,11,13 (t[i]
dant[i-2]
diakses.)g[]
ditambahkan terlambat untuk menahan nilai dx dan dy yang diperlukan untuk perhitungan kemiringan. Satu-satunya sel yang digunakan adalah 6 hingga 9 (0 hingga 5 tidak dapat diandalkan karena tidak semua data tersedia saat ditulis.) Jikag[6]/g[7]==g[8]/g[9]
kemiringan 2 garis sama dan segitiga hanya garis (atau sebuah titik). Persamaannya diatur ulang dalam program untuk menghindari perpecahan.r
adalah nilai antara yang digunakan untuk mengkuadratkanz
menghitung jumlah sisi panjang nol. Ini memiliki offset +3 karena loop membaca 3 sel kosongt[]
.c
menghitung jumlah sisi yang panjangnya identik. Ini juga memiliki offset +3. Perhatikan bahwa sisia
ditulist[]
dua kali agar dapat memeriksa a = b, b = c, c = a.b
adalah panjang sisi terbesar, kuadrat.s
adalah jumlah kuadrat dari semua sisi.Perhatikan bahwa membandingkan panjang sisi A ^ 2 + B ^ 2 + C ^ 2 dengan 2 * B ^ 2 sama dengan membandingkan A ^ 2 + C ^ 2 dengan B ^ 2 (cukup kurangi B ^ 2 dari kedua sisi.) jika B ^ 2 = A ^ 2 + C ^ 2 itu adalah segitiga siku-siku. jika B ^ 2 lebih besar itu tumpul, jika lebih kecil itu akut.
sumber
Golfscript (175 byte)
Anda dapat mengujinya di sini (set tes disertakan).
Masukkan format:
Versi yang dikomentari:
CATATAN:
Alasan kode saya tidak mengandung keluaran "sama sekali" adalah karena:
sumber
Mathematica (
313307 karakter)Golf:
Tidak Disatukan:
Format input adalah daftar poin, di mana fungsi dipanggil:
sumber