Membantu! Ujian matematika saya akan segera hadir dan saya tidak belajar! 1 Bagian dari ujian adalah untuk mengklasifikasikan segiempat dengan koordinat titik, yang sayangnya saya tidak tahu caranya. 2
Jadi, tantangan Anda adalah menulis program untuk melakukan ini untuk saya jadi saya tidak gagal!
Tantangan
Diberikan empat simpul sedemikian rupa sehingga tidak ada tiga dari mereka yang kolinear, tentukan klasifikasi paling spesifik dari segiempat yang dibentuk oleh keempat simpul tersebut.
Yang saya maksud dengan "klasifikasi paling spesifik" adalah bahwa meskipun semua kotak adalah persegi panjang, jika bentuknya persegi, Anda harus menunjukkan bahwa itu adalah persegi dan tidak menunjukkan bahwa itu adalah persegi panjang.
Memasukkan
Input akan diberikan sebagai empat (x, y) koordinat. Anda dapat mengambil ini sebagai daftar panjang 4 daftar / tupel panjang 2. Atau, Anda dapat mengambil input sebagai daftar koordinat x dan daftar masing-masing koordinat y.
Sebagai contoh, jika bentuk saya memiliki simpul pada titik-titik (0, 0)
, (5, 0)
, (6, 1)
, dan (1, 1)
, Anda dapat memilih untuk mengambil masukan dalam salah satu dari format berikut atau yang serupa:
[(0, 0), (5, 0), (6, 1), (1, 1)]
([0, 5, 6, 1], [0, 0, 1, 1])
Anda dapat mengasumsikan bahwa segiempat tidak berpotongan sendiri dan bahwa titik-titik tersebut diberikan dalam urutan yang benar (yaitu, dua titik berurutan dalam input akan dihubungkan oleh segmen garis dalam segi empat).
Keluaran
Anda akan membutuhkan keluaran unik untuk masing-masing kelas segiempat berikut:
- Kotak
- Empat persegi panjang
- Belah ketupat
- Genjang
- Trapesium / Trapesium
- Layang-layang
- Berbentuk segi empat
Ini bisa berupa nama persisnya, karakter, bilangan bulat, dll.
Aturan
- Celah Standar Berlaku
- Jika bahasa pemrograman Anda memiliki built-in yang akan melakukan tugas yang tepat ini, bahwa built-in tidak diperbolehkan.
- Built-in untuk menemukan jarak antara dua titik diperbolehkan.
- Built-in untuk menemukan sudut antara dua garis diperbolehkan.
Pada titik ini, jika Anda mengetahui semua persyaratan, Anda siap untuk memulai pemrograman! (Kasus Uji pada akhirnya)
Terminologi
Bagian ini untuk siapa saja yang membutuhkan klarifikasi tentang definisi bentuk yang berbeda.
Kotak
Segiempat adalah bujur sangkar jika dan hanya jika keempat sisinya memiliki panjang yang sama dan setiap pasangan sisi yang berdekatan tegak lurus (yaitu, segi empat dan belah ketupat).
Empat persegi panjang
Segiempat adalah persegi panjang jika dan hanya jika setiap pasangan sisi yang berdekatan tegak lurus.
Belah ketupat
Segiempat adalah belah ketupat jika dan hanya jika keempat sisinya sama.
Genjang
Quadrilateral adalah jajar genjang jika dan hanya jika setiap pasangan sisi yang berlawanan adalah paralel dan setiap pasangan dari sudut yang berlawanan adalah sama. Kedua kondisi ini menyiratkan satu sama lain sehingga Anda hanya perlu memeriksa salah satunya.
Trapesium / Trapesium
Segiempat adalah trapesium / trapesium jika dan hanya jika memiliki setidaknya satu sisi paralel.
Layang-layang
Segiempat adalah layang-layang jika dua pasang yang berlawanan dari sisi yang berdekatan memiliki panjang yang sama; yaitu, dua sisi yang berdekatan sama dan dua lainnya juga sama.
Uji Kasus
input as (x, y) * 4 -> full name
[(0, 0), (1, 0), (1, 1), (0, 1)] -> square
[(0, 0), (1, 1), (-1, 3), (-2, 2)] -> rectangle
[(0, 0), (5, 0), (8, 4), (3, 4)] -> rhombus
[(0, 0), (5, 0), (6, 1), (1, 1)] -> parallelogram
[(0, 0), (4, 0), (3, 1), (1, 1)] -> trapezoid/trapezium
[(0, 0), (1, 1), (0, 3), (-1, 1)] -> kite
[(0, 0), (2, 0), (4, 4), (0, 1)] -> quadrilateral
Tautan (Kalkulator Grafik Desmos)
Berikut ini tautan ke visualisasi masing-masing kasus uji.
Persegi
Persegi Panjang
Rhombus
Parallelogram
Trapesium / Trapezium
Kite
Segiempat
Kriteria Menang
Saya tidak bisa membawa komputer ke ujian, jadi saya ingin Anda menulis kode sesingkat mungkin agar saya dapat menghafalnya. Saya perlu menuliskannya di margin dan menjalankannya menggunakan TryItOffline TM sehingga agar sesuai dengan margin, program Anda harus sekecil mungkin!
1 Tentu saja saya benar-benar melakukannya: P
2 Tentu saja saya benar-benar melakukannya: P
Jawaban:
APL (Dyalog) ,
104898082817978 byteCobalah online!
Input output
Mengambil 4 × 2 matriks koordinat sebagai input
Keluaran
1 1 1
untuk Square1 1 0
untuk Belah Ketupat1 0 1
untuk Rectangle1 0 0
untuk Parallelogram1 0
untuk Kite0 1
untuk Trapezium0 0
untuk segiempatAlgoritma
Pertama, temukan semua 4 sisi panjang dan sudut segiempat
Jika kedua pasang sudut yang berlawanan sama (
OA
), maka bentuknya adalah semacam jajaran genjang. Tentukan apakah semua panjang sisi sama (AS
, Sisi Bersebelahan) dan jika semua sudut sama (AA
).Jika tidak
OA
, maka:Tentukan apakah ada tepat 2 pasang sisi yang berdekatan yang sama dan jika mereka dipisahkan (
aabb
bukanaaab
). Jika demikian, bentuknya adalah layang-layang.Tentukan apakah ada tepat 1 pasang sisi yang berlawanan paralel. Jika demikian, bentuknya adalah trapesium.
Kalau tidak, bentuknya adalah segi empat.
Kode
⍙←{⍵⍺⍺1⌽⍵}
mendefinisikan operator baru. Dalam APL, operator berarti fungsi tingkat tinggi . Operator ini mengambil 1 argumen fungsional (⍺⍺
) dan mengembalikan fungsi monadik yang:1⌽
) argumen (⍵
)⍺⍺
antara itu dan⍵
Ini sangat berguna untuk fungsi skalar karena sebagian besar dari mereka secara implisit memetakan seluruh argumen array, memungkinkan
⍙
untuk menerapkannya di antara setiap pasangan elemen yang berdekatan dengan membungkus. Misalnya+⍙1 2 3 4
adalah1 2 3 4 + 2 3 4 1
yang mengevaluasi3 5 7 5
.x←-⍙⎕+.×1 0J1
mengubah matriks koordinat input ke dalam array bilangan kompleks yang mewakili vektor dari 4 sisi bentuk.⎕
, ketika direferensikan, mengambil dan mengembalikan input1 0J1
mewakili vektor [1, i] ("vektor" dalam arti matematika, dan "i" sebagai akar kuadrat dari -1). Dalam APL, bilangan kompleksa+bi
ditulisaJb
+.×
perkalian matriks. Secara matematis, hasilnya adalah matriks 4 × 1. Namun,+.×
disebut "produk dalam" di APL yang menggeneralisasikan perkalian matriks dan produk dalam vektor dan memungkinkan Anda untuk melakukan hal-hal genap seperti "gandakan" array 3 dimensi dengan yang 2 dimensi. Dalam hal ini, kita mengalikan matriks 4 × 2 dan vektor 2-elemen, menghasilkan vektor 4-elemen (dari representasi bilangan kompleks dari 4 simpul yang diberikan).-⍙
adalah pengurangan berpasangan dengan membungkus seperti yang disebutkan di atas. Ini memberikan vektor dari 4 sisi bentuk (sebagai bilangan kompleks). Vektor-vektor ini menunjuk ke arah "terbalik" tetapi itu tidak masalah.x←
menyimpannya ke dalam variabelx
2|1+-⍙(12○x)÷○1
menemukan (representasi) sudut eksterior pada 4 simpul bentuk.12○x
menemukan argumen utama , dalam radian, dari masing-masing vektor sisi 4.÷○1
membaginya dengan π sehingga sudutnya lebih mudah untuk dikerjakan. Dengan demikian, semua sudut dinyatakan sebagai kelipatan dari sudut lurus.-⍙
Pengurangan berpasangan dengan membungkus seperti yang disebutkan di atas. Ini memberikan 4 sudut eksterior.2|1+
Argumen utama dibatasi (-1,1] dan pengurangan berpasangan membuat kisaran (-2,2] .Ini buruk karena sudut yang sama memiliki 2 representasi yang berbeda. Dengan melakukan "tambah 1 mod 2", sudut akan kembali dibatasi pada (0,2). Meskipun semua sudut 1 lebih dari apa yang seharusnya, tidak apa-apa jika kita mengingatnya.|x
menemukan besarnya masing-masing vektor sisi 4{⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}
mendefinisikan dan menerapkan fungsi dengan array 4 sudut eksterior sebagai argumen kanan⍵
dan array 4 panjang sisi sebagai argumen benar⍺
.⍵≡2⌽⍵
adalah penjaga.1
maka ekspresi selanjutnya≡⍙¨0⍺⍵
dieksekusi dan nilainya dikembalikan.0
, ekspresi itu dilewati dan2 4=...=⍙⍺)
sebaliknya setelah dieksekusi.⍵≡2⌽⍵
memeriksa apakah kedua pasang sudut yang berlawanan sama.2⌽⍵
memutar array sudut sebanyak 2 tempat.⍵≡
memeriksa apakah itu sama dengan⍵
dirinya sendiri≡⍙¨0⍺⍵
mengembalikan nilai unik untuk setiap bentuk tipe jajaran genjang.0⍺⍵
adalah array 3-elemen skalar0
, array panjang sisi⍺
, dan array sudut⍵
.≡⍙¨
dieksekusi≡⍙
untuk masing-masing elemen tersebut.≡⍙
memeriksa apakah semua nilai array sama dengan memeriksa jika memutarnya 1 memberikan array yang sama. Skalar tidak berputar sehingga≡⍙0
kembali1
. Seperti disebutkan di atas,≡⍙⍺
memeriksa untuk belah ketupat dan≡⍙⍵
memeriksa untuk persegi panjang.2 4=+/1=2|+⍙↑⍵(=⍙⍺)
mengembalikan nilai unik untuk setiap bentuk non-jajaran genjang. Ini dicapai dengan menjalin pemeriksaan layang-layang dan trapesium.2=+/1=2|+⍙⍵
memeriksa trapezium.+⍙⍵
memberikan jumlah sudut yang berdekatan. Sudut interior garis-garis paralel berjumlah sudut lurus, demikian juga sudut eksterior sisi paralel segi empat. Jadi, setiap pasangan sisi paralel harus mengarah ke dua1
atau-1
dalam jumlah sudut yang berdekatan.1=2|
Namun, sudut dalam⍵
adalah 1 lebih dari yang seharusnya, sehingga sudut sebenarnya berjumlah1
atau3
. Ini dapat diperiksa dengan "mod 2 sama dengan 1".+/
menjumlahkan array. Ini memberikan jumlah jumlah sudut yang berdekatan yaitu1
atau3
.2=
periksa apakah itu sama dengan 2. (Yaitu jika ada persis sepasang sisi paralel)4=+/1=2|+⍙(=⍙⍺)
memeriksa layang-layang.(=⍙⍺)
memberikan array yang menunjukkan sisi yang berdekatan sama. Tidak seperti≡
,=
unsur-bijaksana kerja. Jadi, ini adalah array 4-elemen dengan1
s di mana panjang sisi itu sama dengan sisi "berikutnya".+⍙
Jumlah berpasangan dengan membungkus.1=2|
Karena(=⍙⍺)
memberikan array boolean (satu dengan hanya0
s dan1
s), satu-satunya nilai yang mungkin dari jumlah berpasangan adalah0
,1
dan2
. Jadi1=2|
sama dengan adil1=
.+/
menjumlahkan array. Ini memberikan jumlah jumlah berpasangan yang1
.4=
memeriksa apakah yang sama 4. Satu-satunya cara yang terjadi adalah jika(=⍙⍺)
adalah1 0 1 0
atau0 1 0 1
. Seperti disebutkan di atas, ini berarti bentuknya adalah layang-layang.2 4=+/1=2|+⍙↑⍵(=⍙⍺)
terjalin cek di atas.⍵(=⍙⍺)
adalah 2-elemen array yang bersarang dari array⍵
dan array(=⍙⍺)
↑
mempromosikan array bersarang ke matriks yang tepat. Karena⍵(=⍙⍺)
array 2 elemen dari array 4 elemen, hasilnya adalah matriks 2 × 4.+⍙
Karena⌽
(dan, dengan ekstensi,⍙
) memutar sumbu (horizontal) terakhir,+⍙
ke sebuah matriks sama dengan menerapkan+⍙
ke setiap baris secara individual.1=2|
baik residu / mod (|
) dan equals (=
) bekerja atas dasar per-elemen, bahkan untuk matriks.+/
Secara default, perkecil (/
) bekerja di sepanjang sumbu (horizontal) terakhir. Jadi+/
jumlahkan sepanjang baris dan ubah matriks 2 × 4 menjadi array sederhana 2-elemen.2 4=
Karena=
berfungsi per elemen, ini memeriksa kondisi layang-layang dan trapesium secara bersamaan.sumber
Mathematica, 195 byte
Dengan spasi putih:
Output
1
untuk kotak,2
untuk belah ketupat,3
untuk persegi panjang,4
untuk jajaran genjang,5
untuk layang-layang,6
untuk trapesium, dan7
untuk apa pun. Saya akan memposting tautan TIO, tetapi ini tampaknya tidak berfungsi dalam Matematika.Jika empat poin
P
,Q
,R
, danS
, kemudian{##,#}
adalah{P,Q,R,S,P}
, sehinggas
adalah daftar vektor sisi{Q-P,R-Q,S-R,P-S}
,l
adalah panjang dari vektor-vektor, danr
kondisi bahwa sudut antaraQ-P
danR-Q
serta sudut antaraR-Q
danS-R
keduanya90
derajat.Jadi, jika semua panjang sisi sama, maka segiempat adalah belah ketupat. Jika
r
tahan, itu sebenarnya sebuah bujur sangkar, kalau tidak itu hanya sebuah belah ketupat.Mengesampingkan rhombi, jika kedua pasangan dengan panjang sisi yang berlawanan sama, maka segiempatnya masih jajar genjang. Jika
r
tahan, itu sebenarnya persegi panjang, jika tidak, itu hanya jajaran genjang.Mengesampingkan genjang, daftar panjang sisi
l
adalah dari bentuk{a,b,b,a}
atau{a,a,b,b}
untuk beberapaa
danb
, maka segiempat adalah layang-layang. Perhatikan bahwa itu tidak dapat berupa trapesium atau bahkan akan menjadi belah ketupat.Mengesampingkan genjang dan layang-layang, jika segiempat memiliki sepasang sisi paralel, maka itu adalah trapesium. Kami memeriksa ini dengan
Normalize
memasukkan vektor sisi dan memeriksa apakah sepasang vektor yang berlawanan menambah{0,0}
.Mengesampingkan semua hal di atas, jika
1 > 0
(lebih baik), maka segi empat hanyalah segi empat tua biasa.sumber
Python 2 ,
463410408397 byteDisimpan 53 byte dengan menggunakan tuple di baris keenam alih-alih mengindeks ke dalam daftar.
Menyimpan 11 byte dengan menggeser ke integer output 1 hingga 7 alih-alih huruf pertama dari setiap bentuk. Bilangan bulat sesuai sebagai berikut:
Cobalah online!
Ungolfed untuk menunjukkan logika
Ditunjukkan sebagai fungsi, untuk menampilkan output untuk input tes yang berbeda. perhatikan saya mengubah contoh tes "Persegi Panjang" dari yang awalnya disediakan dalam pertanyaan, yang bukan persegi panjang.
Logika bertumpu pada produk titik dan norma (panjang) vektor yang dibentuk oleh sisi segi empat untuk menilai apakah sisi memiliki panjang yang sama, sejajar pada sisi yang berlawanan, atau tegak lurus dengan sisi yang berdekatan.
Cobalah online!
sumber
[(0, 0), (2, 2), (4, 0), (0,-2)]
sebagai layang-layangBatch, 287 byte
Output dalam biner:
1
= Layang-layang,10
= Quadrilateral,11
= Trapezium,100
= Parallelogram,101
= Rhombus,110
= Rectangle,111
= Square. Penjelasan:g, h, i, j
adalah kuadrat dari panjang sisi.p
adalah jumlah pasangan sisi yang berlawanan dengan panjang yang sama,q
membedakan antara jajaran genjang / persegi panjang dan rhobmi / kotak dengan memeriksa apakah pasangan yang berlawanan sebenarnya sama,r
membedakan antara jajaran genjang / rhombi dan persegi / kotak melalui cek tegak lurus,k
memeriksa layang-layang dengan mencari pasangan sisi yang berdekatan yang sama dant
memeriksa trapezium melalui beberapa pemeriksaan sisi paralel.sumber
2=|-.=⍙⍺
. Jelas terlihat kompak jika Anda mengabaikan pekerjaan yang dimasukkan ke dalam penghitungan⍺
(panjang 4 sisi) dan seluruh baris untuk didefinisikan⍙