ตรวจสอบว่ารูปหลายเหลี่ยมนูนออกมาหรือไม่


21

เขียนโปรแกรมเพื่อตรวจสอบว่ารูปหลายเหลี่ยมอินพุทนั้นนูนหรือไม่ รูปหลายเหลี่ยมถูกระบุด้วยหนึ่งบรรทัดที่มีNจำนวนของจุดยอดจากนั้นเส้นNที่มีพิกัดxและyของแต่ละจุดยอด จุดยอดจะถูกแสดงตามเข็มนาฬิกาเริ่มต้นจากจุดสุดยอดโดยพลการ

ตัวอย่างที่ 1

อินพุต

4
0 0
0 1
1 1
1 0

เอาท์พุต

convex

ตัวอย่างที่ 2

อินพุต

4
0 0
2 1
1 0
2 -1

เอาท์พุต

concave

ตัวอย่างที่ 3

อินพุต

8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0

เอาท์พุต

convex

xและy ที่เป็นจำนวนเต็มN <1000และ| x |, | Y | <1000 คุณอาจสมมติว่ารูปหลายเหลี่ยมที่ป้อนเข้านั้นง่าย (ไม่มีขอบใดข้ามเพียง 2 ขอบเท่านั้นที่สัมผัสแต่ละจุดยอด) โปรแกรมที่สั้นที่สุดชนะ


"ง่าย" ไม่รวม "ขอบที่ต่อเนื่องกันเป็นแบบไม่มีขอบ" อีกสองกรณีทดสอบเพิ่มเติม: (0,0) (0,2) (2,2) (2,0) (1,1); และ (1,1) (0,0) (0,2) (2,2) (2,0) - เพื่อทดสอบกรณีที่การค้นหาจุดสุดยอดเว้าต้องห่อจากปลายกลับไปที่จุดเริ่มต้น
Peter Taylor

คำถามนี้แก่แล้ว แต่ ... ลองเพิ่มตัวอย่างเว้าที่มีสองส่วนที่จัดชิดเช่นการแก้ไขตัวอย่าง 2: (0,0), (2,1), (4,2), (1,0) ( 2 -1) ฉันนำสิ่งนี้ขึ้นมาเพราะฉันรู้รอบตัวอย่างที่ 3 โดยไม่รู้ตัว
Jesse Millikan

คำตอบ:


4

J, 105

echo>('concave';'convex'){~1=#=(o.1)([:>-.~)(o.2)|3([:-/12 o.-@-/@}.,-/@}:)\(,2&{.)j./"1}.0&".;._2(1!:1)3

ผ่านการทดสอบทั้งสามแบบด้านบน

แก้ไข: (111-> 115) จัดการจุดร่วมเชิงเส้นโดยกำจัดมุมของ pi ได้รับอักขระไม่กี่ที่อื่น

แก้ไข: (115-> 105) ใบ้น้อย

คำอธิบายสำหรับ J-บกพร่อง:

  • (1!:1)3อ่าน STDIN ถึง EOF (ฉันคิด.)
  • 0&".;._2 เป็นสำนวนที่ดีสำหรับการแยกวิเคราะห์อินพุตนี้
  • j./"1}. lop off บรรทัดแรกของอินพุต (N 0) และแปลงคู่เป็นคอมเพล็กซ์
  • (,2&{.) ยึดสองจุดแรกเข้าที่ท้ายรายการ
  • 3(f)\ ใช้ f กับหน้าต่างเลื่อนที่มีความยาว 3 (3 คะแนนสำหรับมุม)
  • [:-/12 o.-@-/@}.,-/@}: เป็นคำกริยาที่แปลงแต่ละ 3 คะแนนเป็นมุมระหว่าง -pi และ pi
    • -@-/@}.,-/@}:ผลิต (p1 - p2), (p3 - p2) (จำได้ว่าสิ่งเหล่านี้ซับซ้อน)
    • 12 o. ให้มุมสำหรับแต่ละคอมเพล็กซ์
    • [:-/(...) ให้ความแตกต่างของมุมทั้งสอง
  • (o.1)([:>-.~)(o.2)| mod 2 pi, กำจัดมุมของ pi (ส่วนตรง) และเปรียบเทียบกับ pi (มากกว่า, น้อยกว่า, ไม่สำคัญยกเว้นว่าจุดที่ควรจะได้รับบาดเจ็บในทิศทางเดียว)
  • 1=#= ถ้าการเปรียบเทียบทั้งหมดเหล่านั้นส่งผลให้ 1 หรือ 0 (พร้อมการจำแนกตัวเองดูเหมือนจะเป็นใบ้)
  • echo>('concave';'convex'){~ พิมพ์นูน

3

Python - 149 ตัวอักษร

p=[map(int,raw_input().split())for i in[0]*input()]*2
print'ccoonncvaevxe'[all((a-c)*(d-f)<=(b-d)*(c-e)for(a,b),(c,d),(e,f)in zip(p,p[1:],p[2:]))::2]

ฉันคิดว่าคุณต้องการ <= ดูตัวอย่างที่ 3 ที่ฉันเพิ่งเพิ่ม
Keith Randall

1
dammn ชิ้นที่ ...
st0le

2

ทับทิม 1.9, 147 133 130 124 123

gets
puts ($<.map{|s|s.split.map &:to_i}*2).each_cons(3).any?{|(a,b),(c,d),(e,f)|(e-c)*(d-b)<(d-f)*(a-c)}?:concave: :convex

1

สกาล่า: 297 ตัวอักษร

object C{class D(val x:Int,val y:Int)
def k(a:D,b:D,c:D)=(b.y-a.y)*(c.x-b.x)>=(c.y-b.y)*(b.x-a.x) 
def main(a:Array[String]){val s=new java.util.Scanner(System.in)
def n=s.nextInt
val d=for(x<-1 to n)yield{new D(n,n)}print((true/:(d:+d.head).sliding(3,1).toList)((b,t)=>b&&k(t(0),t(1),t(2))))}}

1
คุณสามารถโกนได้สามตัวโดยใช้def main(a:...แทนdef main(args:...แทน
Gareth

ใช่ฉันสังเกตเห็นตัวเอง แต่ 299 ถึง 149 ไม่ได้พาฉันไปในพื้นที่ของคนอื่น บางทีถ้าฉันพบการปรับปรุงอื่น ๆ - อ่ามีหนึ่ง: n เป็นชื่อฟังก์ชั่น (ถัดไป) และชื่อตัวแปร
ผู้ใช้ที่ไม่รู้จัก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.