จำแนก Quadrilaterals | ช่วยฉันด้วยการสอบคณิตศาสตร์!


20

ช่วยด้วย! การสอบคณิตศาสตร์ของฉันกำลังจะมาในไม่ช้าและฉันไม่ได้เรียน! 1ส่วนหนึ่งของการสอบคือการจำแนกรูปสี่เหลี่ยมขนมเปียกปูนเนื่องจากพิกัดจุดยอดของมันซึ่งน่าเสียดายที่ฉันไม่รู้วิธีการทำ 2

ดังนั้นความท้าทายของคุณคือการเขียนโปรแกรมเพื่อทำสิ่งนี้ให้ฉันดังนั้นฉันจึงไม่ล้มเหลว!

ท้าทาย

ให้สี่จุดยอดที่ไม่มีสาม colinear กำหนดประเภทที่เฉพาะเจาะจงมากที่สุดของรูปสี่เหลี่ยมที่เกิดจากจุดยอดทั้งสี่

สิ่งที่ฉันหมายถึงโดย "การจำแนกเฉพาะส่วนใหญ่" คือแม้ว่าสี่เหลี่ยมทั้งหมดเป็นสี่เหลี่ยมถ้ารูปร่างเป็นสี่เหลี่ยมคุณควรระบุว่ามันเป็นสี่เหลี่ยมจัตุรัสและไม่ได้ระบุว่ามันเป็นสี่เหลี่ยม

อินพุต

อินพุตจะได้รับเป็นพิกัดสี่ (x, y) คุณสามารถใช้รายการเหล่านี้เป็นรายการความยาว 4 จากรายการ / tuples ของความยาว 2 หรือคุณสามารถป้อนข้อมูลเป็นรายการของพิกัด x และรายการของพิกัด y ที่เกี่ยวข้อง

ตัวอย่างเช่นถ้ารูปร่างของฉันมีจุดที่จุด(0, 0), (5, 0), (6, 1)และ(1, 1)คุณอาจเลือกที่จะใช้การป้อนข้อมูลทั้งในรูปแบบต่อไปหรือบางสิ่งบางอย่างที่คล้ายกัน:

[(0, 0), (5, 0), (6, 1), (1, 1)]
([0, 5, 6, 1], [0, 0, 1, 1])

คุณอาจสมมติว่ารูปสี่เหลี่ยมสามเหลี่ยมไม่ได้ตัดกันด้วยตนเองและให้คะแนนตามลำดับที่ถูกต้อง (นั่นคือสองจุดติดต่อกันในอินพุตจะถูกเชื่อมต่อโดยส่วนของเส้นตรงในรูปสี่เหลี่ยมสามเหลี่ยม)

เอาท์พุต

คุณจะต้องมีเอาต์พุตที่ไม่ซ้ำกันสำหรับคลาส quadrilaterals แต่ละคลาสต่อไปนี้:

  • สี่เหลี่ยม
  • สี่เหลี่ยมผืนผ้า
  • รูปสี่เหลี่ยมขนมเปียกปูน
  • สี่เหลี่ยมด้านขนาน
  • สี่เหลี่ยมคางหมู / รูปสี่เหลี่ยมคางหมู
  • ว่าว
  • รูปสี่เหลี่ยม

นี่อาจเป็นชื่อที่แน่นอนตัวละครตัวอักษรจำนวนเต็ม ฯลฯ

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • หากภาษาการเขียนโปรแกรมของคุณมีอยู่แล้วภายในที่จะทำงานที่แน่นอนนี้ไม่อนุญาตให้ใช้งานบิวด์อินนั้น
  • บิวด์อินสำหรับค้นหาระยะห่างระหว่างสองจุดได้รับอนุญาต
  • บิวด์อินสำหรับค้นหามุมระหว่างสองบรรทัดได้รับอนุญาต

ณ จุดนี้ถ้าคุณรู้เงื่อนไขทั้งหมดคุณก็พร้อมที่จะเริ่มโปรแกรม! (กรณีทดสอบสิ้นสุดแล้ว)

คำศัพท์

ส่วนนี้มีไว้สำหรับทุกคนที่ต้องการความกระจ่างเกี่ยวกับคำจำกัดความของรูปร่างที่แตกต่างกัน

