Làm các hình vuông chồng lên nhau?


11

Cho tọa độ của các góc trên bên trái của hai hình vuông và độ dài cạnh của chúng, xác định xem các hình vuông có trùng nhau không. Một hình vuông bao gồm các dòng trên cùng và bên trái, nhưng không phải là dòng dưới cùng và bên phải. Đó là, một điểm (a,b)nằm trong một hình vuông có độ dài cạnh kbắt đầu từ (x,y)khi và chỉ khi x <= a < x+ky <= b < y+k. Một hình vuông có độ dài cạnh 0 là suy biến và sẽ không được xem xét ở đây, do đó, ksẽ là dương.

Như thường lệ, tất cả các quy tắc tiêu chuẩn được áp dụng. Đầu vào và đầu ra có thể ở bất kỳ dạng nào thuận tiện, miễn là nó có thể đọc được và không có tiền xử lý. Hãy chắc chắn để xác định định dạng đầu vào bạn sử dụng. Mã của bạn sẽ có sáu số và đầu ra trung thực nếu các hình vuông trùng nhau và sai lệch.

Các trường hợp thử nghiệm

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

Tất cả các đầu vào sẽ là số nguyên không âm. Điều đó nói rằng, tôi hy vọng rằng nhiều hoặc hầu hết các giải pháp cũng sẽ có thể xử lý tiêu cực và nổi.


Câu trả lời:


22

Python, 33 byte

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

Python hỗ trợ các chuỗi bất đẳng thức ngay cả khi chúng chỉ hướng ngược nhau.

Các khoảng tọa độ x [x,x+k)[X,X+K)chồng chéo miễn là không ai hoàn toàn ở bên phải của bên kia, điều đó có nghĩa là điểm cuối bên trái của mỗi khoảng bên trái là điểm cuối bên phải của khoảng thời gian khác.

x<X+K
X<x+k

Có thể được kết hợp thành một bất bình đẳng chung -K<X-x<k. Viết tương tự cho tọa độ y và nối chúng tại -Kbiểu thức

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

10

MATL, 14 11 10 5 4 byte

tP->

Giải pháp này chấp nhận đầu vào dưới dạng hai mảng:

  1. Một ma trận 2 x 2 chứa tọa độ của các góc [x1, y1; x2, y2]
  2. Mảng 2 x 1 chứa kích thước vuông [k2; k1]

Dùng thử trực tuyến

Phiên bản sửa đổi một chút để chạy tất cả các trường hợp thử nghiệm

Giải trình

        % 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 byte

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

Tạo một hàm ẩn danh có thể được đánh giá là ans(a,b). Chấp nhận hai đầu vào có định dạng sau:

  1. Ma trận 2 x 2 chứa góc của mỗi hình vuông dưới dạng một hàng : [x1, y1; x2, y2].
  2. Mảng 2 x 1 chứa kích thước của hai hình vuông: [k2; k1]

Tất cả các trường hợp thử nghiệm ở đây .

Giải trình

Đây là một giải pháp không bình luận

%// 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.

Tôi không biết MATLAB, vì vậy hãy thêm một lời giải thích?
El'endia Starman

@ El'endiaStarman Đã thêm một lời giải thích.
Suever

4

JavaScript (ES6), 38 byte

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

Nếu d - ac thì hình vuông thứ hai nằm bên phải hình thứ nhất. Tương tự, các điều kiện khác kiểm tra rằng nó không ở bên trái, bên dưới hoặc bên trên.


3

Thạch , 8 byte

Ṫṗ2+µ€f/

Đầu vào là danh sách lồng nhau [[x1, y1, k1], [x2, y2, k2]] , đầu ra là danh sách tất cả các tọa độ tăng của các điểm có tọa độ nguyên phổ biến cho cả hai hình vuông (giả nếu trống, thật nếu không ).

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

Ṫṗ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 Basic, 36 byte

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

1

Java, 78 byte

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
Là "thuật toán" từ @Neil?
Bálint

1
Objectkiểu trả về cho byte byte
Marv

@Marv Điều đó có hợp pháp cho mã golf không?
SuperJedi224

@ SuperJedi224 Tại sao không?
Marv

Được rồi nếu bạn nói vậy.
SuperJedi224

1

Octave, 17 byte

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

Logic tương tự như câu trả lời MATLAB của tôi ở trên, ngoại trừ Octave hỗ trợ tự động phát kích thước để chúng tôi có thể thay thế [b,b]bằng cách đơn giản b.

Tất cả các trường hợp thử nghiệm ở đây


1

SmileBASIC, 76 57 byte

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

Tạo một sprite với kích thước / vị trí của hình vuông thứ nhất, sau đó kiểm tra xem nó có va chạm với hình vuông thứ hai không.


1

x86-64 Mã máy, Windows 22 byte

Chữ ký C ++:

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

Trả về 0 nếu các ô vuông không trùng nhau và -1 (0xFFFFFFFF) nếu không. Đầu vào là các vectơ của 2 số nguyên 64 bit cho x, y và k ( _mm_set_epi64x(x1, x2)v.v.).

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 byte

Â-›˜P

Câu trả lời MATL của @Suever , với sự chuyển đổi bổ sung thành kết quả trung thực / falsey. Do đó, định dạng đầu vào cũng giống nhau:
Đầu vào đầu tiên là [[x1,y1],[x2,y2]]và đầu vào thứ hai là [k2,k1].

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

       # 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)  
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.