Эти квадраты перекрываются?


11

Учитывая координаты левого верхнего угла двух квадратов и длину их сторон, определите, перекрываются ли квадраты. Квадрат включает в себя верхнюю и левую линии, но не нижнюю и правую линии. То есть точка (a,b)находится внутри квадрата с длиной стороны, kкоторая начинается (x,y)тогда и только тогда, когда x <= a < x+kи y <= b < y+k. Квадрат с длиной стороны 0 вырожден и не будет здесь рассматриваться, поэтому kбудет положительным.

Как обычно, применяются все стандартные правила. Ввод и вывод могут быть в любой удобной форме, при условии, что они удобочитаемы и нет предварительных вычислений. Обязательно укажите, какой формат ввода вы используете. Ваш код должен принимать шесть чисел и выводить правдиво, если квадраты перекрываются и ложно в противном случае.

Тестовые случаи

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

Python, 33 байта

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

Python поддерживает цепочки неравенств, даже когда они указывают противоположные направления.

Интервалы 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 х 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

JavaScript (ES6), 38 байт

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

Если d - ac, то второй квадрат находится справа от первого. Точно так же другие условия проверяют, что это не слева, не ниже или выше.


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.


1

Java, 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?
Балинт

1
Objectтип возвращаемого значения для -1 байта
Marv

@ Marv Это законно для кода гольф?
SuperJedi224

@ SuperJedi224 Почему бы и нет?
Марв

Хорошо, если ты так говоришь.
SuperJedi224

1

Октава, 17 байт

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

То же логика , как мой 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 байта

С ++ подпись:

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

Возвращает 0, если квадраты не перекрываются, и -1 (0xFFFFFFFF) в противном случае. Входами являются векторы 2 64-битных целых чисел для x, y и k ( _mm_set_epi64x(x1, x2)и т. Д.).

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)  
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.