สี่เหลี่ยม

สี่เหลี่ยมจัตุรัสเป็นสี่เหลี่ยมจัตุรัสถ้าหากว่าด้านทั้งสี่ของมันมีความยาวเท่ากันและทุกคู่ของด้านประชิดนั้นตั้งฉาก (นั่นคือมันเป็นทั้งสี่เหลี่ยมผืนผ้าและสี่เหลี่ยมขนมเปียกปูน)

สี่เหลี่ยมผืนผ้า

รูปสี่เหลี่ยมขนมเปียกปูนเป็นรูปสี่เหลี่ยมผืนผ้าถ้าหากว่าคู่ข้างเคียงทุกคู่ตั้งฉากกัน

รูปสี่เหลี่ยมขนมเปียกปูน

รูปสี่เหลี่ยมขนมเปียกปูนเป็นรูปสี่เหลี่ยมขนมเปียกปูนถ้าหากว่าทั้งสี่ด้านเท่ากัน

สี่เหลี่ยมด้านขนาน

รูปสี่เหลี่ยมขนมเปียกปูนเป็นสี่เหลี่ยมด้านขนานถ้าหากว่าคู่ของด้านตรงข้ามแต่ละคู่ขนานกันและมุมของคู่ที่ตรงกันข้ามนั้นเท่ากัน เงื่อนไขทั้งสองนี้มีความหมายซึ่งกันและกันคุณจึงต้องตรวจสอบเงื่อนไขข้อใดข้อหนึ่ง

สี่เหลี่ยมคางหมู / รูปสี่เหลี่ยมคางหมู

รูปสี่เหลี่ยมขนมเปียกปูนเป็นสี่เหลี่ยมคางหมู / สี่เหลี่ยมคางหมูหากว่ามันมีคู่ขนานอย่างน้อยหนึ่งคู่

ว่าว

รูปสี่เหลี่ยมขนมเปียกปูนเป็นว่าวถ้าสองคู่ที่อยู่ติดกันมีความยาวเท่ากัน นั่นคือสองข้างประชิดเท่ากันและอีกสองเท่ากัน

กรณีทดสอบ

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

ลิงค์ (เครื่องคำนวณกราฟ Desmos)

นี่คือลิงค์ไปสู่การสร้างภาพข้อมูลของกรณีทดสอบแต่ละกรณี

ตาราง
สี่เหลี่ยมผืนผ้า
Rhombus
สี่เหลี่ยมด้านขนาน
สี่เหลี่ยมคางหมู / รูปสี่เหลี่ยมคางหมู
ว่าว
รูปสี่เหลี่ยมขนมเปียกปูน

เกณฑ์การชนะ

ฉันไม่สามารถนำคอมพิวเตอร์มาสอบได้อย่างชัดเจนดังนั้นฉันต้องการให้คุณเขียนรหัสที่สั้นที่สุดเท่าที่จะเป็นไปได้เพื่อที่ฉันจะสามารถจดจำได้ ฉันต้องเขียนลงในระยะขอบและรันโดยใช้ TryItOffline TMเพื่อให้พอดีกับระยะขอบของโปรแกรมที่คุณต้องการให้มีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้!

1แน่นอนฉันทำจริง: P
2แน่นอนฉันทำจริง: P


1
ฉันอาจสามารถช่วยคุณแก้ปัญหามาร์จิ้น
Rohan Jhunjhunwala

@RohanJhunjhunwala ฉันเป็นแฟร์มาต์คนใหม่ (ฉันคิดว่านั่นเป็นคนที่ใช่มั้ย) แต่การอ้างอิง XKCD ที่ดี: P
HyperNeutrino

CSV อนุญาตให้ป้อนข้อมูลได้อย่างไร
tuskiomi

คำสั่งบางส่วนของความจำเพาะคืออะไร?
Peter Taylor

คำตอบ:


6

APL (Dyalog) , 104 89 80 82 81 79 78 ไบต์

⍙←{⍵⍺⍺1⌽⍵}
⎕←(|x){⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}2|1+-⍙(12x←-⍙⎕+.×1 0J1)÷○1

ลองออนไลน์!


Input / Output

ใช้เมทริกซ์ขนาด 4 × 2 เป็นอินพุต

