이 도전은 최근 간단한 게임을 위해 작성해야했던 실제 충돌 감지를 기반으로합니다.
두 개의 객체가 주어지면 두 객체 가 충돌하는지 (즉, 교차하는지)에 따라 참 또는 거짓 값을 반환하는 프로그램이나 함수를 작성하십시오 .
세 가지 유형의 객체를 지원해야합니다.
- 선분 : 4로 표시되는 플로트 즉 두 종점을 나타내는 (X 1 , Y 1 ) 및 (X 2 , Y 2 ) . 끝 점이 동일하지 않다고 가정 할 수 있습니다 (따라서 선분이 축퇴되지 않음).
- 디스크 : 즉 채워진 원은 3 개의 플로트로 표시되며, 2 개는 중심 (x, y )에 대해 2 개, 반경 ( r )에 대해 1 (양)입니다 .
- 공동 : 이것들은 디스크의 보완입니다. 즉, 캐비티는 중심과 반경으로 지정된 원형 영역을 제외한 모든 2D 공간을 채 웁니다 .
프로그램이나 함수는 식별 정수 (선택한 정수)와 3 개 또는 4 개의 부동 소수점 형식으로 이러한 두 개의 객체를받습니다. STDIN, ARGV 또는 함수 인수를 통해 입력을받을 수 있습니다. 사전 처리되지 않은 편리한 형식 (예 : 8-10 개의 개별 숫자, 쉼표로 구분 된 두 개의 값 목록 또는 두 개의 목록)으로 입력을 나타낼 수 있습니다. 결과는 STDOUT에 리턴되거나 기록 될 수 있습니다.
객체가 최소 10 -10 길이 단위 떨어져 있거나 그와 많이 교차 한다고 가정 할 수 있으므로 부동 소수점 유형의 제한에 대해 걱정할 필요가 없습니다.
이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.
테스트 사례
목록 기반 입력 형식을 사용하여 0
, 디스크 1
및 캐비티가있는 선 세그먼트를 2
표시하면 다음과 같은 결과가 모두 출력됩니다.
[0,[0,0],[2,2]], [0,[1,0],[2,4]] # Crossing line segments
[0,[0.5,0],[-0.5,0]], [1,[0,0],1] # Line contained in a disc
[0,[0.5,0],[1.5,0]], [1,[0,0],1] # Line partially within disc
[0,[-1.5,0.5],[1.5,0.5]], [1,[0,0],1] # Line cutting through disc
[0,[0.5,2],[-0.5,2]], [2,[0,0],1] # Line outside cavity
[0,[0.5,0],[1.5,0]], [2,[0,0],1] # Line partially outside cavity
[0,[-1.5,0.5],[1.5,0.5]], [2,[0,0],1] # Line cutting through cavity
[1,[0,0],1], [1,[0,0],2] # Disc contained within another
[1,[0,0],1.1], [1,[2,0],1.1] # Intersecting discs
[1,[3,0],1], [2,[0,0],1] # Disc outside cavity
[1,[1,0],0.1], [2,[0,0],1] # Disc partially outside cavity
[1,[0,0],2], [2,[0,0],1] # Disc encircling cavity
[2,[0,0],1], [2,[0,0],1] # Any two cavities intersect
[2,[-1,0],1], [2,[1,0],1] # Any two cavities intersect
다음은 모두 잘못된 결과를 초래합니다.
[0,[0,0],[1,0]], [0,[0,1],[1,1]] # Parallel lines
[0,[-2,0],[-1,0]], [0,[1,0],[2,0]] # Collinear non-overlapping lines
[0,[0,0],[2,0]], [0,[1,1],[1,2]] # Intersection outside one segment
[0,[0,0],[1,0]], [0,[2,1],[2,3]] # Intersection outside both segments
[0,[-1,2],[1,2]], [1,[0,0],1] # Line passes outside disc
[0,[2,0],[3,0]], [1,[0,0],1] # Circle lies outside segment
[0,[-0.5,0.5],[0.5,-0.5]], [2,[0,0],1] # Line inside cavity
[1,[-1,0],1], [1,[1,1],0.5] # Non-intersecting circles
[1,[0.5,0],0.1], [2,[0,0],1] # Circle contained within cavity
[0,[-2,0],[-1,0]], [0,[1,0],[2,0]]