이 사각형이 겹치나요?


11

두 정사각형의 왼쪽 상단 모서리 좌표와 측면 길이를 고려하여 정사각형이 겹치는 지 확인합니다. 정사각형에는 맨 위 줄과 왼쪽 줄이 포함되지만 맨 아래 줄과 오른쪽 줄은 포함되지 않습니다. 즉, 포인트는 (a,b)측면 길이를 가진 정방형 내부에 k그 시작의 (x,y)경우에만, x <= a < x+k그리고 y <= b < y+k. 측면 길이가 0 인 정사각형은 변성되어 여기에서 고려되지 않으므로 k양수입니다.

평소와 같이 모든 표준 규칙이 적용됩니다. 입력 및 출력은 사람이 읽을 수 있고 사전 계산이없는 한 편리한 형태 일 수 있습니다. 사용하는 입력 형식을 지정하십시오. 정사각형이 겹치거나 틀리면 코드가 6 개의 숫자를 취하고 사실을 출력해야합니다.

테스트 사례

x1 y1 k1  x2 y2 k2  overlap?
 1  1  1   0  1  1  false
 0  0  3   1  1  1  true
 1  1  1   0  0  3  true
 0  0  3   2  1  2  true
 0  0  2   1  1  2  true
 1  1  2   0  0  2  true
 0  1  2   1  0  2  true
 1  0  2   0  1  2  true
 2  0  2   0  2  2  false
 1  0  3   0  1  1  false
 0  2  3   0  0  2  false

모든 입력은 음이 아닌 정수입니다. 즉, 많은 또는 대부분의 솔루션이 음수 및 부동 소수점을 처리 할 수있을 것으로 기대합니다.


답변:


22

파이썬, 33 바이트

lambda x,y,k,X,Y,K:k>X-x>-K<Y-y<k

파이썬은 반대 방향을 가리키는 경우에도 불평등의 사슬을 지원합니다.

간격을 X 좌표 [x,x+k)[X,X+K)한 어느 하나의 각 구간의 좌측 종단점이 다른 구간의 우측 종단점 왼쪽임을 의미 다른 오른쪽으로 완전히 그대로 중첩된다.

x<X+K
X<x+k

공동 불평등으로 결합 될 수있다 -K<X-x<k. y 좌표에 대해 동일하게 작성하고 접합 -K하면 표현이됩니다.

k>X-x>-K<Y-y<k

10

MATL, 14 11 10 5 4 바이트

tP->

이 솔루션은 두 개의 배열 형태로 입력을 허용합니다.

  1. 모서리의 좌표를 포함하는 2 x 2 행렬 [x1, y1; x2, y2]
  2. 정사각형 차원을 포함하는 2 x 1 배열 [k2; k1]

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

모든 테스트 사례를 실행하기 위해 약간 수정 된 버전

설명

        % Implicitly grab the first input
t       % Duplicate the input
P       % Flip along the first dimension (columns)
-       % Subtract the two to yield [x1-x2, y1-y2; x2-x1, y2-y1]
        % Implicitly grab the second input
>       % Compare with [k2, k1] (automatically broadcasts)
        % Implicitly display the truthy/falsey result

5

MATLAB, 36 21 바이트

@(a,b)a-flip(a)<[b,b]

로 평가할 수있는 익명 함수를 만듭니다 ans(a,b). 다음 형식의 두 입력을 허용합니다.

  1. 각 사각형의 모서리를 행으로 포함하는 2 x 2 행렬 : [x1, y1; x2, y2].
  2. 두 정사각형의 크기를 포함하는 2 x 1 배열 : [k2; k1]

모든 테스트 사례는 여기에 있습니다 .

설명

다음은 주석이 달린 언 골프 솔루션입니다.

%// Example input
a = [1 1;
     0 1];

b = [1; 1];

%// Flip a along the first dimension and subtract from a to yield:
%// 
%// [x1-x2   y1-y2]
%// [x2-x1   y2-y1]
d = a - flip(a);

%// Compare this matrix element-wise with two horizontally concatenated copies 
%// of the second input [k2; k1]
result = d < [b,b];

%// Truthy values have all ones in the result and falsey values have at
%// least one 0 in the result.

MATLAB을 모르므로 설명을 추가해도 되겠습니까?
El'endia Starman

@ El'endiaStarman 설명을 추가했습니다.
Suever

4

자바 스크립트 (ES6), 38 바이트