เอาท์พุท

  • 1 1 1 สำหรับสแควร์
  • 1 1 0 สำหรับ Rhombus
  • 1 0 1 สำหรับสี่เหลี่ยมผืนผ้า
  • 1 0 0 สำหรับสี่เหลี่ยมด้านขนาน
  • 1 0 สำหรับว่าว
  • 0 1 สำหรับ Trapezium
  • 0 0 สำหรับรูปสี่เหลี่ยม

ขั้นตอนวิธี

ก่อนอื่นหาความยาวและมุมทั้งสี่ด้านของรูปสี่เหลี่ยมทั้งสี่

หากทั้งคู่ของมุมตรงข้ามเท่ากัน ( OA) แสดงว่ารูปร่างนั้นเป็นสี่เหลี่ยมด้านขนานบางชนิด ตรวจสอบว่าความยาวด้านทั้งหมดเท่ากัน ( AS, ด้านที่อยู่ติดกัน) และถ้าทุกมุมเท่ากัน ( AA)

+--------+----------------+----------------+
|        |       AA       |      ~AA       |
+--------+----------------+----------------+
|   AS   |     Square     |    Rhombus     |
|--------+----------------+----------------+
|  ~AS   |    Rectangle   |  Parallelogram |
+--------+----------------+----------------+

ถ้าไม่OAเช่นนั้น:

  • ตรวจสอบว่ามีด้านที่อยู่ติดกันเท่ากับ 2 คู่และแยกออกจากกันหรือไม่ ( aabbแทนaaab) ถ้าเป็นเช่นนั้นรูปร่างเป็นว่าว

  • ดูว่ามีด้านตรงข้ามขนานกัน 1 คู่หรือไม่ ถ้าเป็นเช่นนั้นรูปร่างเป็นรูปสี่เหลี่ยมคางหมู

  • มิฉะนั้นรูปร่างเป็นรูปสี่เหลี่ยม


รหัส

⍙←{⍵⍺⍺1⌽⍵}กำหนดผู้ประกอบการใหม่ ใน APL, ผู้ประกอบการหมายถึงฟังก์ชั่นขั้นสูง โอเปอเรเตอร์นี้รับ 1 อาร์กิวเมนต์ที่ใช้งานได้ ( ⍺⍺) และส่งคืนฟังก์ชันแบบ monadic ที่:

  1. หมุน ( 1⌽) อาร์กิวเมนต์ ( )
  2. ใช้⍺⍺ระหว่างมันและ

สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับฟังก์ชั่นสเกลาร์เนื่องจากส่วนใหญ่มีการแมปข้ามอาเรย์อาร์กิวเมนต์โดยปริยายทำให้สามารถนำสิ่งเหล่านั้นมาใช้ระหว่างองค์ประกอบแต่ละคู่ที่อยู่ติดกัน ยกตัวอย่างเช่น+⍙1 2 3 4เป็นที่ประเมิน1 2 3 4 + 2 3 4 13 5 7 5


x←-⍙⎕+.×1 0J1 แปลงเมทริกซ์พิกัดอินพุตให้เป็นอาร์เรย์ของจำนวนเชิงซ้อนที่แทนเวกเตอร์ของรูปร่างทั้งสี่ด้าน

  • เมื่ออ้างอิงใช้และส่งคืนอินพุต

  • 1 0J1หมายถึงเวกเตอร์ [1, i] ("เวกเตอร์" ในแง่คณิตศาสตร์และ "i" เป็นสแควร์รูทของ -1) ใน APL a+biจะมีการเขียนจำนวนเชิงซ้อนaJb

  • +.×การคูณเมทริกซ์ ในทางคณิตศาสตร์ผลลัพธ์จะเป็นเมทริกซ์ขนาด 4 × 1 อย่างไรก็ตาม+.×เรียกว่า "ผลิตภัณฑ์ชั้นใน" ใน APL ซึ่งสรุปการคูณเมทริกซ์และผลิตภัณฑ์ด้านในของเวกเตอร์และช่วยให้คุณสามารถทำสิ่งต่าง ๆ เช่น "ทวีคูณ" อาเรย์ 3 มิติพร้อม 2 มิติ ในกรณีนี้เราคูณเมทริกซ์ 4 × 2 กับเวกเตอร์ 2 องค์ประกอบทำให้เกิดเวกเตอร์ 4 องค์ประกอบ (จากจำนวนเชิงซ้อนที่เป็นตัวแทนของจุดยอดที่กำหนด 4)

  • -⍙เป็นการลบแบบคู่ตามต้องการพร้อมพันรอบตามที่ระบุไว้ข้างต้น นี่ทำให้เวกเตอร์ของรูปร่างทั้งสี่ด้าน (เป็นจำนวนเชิงซ้อน) เวกเตอร์เหล่านี้ชี้ไปในทิศทาง "ย้อนกลับ" แต่นั่นไม่สำคัญ

  • x← เก็บที่เป็นตัวแปร x


