이 선이 그 정사각형을 통과합니까?


19

아래 그림과 같이 첫 번째 사분면 (양의 x 축, 양의 y 축 및 원점 포함)을 1x1 격자로 나누고 각 격자의 왼쪽 아래 모서리 좌표로 레이블을 지정합니다.

각 그리드에는 경계와 정점이 포함되어 있습니다. 수학 기호를 사용하여 (m, n)으로 표시된 격자는 square를 나타냅니다 {(x,y) | m ≤ x ≤ m+1, n ≤ y ≤ n+1}.


형태 직선 주어 ax+by+c=0정수를 가진 a, b그리고 c및에 의해 표시되는 격자 (m,n)선 격자, 즉 주어진 격자 점이, 라인인지 여부를 통과하여 출력.


a  b  c m n output
1  1  0 0 0 true
1  1  0 1 1 false
1  1  0 0 2 false
1  1 -3 0 1 true
1  1 -3 0 0 false
2 -1  0 1 1 true
2 -1  0 1 0 false
2 -1  0 0 2 true
2 -1  0 0 1 true
2 -1  0 1 2 true
2  0 -1 0 0 true
2  0 -1 0 1 true
2  0 -1 0 2 true
2  0 -1 1 0 false
2  0 -1 1 1 false
0  2 -1 0 0 true
0  2 -1 1 0 true
0  2 -1 2 0 true
0  2 -1 0 1 false
0  2 -1 1 1 false
1  0 -1 0 0 true
1  0 -1 0 1 true
1  0 -1 0 2 true
1  0 -1 1 0 true
1  0 -1 1 1 true

의견에 더 많은 테스트 사례를 제안하십시오.


이것은 입니다. 바이트 단위의 최단 답변이 이깁니다. 표준 허점이 적용됩니다.


1
물론 a와 b가 모두 0이 아니라고 가정 할 수 있습니다. c가 0이면 무한 라인이있을 수 있고 c가 0이 아닌 경우 전혀 라인이 없기 때문입니다.
아웃 골퍼 에릭

[a, b, c](라인) 및 [m, n](사각형) 과 같이 둘 이상의 배열로 입력을받을 수 있습니까 ?
아웃 골퍼 에릭

@EriktheOutgolfer 메타가 아닌 것이 놀랍습니다.
Leaky Nun


답변:


5

파이썬 3, 84 66 바이트

첫번째 골프, 첫번째 실패 (아마도).

직접 입력 대신 함수를 사용하여 18 바이트를 줄인로드 덕분입니다.

def f(a,b,c,m,n):f=-(a*m+c)/b;g=f-a/b;print(min(f,g)<=n<=max(f,g))

온라인으로 사용해보십시오!

설명:

기본적으로 우리는 m과 m + 1에 대한 선 함수의 값을 계산합니다. 만약 n이 그 값들 사이에 있다면리스트는 어느 시점에서 그것을 통과해야합니다. 언어에 여러 정수를 입력하는 더 간단한 방법이 있다면 훨씬 더 좋을 것입니다.



2
PPCG에 오신 것을 환영합니다!
betseg 2016 년

1
이것은 m + 1뿐만 아니라 n + 1을 검사 할 필요가 없습니까?
Neil

3
0으로 나누기 때 b입니다 0.
Olivier Grégoire

또한 Leaky Nun이 강조한 몇 가지 테스트 사례를 통과하지 못했습니다 .
Olivier Grégoire

5

젤리 , 10 바이트

