Divida o primeiro quadrante (incluindo o eixo x positivo, o eixo y positivo e a origem) em grades 1x1, com cada grade rotulada pelas coordenadas do canto inferior esquerdo, conforme demonstrado abaixo:
Observe que cada grade contém seus limites e seus vértices. Usando símbolos matemáticos, a grade rotulada (m, n) representaria o quadrado {(x,y) | m ≤ x ≤ m+1, n ≤ y ≤ n+1}
.
Dada uma linha recta, na forma de ax+by+c=0
com números inteiros a
, b
e c
, e uma grade representada por (m,n)
, a saída se a linha passa através da grade, ou seja, se qualquer ponto da grelha é determinado na linha.
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
Por favor, sugira mais casos de teste nos comentários.
Isso é código-golfe . A resposta mais curta em bytes vence. Aplicam-se brechas padrão .
code-golf
geometry
decision-problem
Freira Furada
fonte
fonte
[a, b, c]
(a linha) e[m, n]
(o quadrado)?Respostas:
Python 3,
8466 bytesPrimeiro golfe, primeiro fracasso (talvez).
Agradecimentos a Rod por remover 18 bytes usando uma função em vez de entrada direta.
Experimente online!
Explicação:
Basicamente, calculamos o valor da função de linha para m e m + 1, se n estiver entre os valores, a lista deve passar por ela em algum momento. Seria muito melhor se o idioma tivesse uma maneira mais simples de inserir vários números inteiros.
fonte
b
é0
.Gelatina , 10 bytes
Experimente online!
fundo
Como outras respostas anteriores às minhas, isso se baseia no fato de que uma linha reta divide o plano em dois semiplanos. O retângulo está contido em um desses semiplanos (sem interseção com a linha) ou cruza os dois semiplanos (e, portanto, a linha que os separa).
Como funciona
fonte
Python 2 , 59 bytes
Experimente online!
Podemos dizer de que lado da linha um ponto está pelo sinal de
a*x+b*y+c
. A linha passa pelo quadrado (contando com o toque), a menos que todos os quatro vértices(m,n),(m,n+1),(m+1,n),(m+1,n+1)
estejam estritamente no mesmo lado da linha. Podemos inserir esses valores em um extrato da constantea*m+b*n+c
que aparece nos quatro:Portanto, a linha passa pelo quadrado, a menos que esses quatro valores sejam todos positivos ou negativos. Portanto, basta que o mínimo seja
<=0
e o máximo seja>=0
.Subtrair o comum
a*m+b*n+c
de cada parte fornece o código.Uma abordagem um pouco mais longa é verificar se o conjunto de sinais (+, 0, -) tem comprimento pelo menos 2.
Python 2 , 62 bytes
Experimente online!
fonte
Mathematica,
6055 bytes-5 bytes thanx a @MartinEnder
formulário de entrada
fonte
Solve
função ...Lote, 66 bytes
Explicação: Consideramos os valores tomados pela equação nos quatro cantos da célula. Se a linha não cruzar a célula, todos os quatro valores terão o mesmo sinal, mas se cruzar a célula, pelo menos um valor será zero ou o sinal oposto. A comparação é simplificada multiplicando pares de cantos opostos; se ambos os valores forem positivos, a linha não cruza a célula. Alguns ajustes de bits convertem as multiplicações em um resultado geral.
fonte
Mathematica, 50 bytes
Experimente online!
Toma
m, n, c, a, b
como entrada nessa ordem.Explicação:
Tuples@{{#,#+1},{#2,#2+1}}
faz uma lista das coordenadas dos quatro cantos do quadrado e, em seguida, pega o produto escalar com.{##4}
(o que significa{#4, #5}
) e adiciona os+#3
cálculosax + by + c
parax,y
cada canto. Se a linha passa pelo ponto, é zero; se a linha está mais distante da origem, é negativa; e se a linha estiver mais próxima da origem, é positivo - portanto, verificamos osSign
s desses quatro valores. A linha passa para fora do quadrado se e somente se todos os quatro valores forem 1 ou todos os quatro forem -1, então verificamos se a soma deles é estritamente entre -4 e 4.(Esta resposta é vagamente inspirada pela minha resposta a esta pergunta .)
fonte
Python 2,
147110 bytesE um enorme agradecimento à Leaky Nun!
TIO.
fonte
Python , 54 bytes
Experimente online!
(Obrigado ao xnor pelo script de teste.)
Como funciona
A linha passa por m + 1/2 + x , n + 1/2 + y se e somente se
a ⋅ ( m + 1/2 + x ) + b ⋅ ( n + 1/2 + y ) + c = 0
⇔ 2⋅ ( a ⋅ m + b ⋅ n + c ) + a + b = −2⋅ a ⋅ x - 2⋅ b ⋅ y .
Isso é possível para alguns | x |, | y | ≤ 1/2 se e somente se | 2⋅ ( a ⋅ m + b ⋅ n + c ) + a + b | ≤ | a | + | b |.
fonte
Java (OpenJDK 8) , 71 bytes
Experimente online!
Porta da solução Python do xnor.
Solução original, usando a interseção de forma / linha de Java incorporada (108 bytes)
Experimente online!
Créditos
fonte