2|1+-⍙(12○x)÷○1 ค้นหา (การแทนค่า) ของมุมภายนอกที่ 4 จุดยอดของรูปร่าง

  • 12○xค้นหาอาร์กิวเมนต์หลักเป็นเรเดียนของเวกเตอร์ 4 ด้านแต่ละอัน

  • ÷○1หารด้วยπเพื่อให้มุมทำงานได้ง่ายขึ้น ดังนั้นมุมทั้งหมดจะแสดงเป็นมุมฉากหลายมุม

  • -⍙การลบแบบคู่ตามต้องการพร้อมพันรอบตามที่ระบุไว้ข้างต้น นี่ทำให้มุมภายนอกทั้ง 4 มุม

  • 2|1+ อาร์กิวเมนต์หลักถูกต่อยอด (-1,1] และการลบแบบคู่ทำให้ช่วง (-2,2] นี่เป็นสิ่งที่ไม่ดีเนื่องจากมุมเดียวกันมีการแทน 2 แบบที่ต่างกันโดยการทำ "เพิ่ม 1 mod 2" มุมจะเป็นอีกครั้ง ต่อยอดที่ (0,2] ถึงแม้ว่าทุกมุมมีมากกว่า 1 เท่าที่ควรจะเป็น


|xค้นหาขนาดของเวกเตอร์ 4 ด้านแต่ละอัน


{⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}กำหนดและใช้ฟังก์ชั่นที่มีอาร์เรย์ของ 4 มุมด้านนอกเป็นอาร์กิวเมนต์ที่เหมาะสมและอาเรย์ 4 ความยาวด้านเป็นอาร์กิวเมนต์ที่เหมาะสม

  • ฟังก์ชั่นมีการแสดงออกที่เตรียมพร้อม ในกรณีนี้⍵≡2⌽⍵คือยาม
  • หากยามประเมิน1เป็นนิพจน์ถัดไป≡⍙¨0⍺⍵จะถูกดำเนินการและส่งคืนค่า
  • ถ้ายามประเมิน0เป็นนิพจน์นั้นจะถูกข้ามไปและอีกหนึ่งนิพจน์นั้น2 4=...=⍙⍺)จะถูกดำเนินการแทน

⍵≡2⌽⍵ ตรวจสอบว่าทั้งคู่ของมุมที่ตรงกันข้ามกันเท่ากันหรือไม่

  • 2⌽⍵ หมุนอาร์เรย์มุมด้วย 2 ตำแหน่ง
  • ⍵≡ตรวจสอบว่าเป็นเช่นเดียวกับตัวเอง

≡⍙¨0⍺⍵ ส่งคืนค่าที่ไม่ซ้ำสำหรับรูปร่างแต่ละรูปสี่เหลี่ยมด้านขนาน

  • 0⍺⍵คืออาร์เรย์ 3 องค์ประกอบของสเกลา0ที่ความยาวด้านอาร์เรย์และมุมอาร์เรย์
  • ≡⍙¨ดำเนินการ≡⍙สำหรับแต่ละองค์ประกอบเหล่านั้น
  • ≡⍙ตรวจสอบว่าค่าทั้งหมดของอาร์เรย์มีค่าเท่ากันหรือไม่โดยตรวจสอบว่าการหมุนด้วย 1 ให้อาร์เรย์เหมือนกันหรือไม่ สเกลาไม่หมุนเพื่อให้ผลตอบแทน≡⍙0 1ตามที่ระบุไว้ข้างต้น≡⍙⍺ตรวจสอบสี่เหลี่ยมขนมเปียกปูนและ≡⍙⍵ตรวจสอบสี่เหลี่ยม