ż‘{Œpæ.ṠE¬

온라인으로 사용해보십시오!

배경

내 이전의 다른 답변과 마찬가지로 이것은 직선이 평면을 두 개의 반 평면으로 나눈다는 사실에 의존합니다. 사각형은 이러한 반평면 중 하나에 포함되거나 (선과 교차하지 않음) 두 반평면 (따라서 그것들을 분리하는 선)과 교차합니다.

작동 원리

ż‘{Œpæ.ṠE¬  Main link. Left argument: [m, n]. Right argument: [a, b, c]

 ‘{         Increment left; yield [m+1, n+1].
ż           Zipwith; yield [[m, m+1], [n, n+1]].
   Œp       Cartesian product; yield [[m, n], [m, n+1], [m+1, n], [m+1, n+1]].
     æ.     Take the dot products with [a, b, c], mapping each [x, y] to ax+by+c.
       Ṡ    Take the signs.
        E   Test the signs for equality.
         ¬  Logical NOT.

4

파이썬 2 , 59 바이트

lambda a,b,c,m,n:min(0,a,b,a+b)<=-a*m-b*n-c<=max(0,a,b,a+b)

온라인으로 사용해보십시오!

점의 어느 쪽이의 부호로 표시되어 있는지 알 수 있습니다 a*x+b*y+c. 네 개의 정점 (m,n),(m,n+1),(m+1,n),(m+1,n+1)이 모두 선의 같은면에 있지 않으면 선은 사각형을 통과합니다 (카운팅 터치) . 이 값을 a*m+b*n+c4 개 모두에 나타나는 상수 를 추출 할 수 있습니다 .

a*m+b*n+c
a*m+b*n+c+a
a*m+b*n+c+b
a*m+b*n+c+a+b

따라서이 네 가지 값이 모두 양수이거나 모두 음수가 아닌 한 선은 사각형을 통과합니다. 따라서 최소값 <=0과 최대 값은 충분 합니다 >=0.

min(a*m+b*n+c,a*m+b*n+c+a,a*m+b*n+c+b,a*m+b*n+c+a+b)<=0<=max(a*m+b*n+c,a*m+b*n+c+a,a*m+b*n+c+b,a*m+b*n+c+a+b)

a*m+b*n+c각 부분 에서 공통 을 빼면 코드가 제공됩니다.

약간 더 긴 접근법은 기호 세트 (+, 0,-)의 길이가 2 이상인지 여부를 확인하는 것입니다.

파이썬 2 , 62 바이트

lambda a,b,c,m,n:len({cmp(a*m+b*n+c,-d)for d in(0,a,b,a+b)})>1

온라인으로 사용해보십시오!


3

Mathematica, 60 55 바이트

Solve[m#+n#2==-#3&&#4<=m<=#4+1&&#5<=n<=#5+1,{m,n}]!={}&

@MartinEnder에 -5 바이트

입력 양식

[a, b, c, m, n]


2
아, 모든 언어에 Solve기능 이 있었으면 좋겠다 .
Erik the Outgolfer

3

배치, 66 바이트

@cmd/cset/a"q=%1*%4+%2*%5+%3,((-(q+%1)*(q+%2)&-q*(q+%1+%2))>>31)+1

설명 : 셀의 네 모퉁이에서 방정식으로 얻은 값을 고려합니다. 선이 셀과 교차하지 않으면 4 개의 값이 모두 동일한 부호를 갖지만 셀과 교차하면 하나 이상의 값이 0이거나 반대 부호가됩니다. 반대쪽 모서리 쌍을 곱하여 비교를 단순화 한 다음 두 값이 모두 양수이면 선이 셀과 교차하지 않습니다. 그런 다음 비트 트위들 링으로 곱셈을 전체 결과로 변환합니다.


1

수학, 50 바이트

-4<Tr@Sign[Tuples@{{#,#+1},{#2,#2+1}}.{##4}+#3]<4&

온라인으로 사용해보십시오!

취하고 m, n, c, a, b순차 입력으로.

설명 : Tuples@{{#,#+1},{#2,#2+1}}사각형의 네 모퉁이의 좌표 목록을 작성한 다음 .{##4}(을 의미하는 {#4, #5}) 내적을 취하고 각 모서리에 대해 +#3계산 ax + by + c을 추가 합니다 x,y. 선이 점을 통과하면 이것은 0입니다. 선이 원점에서 멀면 음수입니다. 선이 원점에 가까워지면 양수이므로이 Sign네 가지 값 중 s를 확인 합니다. 4 개의 값이 모두 1이거나 4가 모두 -1 인 경우에만 선이 정사각형 외부를 통과하므로 합계가 -4와 4 사이에 있는지 확인합니다.

(이 답변은 이 질문에 대한 나의 답변에서 모호하게 영감을 받았습니다 .)



1

파이썬 , 54 바이트

lambda a,b,c,m,n:abs(2*(a*m+b*n+c)+a+b)<=abs(a)+abs(b)

온라인으로 사용해보십시오!

테스트 스크립트에 대해 xnor에게 감사합니다.

작동 원리

선은 m + 1/2 + x , n + 1/2 + y를 통과 하고

a ⋅ ( m + 1/2 + x ) + b ⋅ ( n + 1/2 + y ) + c = 0
⇔ 2⋅ ( am + bn + c ) + a + b = -2⋅ ax − 2⋅ by 입니다.

이것은 일부 가능합니다 | x |, | y | ≤ 1/2 인 경우 | 2⋅ ( am + bn + c ) + a + b | ≤ | | + | b |.


1

자바 (OpenJDK 8) , 71 바이트

(a,b,c,x,y)->(0<a?0:a)+(0<b?0:b)<=(x=-a*x-b*y-c)&x<=(0>a?0:a)+(0>b?0:b)

온라인으로 사용해보십시오!

xnor의 Python 솔루션 포트.

Java의 형태 / 라인 교차로 내장 (108 바이트)을 사용하는 독창적 인 솔루션

(a,b,c,x,y)->b==0?x<=-c/a&-c/a<=x+1:new java.awt.Rectangle(x,y,1,1).intersectsLine(x,c=(c+a*x)/-b,x+1,c-a/b)

온라인으로 사용해보십시오!

크레딧

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.