다각형이 볼록한지 확인


21

입력 다각형이 볼록 한지 확인하는 프로그램을 작성하십시오 . 다각형은 N을 포함하는 한 줄 , 꼭짓점 수, 그런 다음 N XY 각각의 꼭지점의 좌표. 정점은 임의의 정점에서 시작하여 시계 방향으로 나열됩니다.

예 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

xy 는 정수 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)-오목한 정점을 찾는 데 끝에서 시작으로 래핑해야하는 경우를 테스트합니다.
피터 테일러

이 질문은 노화되고 있지만 ... 두 개의 정렬 된 세그먼트가있는 오목한 예를 추가하는 것을 고려하십시오 (예 : 예 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)3STDIN을 EOF로 읽으십시오. (생각합니다)
  • 0&".;._2 이런 종류의 입력을 파싱하는 좋은 관용구입니다.
  • j./"1}. 첫 번째 입력 라인 (N 0)을 제거하고 쌍을 콤플렉스로 변환합니다.
  • (,2&{.) 목록의 끝에 처음 두 점을 붙입니다.
  • 3(f)\ 길이 3의 슬라이딩 윈도우에 f를 적용합니다 (각도에 대해 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

파이썬-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
젠장, 그 조각 ...
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.