2 4=+/1=2|+⍙↑⍵(=⍙⍺)ส่งคืนค่าที่ไม่ซ้ำสำหรับรูปร่างที่ไม่ใช่รูปสี่เหลี่ยมด้านขนานแต่ละรูปแบบ นี่คือความสำเร็จโดย intertwining ตรวจสอบว่าวและสี่เหลี่ยมคางหมู


2=+/1=2|+⍙⍵ ตรวจสอบสี่เหลี่ยมคางหมู

  • +⍙⍵ให้ผลรวมมุมที่อยู่ติดกัน มุมภายในของเส้นขนานรวมกับมุมตรงดังนั้นมุมภายนอกของด้านขนานของรูปสี่เหลี่ยม ดังนั้นด้านคู่ขนานแต่ละคู่ควรนำไปสู่ผลรวมของมุมสอง1หรือ-1ในผลบวกมุม

  • 1=2|อย่างไรก็ตามในมุมที่1 มากกว่าสิ่งที่พวกเขาควรจะเป็นดังนั้นมุมจริงรวมไปหรือ1 3สามารถตรวจสอบได้โดย "mod 2 เท่ากับ 1"

  • +/ผลรวมอาร์เรย์ นี้จะช่วยให้การนับผลรวมมุมที่อยู่ติดกันซึ่งเป็นหรือ13

  • 2= ตรวจสอบว่าเท่ากับ 2. (เช่นถ้ามีด้านหนึ่งคู่ขนาน)


4=+/1=2|+⍙(=⍙⍺) ตรวจสอบว่าว

  • (=⍙⍺)ให้อาเรย์ระบุด้านข้างที่เท่ากัน ซึ่งแตกต่าง, =การทำงานขององค์ประกอบที่ชาญฉลาด ดังนั้นนี่คืออาร์เรย์ 4 องค์ประกอบที่มี1s โดยที่ความยาวของด้านนั้นเท่ากับของด้าน "ถัดไป"

  • +⍙ ผลรวมคู่กับห่อรอบ

  • 1=2|เนื่องจาก(=⍙⍺)จะช่วยให้อาร์เรย์แบบบูล (หนึ่งมีเพียง0และ1s), ค่าที่เป็นไปเพียงของจำนวนเงินเอาคู่มี0, และ1 2ดังนั้นเป็นเช่นเดียวกับเพียง1=2|1=

  • +/ผลรวมอาร์เรย์ นี่จะนับจำนวนผลรวมเป็น1คู่

  • 4=ตรวจสอบว่าที่เท่ากับ 4. วิธีเดียวที่เกิดขึ้นคือถ้า(=⍙⍺)เป็นหรือ1 0 1 0 0 1 0 1ตามที่ระบุไว้ข้างต้นนี่หมายความว่ารูปร่างเป็นว่าว


2 4=+/1=2|+⍙↑⍵(=⍙⍺) รวมการตรวจสอบข้างต้นเข้าด้วยกัน

  • ⍵(=⍙⍺)เป็นอาร์เรย์ซ้อนกัน 2 องค์ประกอบของอาร์เรย์และอาร์เรย์(=⍙⍺)

  • ส่งเสริมอาร์เรย์ที่ซ้อนกันเป็นเมทริกซ์ที่เหมาะสม เนื่องจาก⍵(=⍙⍺)เป็นอาร์เรย์ 2 องค์ประกอบของอาร์เรย์ 4 องค์ประกอบผลลัพธ์จึงเป็นเมทริกซ์ 2 × 4

  • +⍙เนื่องจาก(และโดยการขยาย) หมุนแกนสุดท้าย (แนวนอน) +⍙ไปที่เมทริกซ์จะเหมือนกับการใช้+⍙กับแต่ละแถวทีละรายการ

  • 1=2|ทั้งกาก / mod ( |) และ equals ( =) ทำงานบนพื้นฐานขององค์ประกอบต่อแม้กระทั่งเมทริกซ์

  • +/โดยค่าเริ่มต้นลด ( /) ทำงานตามแกน (แนวนอน) สุดท้าย ดังนั้น+/ผลรวมตามแถวและเปลี่ยนเมทริกซ์ 2x4 เป็นอาร์เรย์แบบ 2 องค์ประกอบ

  • 2 4=ตั้งแต่=ทำงานต่อองค์ประกอบการตรวจสอบว่าวและเงื่อนไขสี่เหลี่ยมคางหมูพร้อมกัน


