Esses quadrados se sobrepõem?

11

Dadas as coordenadas dos cantos superiores esquerdo de dois quadrados e seus comprimentos laterais, determine se os quadrados se sobrepõem. Um quadrado inclui as linhas superior e esquerda, mas não as linhas inferior e direita. Ou seja, um ponto (a,b)está dentro de um quadrado com comprimento lateral kque começa em (x,y)se e somente se x <= a < x+ke y <= b < y+k. Um quadrado com comprimento lateral 0 é degenerado e não será considerado aqui, portanto, kserá positivo.

Como sempre, todas as regras padrão se aplicam. A entrada e a saída podem estar em qualquer forma que seja conveniente, desde que seja legível por humanos e não haja pré-computação. Certifique-se de especificar qual formato de entrada você usa. Seu código deve receber seis números e produzir verdade se os quadrados se sobrepuserem e falsificarem o contrário.

Casos de teste

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

Todas as entradas serão números inteiros não negativos. Dito isto, espero que muitas ou a maioria das soluções também sejam capazes de lidar com negativos e flutuadores.

El'endia Starman
fonte

Respostas:

22

Python, 33 bytes

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

O Python suporta cadeias de desigualdades, mesmo quando apontam direções opostas.

A coordenada x intervalos [x,x+k)e [X,X+K)se sobrepõem, desde que nenhum deles é completamente para a direita do outro, o que significa que endpoint esquerda de cada intervalo é deixado de endpoint o direito da outra intervalo.

x<X+K
X<x+k

O pode ser combinado em uma desigualdade conjunta -K<X-x<k. Escrever o mesmo para as coordenadas y e uni-las em -Kdá a expressão

k>X-x>-K<Y-y<k
xnor
fonte
10

MATL, 14 11 10 5 4 bytes

tP->

Esta solução aceita entrada na forma de duas matrizes:

  1. Uma matriz 2 x 2 que contém as coordenadas dos cantos [x1, y1; x2, y2]
  2. Uma matriz 2 x 1 contendo as dimensões quadradas [k2; k1]

Experimente Online

Versão ligeiramente modificada para executar todos os casos de teste

Explicação

        % 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
Suever
fonte
5

MATLAB, 36 21 bytes

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

Cria uma função anônima que pode ser avaliada como ans(a,b). Aceita duas entradas do seguinte formato:

  1. 2 x 2 de matriz contendo o canto de cada quadrado como uma linha: [x1, y1; x2, y2].
  2. Matriz 2 x 1 contendo o tamanho dos dois quadrados: [k2; k1]

Todos os casos de teste aqui .

Explicação

Aqui está uma solução não-golfe comentada

%// 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.
Suever
fonte
Não conheço o MATLAB, então, adicione uma explicação?
El'endia Starman
@ El'endiaStarman Adicionada uma explicação.
Suever 12/05
4

JavaScript (ES6), 38 bytes

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

Se d - ac , o segundo quadrado fica à direita do primeiro. Da mesma forma, as outras condições verificam se não está à esquerda, abaixo ou acima.

Neil
fonte
3

Geléia , 8 bytes

Ṫṗ2+µ€f/

Input é a lista aninhada [[x1, y1, k1], [x2, y2, k2]] , output é a lista de todas as coordenadas incrementadas de pontos com coordenadas inteiras que são comuns a ambos os quadrados (falso se estiver vazio, verdadeiro se não estiver) )

Experimente online! ou verifique todos os casos de teste .

Como funciona

Ṫṗ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.
Dennis
fonte
2

TI Basic, 36 bytes

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

Java, 78 bytes

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;}
SuperJedi224
fonte
1
O "algoritmo" de @Neil?
Bálint
1
Objecttipo de retorno para -1 byte
Marv
@Marv Isso é legal para o código de golfe?
SuperJedi224
@ SuperJedi224 Por que não seria?
Marv
Ok, se você diz.
SuperJedi224
1

Oitava, 17 bytes

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

A mesma lógica da minha resposta do MATLAB acima, exceto que o Octave suporta a transmissão automática de dimensões para que possamos substituí [b,b]-lo simplesmente b.

Todos os casos de teste aqui

Suever
fonte
1

SmileBASIC, 76 57 bytes

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

Cria um sprite com o tamanho / posição do primeiro quadrado e verifica se ele colide com o segundo quadrado.

12Me21
fonte
1

x86-64 Código da máquina, Windows 22 bytes

Assinatura C ++:

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

Retorna 0 se os quadrados não se sobrepõem e -1 (0xFFFFFFFF), caso contrário. As entradas são vetores de 2 números inteiros de 64 bits para x, yek ( _mm_set_epi64x(x1, x2)etc.).

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
mim'
fonte
1

05AB1E , 5 bytes

Â-›˜P

Porto de @Suever resposta MATL 's , com a conversão adicional a um resultado truthy / Falsey. O formato de entrada também é o mesmo:
Primeira entrada como [[x1,y1],[x2,y2]]e segunda entrada como [k2,k1].

Experimente online ou verifique todos os casos de teste .

Explicação:

       # 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)  
Kevin Cruijssen
fonte