(a,b,c,d,e,f)=>d-a<c&a-d<f&e-b<c&b-e<f

경우 D - ≥의 (C)는 다음 두 번째 사각형 제의 오른쪽에있다. 마찬가지로 다른 조건은 왼쪽, 아래 또는 위가 아닌지 확인합니다.


3

젤리 , 8 바이트

Ṫṗ2+µ€f/

입력은 중첩 된 목록 [[x1, y1, k1], [x2, y2, k2]] 이며 출력은 두 정사각형에 공통적 인 정수 좌표를 가진 점의 모든 증분 좌표 목록입니다 (비어 있으면 거짓, 그렇지 않으면 참) ).

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

Ṫṗ2+µ€f/  Main link. Argument: [[x1, y1, k1], [x2, y2, k2]]

    µ     Combine the chain to the left into a link.
     €    Apply it to each list [xi, yi, ki].
Ṫ           Tail; pop and yield ki.
 ṗ2         Second Cartesian power; yield the list of all pairs [a, b] such that
            1 ≤ a ≤ ki and 1 ≤ b ≤ ki.
   +        Add [xi, yi] to each pair, yielding the list of all pairs [c, d] such
            that xi + 1 ≤ c ≤ xi + ki and yi + 1 ≤ d ≤ yi + ki.
      f/  Reduce by filter, intersecting the resulting lists of pairs.

2

TI 기본, 36 바이트

Prompt X,Y,K,Z,θ,L:Z-X<K and X-Z<L and θ-Y<K and Y-θ<L

1

자바, 78 바이트

Object o(int a,int b,int c,int d,int e,int f){return d-a<c&a-d<f&e-b<c&b-e<f;}

1
"알고리즘"은 @Neil입니까?
Bálint

1
Object-1 바이트 반환 형식
마브

@Marv 코드 골프에 합법적인가요?
SuperJedi224

@ SuperJedi224 왜 그렇지 않습니까?
Marv

좋아 니가 그렇게 말한다면.
SuperJedi224

1

옥타브, 17 바이트

@(a,b)a-flip(a)<b

Octave가 자동으로 차원의 자동 브로드 캐스팅을 지원하므로 간단히로 대체 할 수 있다는 점을 제외하면 위의 MATLAB 답변 과 동일한 논리 입니다.[b,b]b

여기에 모든 테스트 사례


1

SmileBASIC, 76 57 바이트

INPUT X,Y,W,S,T,U
SPSET.,X,Y,W,W
SPCOL.?!SPHITRC(S,T,U,U)

첫 번째 사각형의 크기 / 위치로 스프라이트를 만든 다음 두 번째 사각형과 충돌하는지 확인합니다.


1

x86-64 머신 코드, Windows 22 바이트

C ++ 서명 :

extern "C" uint32_t __vectorcall squareOverlap(__m128i x, __m128i y, __m128i k);

사각형이 겹치지 않으면 0을, 그렇지 않으면 -1 (0xFFFFFFFF)을 반환합니다. 입력은 x, y 및 k ( _mm_set_epi64x(x1, x2)등)에 대해 2 개의 64 비트 정수로 구성된 벡터입니다 .

squareOverlap@@48 proc
66 0F FB C8          psubq       xmm1,xmm0
0F 16 D2             movlhps     xmm2,xmm2
66 0F 38 37 D1       pcmpgtq     xmm2,xmm1
0F 12 CA             movhlps     xmm1,xmm2
0F 54 CA             andps       xmm1,xmm2
66 0F 7E C8          movd        eax,xmm1 
C3                   ret  
squareOverlap@@48 endp

1

05AB1E , 5 바이트

Â-›˜P

@Suever 의 MATL 답변 포트 , 진실 / 거짓 결과로 추가 변환. 따라서 입력 형식도 동일합니다.
첫 번째 입력 [[x1,y1],[x2,y2]]과 두 번째 입력은 [k2,k1]입니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오. .

설명:

       # Bifurcate (short for Duplicate & Reverse copy) the (implicit) input-matrix
 -      # Subtract each value (vectorized) from the input-matrix we duplicated
       # Check for both values (vectorized) if it's larger than the (implicit) input-list
        # (We now have the same result as the MATL answer. In MATL a matrix/list consisting
        #  of only 1s is truthy. In 05AB1E this isn't the case however, so:)
    ˜   # Flatten the matrix to a single list
     P  # And take the product to check if all are truthy
        # (after which the result is output implicitly)  
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.