3

Mathematica, 195 ไบต์

Which[s=Differences@{##,#};l=Norm/@s;r=#.#2==#2.#3==0&@@s;Equal@@l,If[r,1,2],#==#3&&#2==#4&@@l,If[r,3,4],MatchQ[l,{a_,b_,b_,a_}|{a_,a_,b_,b_}],5,#+#3=={0,0}||#2+#4=={0,0}&@@Normalize/@s,6,1>0,7]&

ด้วยช่องว่าง:

Which[
    s = Differences @ {##,#};
    l = Norm /@ s;
    r = #.#2 == #2.#3 == 0& @@ s;

    Equal @@ l, If[r, 1, 2],
    # == #3 && #2 == #4& @@ l, If[r, 3, 4],
    MatchQ[l, {a_,b_,b_,a_}|{a_,a_,b_,b_}], 5,
    #+#3 == {0,0} || #2+#4 == {0,0}& @@ Normalize /@ s, 6,
    1 > 0, 7
]&

ขาออก1สำหรับสี่เหลี่ยม2สำหรับ rhombi, 3สำหรับสี่เหลี่ยม4สำหรับสี่เหลี่ยมด้านขนาน5สำหรับว่าว6สำหรับ trapezoids และ7สำหรับสิ่งอื่น ฉันโพสต์ลิงค์ TIO แต่เห็นได้ชัดว่าไม่ได้ทำงานใน Mathics

ถ้าสี่จุดP, Q, RและSจากนั้นก็{##,#}คือ{P,Q,R,S,P}เพื่อให้sเป็นรายการของเวกเตอร์ด้านข้าง{Q-P,R-Q,S-R,P-S}, lคือความยาวของเวกเตอร์เหล่านั้นและrเป็นเงื่อนไขที่มุมระหว่างQ-PและR-Qเช่นเดียวกับมุมระหว่างR-QและS-Rมีทั้ง90องศา

ดังนั้นถ้าทุกด้านยาวเท่ากันดังนั้นรูปสี่เหลี่ยมขนมเปียกปูนเป็นรูปสี่เหลี่ยมขนมเปียกปูน ถ้าrเก็บไว้จริง ๆ แล้วมันคือสแควร์มิฉะนั้นมันก็เป็นแค่รูปสี่เหลี่ยมขนมเปียกปูนธรรมดา

ตัดรูปสี่เหลี่ยมขนมเปียกปูนออกไปถ้าทั้งคู่มีความยาวด้านตรงข้ามเท่ากันดังนั้นรูปสี่เหลี่ยมด้านขนานก็ยังเป็นรูปสี่เหลี่ยมด้านขนาน ถ้าrเก็บไว้จริง ๆ แล้วมันเป็นสี่เหลี่ยมผืนผ้ามิฉะนั้นมันก็แค่สี่เหลี่ยมด้านขนานธรรมดา

การพิจารณาคดีออกสี่เหลี่ยมด้านขนานรายการของความยาวด้านข้างlเป็นรูปแบบ{a,b,b,a}หรือ{a,a,b,b}สำหรับบางคนaและbแล้วรูปสี่เหลี่ยมเป็นว่าว โปรดทราบว่ามันไม่สามารถเป็นรูปสี่เหลี่ยมคางหมูเพิ่มเติมได้หรือในความเป็นจริงจะเป็นรูปสี่เหลี่ยมขนมเปียกปูน

พิจารณาสี่เหลี่ยมด้านขนานและว่าวถ้ารูปสี่เหลี่ยมขนมเปียกปูนมีด้านคู่ขนานมันก็เป็นรูปสี่เหลี่ยมคางหมู เราตรวจสอบสิ่งนี้โดยNormalizeการเพิ่มเวกเตอร์ด้านข้างและตรวจสอบว่ามีเวกเตอร์ตรงข้ามเพิ่มเข้ามา{0,0}หรือไม่

พิจารณาจากทั้งหมดข้างต้นถ้า1 > 0(ดีกว่า) แล้วรูปสี่เหลี่ยมนั้นจะเป็นรูปสี่เหลี่ยมขนมเปียกปูนเก่าธรรมดา


1

Python 2 , 463 410 408 397 ไบต์

บันทึก 53 ไบต์โดยใช้ tuple ในบรรทัดที่หกแทนการจัดทำดัชนีลงในรายการ

บันทึก 11 ไบต์โดยเลื่อนไปที่จำนวนเต็ม 1 ถึง 7 แทนตัวอักษรตัวแรกของแต่ละรูปร่าง จำนวนเต็มสอดคล้องดังนี้:

  1. สี่เหลี่ยม
  2. สี่เหลี่ยมผืนผ้า
  3. รูปสี่เหลี่ยมขนมเปียกปูน
  4. สี่เหลี่ยมด้านขนาน
  5. รูปสี่เหลี่ยมคางหมู
  6. ว่าว
  7. รูปสี่เหลี่ยม
from numpy import *;D=dot
from numpy.linalg import *;N=norm
def P(a,b):x=D(a,b);y=N(a)*N(b);return x==y or x==-y
def Q(a,b):return int(N(a)==N(b))
L=input()
a,b,c,d=tuple([(L[i][0]-L[(i+1)%4][0],L[i][1]-L[(i+1)%4][1]) for i in range(4)])
g=7
e=Q(a,c)+Q(b,d)
if e==2:
 g=(1if D(a,b)==0 else 3) if Q(a,b) else 2 if D(a,b)==0 else 4
elif P(a,c) or P(b,d):
 g = 5
elif Q(a,b) or Q(b,c):
 g = 6
print g

ลองออนไลน์!

Ungolfed เพื่อแสดงตรรกะ

แสดงเป็นฟังก์ชันเพื่อแสดงเอาต์พุตสำหรับอินพุตการทดสอบอื่น หมายเหตุฉันเปลี่ยนตัวอย่างการทดสอบ "Rectangle" จากตัวอย่างที่ให้ไว้ในคำถามซึ่งไม่ใช่รูปสี่เหลี่ยมผืนผ้า

ตรรกะวางอยู่บนจุดของผลิตภัณฑ์และบรรทัดฐาน (ความยาว) ของเวกเตอร์ที่เกิดขึ้นจากด้านข้างของรูปสี่เหลี่ยมเพื่อประเมินว่าด้านข้างมีความยาวเท่ากันขนานบนฝั่งตรงข้ามหรือตั้งฉากกับด้านข้าง

def S(va, vb):
    return (va[0]-vb[0], va[1]-vb[1])
def dot(sa,sb):      # Eventually replaced with numpy.dot
    return(sa[0]*sb[0]+sa[1]*sb[1])
def norm(s):         # Eventually replaced by numpy.linalg.norm
    return (s[0]**2+s[1]**2)**.5
def isperp(a,b):     # Test if lines/vectors are perpendicular
    return dot(a,b)==0
def ispar(a,b):      # Test if lines/vectors are parallel
    x = dot(a,b)
    y = norm(a)*norm(b)
    return x == y or x == -y
def iseq(a,b):       # Test if lines/vectors are equal in length
    return norm(a)==norm(b)
   
def f(L):
    #Define the four sides
    s = []
    for i in range(4):
        s.append(S(L[i],L[(i+1)%4]))  # I refer often so shorter names may eventually

    guess = 'Q'
    eqsides = 0           # These 6 lines eventually golfed using integer arithmetic by returning an int from iseq()
    if iseq(s[0], s[2]):
        eqsides += 1
    if iseq(s[1],s[3]):
        eqsides += 1
    if eqsides == 2:
    # Opposite sides are equal, so square, rhombus, rectangle or parallelogram
        if iseq(s[0],s[1]):       #Equal adjacent sides, so square or rhombus
            guess='S' if isperp(s[0], s[1]) else 'H'
        else:                     # rectangle or Parallelogram
            guess='R' if isperp(s[0], s[1]) else 'P'
    elif ispar(s[0],s[2]) or ispar(s[1],s[3]):
        guess = 'T'
    elif iseq(s[0],s[1]) or iseq(s[1],s[2]):
        guess = 'K'
    return guess
    

#test suite:
print f([(0, 0), (1, 0), (1, 1), (0, 1)]) # -> square
print f([(0, 0), (1, 1), (-1, 3), (-2, 2)]) # -> rectangle
print f([(0, 0), (5, 0), (8, 4), (3, 4)]) #  -> rhombus
print f([(0, 0), (5, 0), (6, 1), (1, 1)]) #  -> parallelogram
print f([(0, 0), (4, 0), (3, 1), (1, 1)]) # -> trapezoid/trapezium
print f([(0, 0), (1, 1), (0, 3), (-1, 1)]) #-> kite  
print f([(0, 0), (2, 0), (4, 4), (0, 1)]) #-> quadrilateral

ลองออนไลน์!


1
จำแนก[(0, 0), (2, 2), (4, 0), (0,-2)]เป็นว่าว
TwiNight

จะใช้งานได้ไหม repl.it/JRzE
Zacharý

@TwiNight ขอบคุณ ไม่เห็นความเป็นไปได้นี้ ปัญหาคือว่าอัลกอริทึมเริ่มต้นของฉันจะตรวจสอบเพื่อดูว่ามีด้านยาวเท่ากันหนึ่งคู่หรือไม่ ดังตัวอย่างที่แสดงว่าไม่เพียงพอ ฉันต้องตรวจสอบคู่ที่ตรงกันหนึ่งคู่แล้วตรวจสอบว่าคู่ตรงข้ามนั้นยาวเท่ากันหรือไม่ ไม่ว่างที่จะใช้สิ่งนั้น
CCB60

0

แบตช์ 287 ไบต์

@set/aa=%3-%1,b=%4-%2,c=%5-%1,d=%6-%2,e=%7-%1,f=%8-%2,g=a*a+b*b,h=(h=c-a)*h+(h=d-b)*h,i=(i=c-e)*i+(i=d-f)*i,j=e*e+f*f,p=!(i-g)+!(j-h),q=!(h-g),r=!(a*e+b*f),k=q+!(j-i)^|!(j-g)+!(h-i),t=!(a*(f-d)-b*(e-c))+!((c-a)*f-(d-b)*e)
@if %p%==2 (echo 1%r%%q%)else if %k%==2 (echo 1)else (echo 1%t%)

เอาต์พุตในไบนารี: 1= Kite, 10= Quadrilateral, 11= Trapezium, 100= Parallelogram, 101= Rhombus, 110= สี่เหลี่ยมผืนผ้า, 111= Square คำอธิบาย: g, h, i, jเป็นกำลังสองของความยาวด้านข้าง pคือจำนวนคู่ของฝ่ายตรงข้ามที่มีความยาวเดียวกันqแตกต่างระหว่างสี่เหลี่ยมด้านขนาน / รูปสี่เหลี่ยมและ rhobmi / สี่เหลี่ยมโดยการตรวจสอบไม่ว่าจะเป็นคู่ตรงข้ามในความเป็นจริงเท่ากันrแตกต่างระหว่างสี่เหลี่ยมด้านขนาน / rhombi และสี่เหลี่ยม / สี่เหลี่ยมผ่านการตรวจสอบ perpendicularity, kการตรวจสอบหา ว่าวโดยการค้นหาคู่ของด้านประชิดเท่ากันและtตรวจหาสี่เหลี่ยมคางหมูผ่านการตรวจสอบคู่ขนาน



@TwiNight Bah การตรวจสอบว่าวนั้นน่าอึดอัดใจจริงๆ
Neil

ใช่ฉันโชคดีที่ได้พบกับวิธีที่กะทัดรัดในการทำมัน
TwiNight

@TwiNight ฉันจะใช้คำของคุณมัน; ฉันไม่สามารถอ่าน APL ได้อย่างสมบูรณ์
Neil

2=|-.=⍙⍺ส่วนที่ผมตรวจสอบว่าวเป็น แน่นอนว่ามีขนาดกะทัดรัดหากคุณไม่สนใจงานที่นำมาคำนวณ(ความยาว 4 ด้าน) และทั้งบรรทัดเพื่อกำหนด
TwiNight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.