Divida el primer cuadrante (incluido el eje x positivo, el eje y positivo y el origen) en cuadrículas de 1x1, con cada cuadrícula etiquetada por las coordenadas de su esquina inferior izquierda, como se muestra a continuación:
Tenga en cuenta que cada cuadrícula contiene sus límites y sus vértices. Usando símbolos matemáticos, la cuadrícula etiquetada (m, n) representaría el cuadrado {(x,y) | m ≤ x ≤ m+1, n ≤ y ≤ n+1}
.
Dada una línea recta en forma de ax+by+c=0
con enteros a
, b
y c
, y una cuadrícula representada por (m,n)
, indique si la línea pasa a través de la cuadrícula, es decir, si algún punto de la cuadrícula dada está en la línea.
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, sugiera más casos de prueba en los comentarios.
Este es el código de golf . La respuesta más corta en bytes gana. Se aplican lagunas estándar .
fuente
[a, b, c]
(la línea) y[m, n]
(el cuadrado)?Respuestas:
Python 3,
8466 bytesPrimer golf, primer fracaso (tal vez).
Gracias a Rod por reducir 18 bytes utilizando una función en lugar de una entrada directa.
Pruébalo en línea!
Explicación:
Básicamente calculamos el valor de la función de línea para m y m + 1, si n está entre los valores, entonces la lista debe pasar por él en algún momento. Sería mucho mejor si el lenguaje tuviera una forma más simple de ingresar múltiples enteros.
fuente
b
es0
.Jalea , 10 bytes
Pruébalo en línea!
Antecedentes
Al igual que otras respuestas antes de la mía, esto se basa en el hecho de que una línea recta divide el plano en dos semiplanos. El rectángulo está contenido en uno de estos semiplanos (sin intersección con la línea) o intersecta ambos semiplanos (y, por lo tanto, la línea que los separa).
Cómo funciona
fuente
Python 2 , 59 bytes
Pruébalo en línea!
Podemos decir de qué lado de la línea está un punto por el signo de
a*x+b*y+c
. La línea pasa a través del cuadrado (contando tocar) a menos que los cuatro vértices(m,n),(m,n+1),(m+1,n),(m+1,n+1)
estén estrictamente en el mismo lado de la línea. Podemos conectar estos valores en un extracto de la constantea*m+b*n+c
que aparece en los cuatro:Entonces, la línea pasa a través del cuadrado a menos que estos cuatro valores sean todos positivos o todos negativos. Por lo tanto, es suficiente que su mínimo sea
<=0
y el máximo sea>=0
.Restar lo común
a*m+b*n+c
de cada parte da el código.Un enfoque un poco más largo es verificar si el conjunto de signos (+, 0, -) tiene una longitud de al menos 2.
Python 2 , 62 bytes
Pruébalo en línea!
fuente
Mathematica,
6055 bytes-5 bytes gracias a @MartinEnder
formulario de entrada
fuente
Solve
función ...Lote, 66 bytes
Explicación: consideramos los valores tomados por la ecuación en las cuatro esquinas de la celda. Si la línea no cruza la celda, los cuatro valores tienen el mismo signo, pero si cruza la celda, al menos un valor será cero o el signo opuesto. La comparación se simplifica multiplicando pares de esquinas opuestas, luego, si ambos valores son positivos, la línea no intersecta la celda. Un poco de giro de bits convierte las multiplicaciones en un resultado general.
fuente
Mathematica, 50 bytes
Pruébalo en línea!
Toma
m, n, c, a, b
como entrada en ese orden.Explicación:
Tuples@{{#,#+1},{#2,#2+1}}
hace una lista de las coordenadas de las cuatro esquinas del cuadrado, luego toma el producto de punto con.{##4}
(lo que significa{#4, #5}
) y agrega+#3
cálculosax + by + c
parax,y
cada esquina. Si la línea pasa por el punto, esto es cero; si la línea está más lejos del origen, es negativa; y si la línea está más cerca del origen, es positiva, por lo tanto, verificamos laSign
s de estos cuatro valores. La línea pasa fuera del cuadrado si y solo si los cuatro valores son 1 o los cuatro son -1, por lo que verificamos que su suma esté estrictamente entre -4 y 4.(Esta respuesta está vagamente inspirada por mi respuesta a esta pregunta ).
fuente
Python 2,
147110 bytes¡Y muchas gracias a Leaky Nun!
TIO
fuente
Python , 54 bytes
Pruébalo en línea!
(Gracias a xnor por el script de prueba).
Cómo funciona
La línea pasa por m + 1/2 + x , n + 1/2 + y si y solo si
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 .
Esto es posible para algunos | x |, | y | ≤ 1/2 si y solo si | 2⋅ ( a ⋅ m + b ⋅ n + c ) + a + b | ≤ | a | + | b |.
fuente
Java (OpenJDK 8) , 71 bytes
Pruébalo en línea!
Puerto de la solución Python de xnor.
Solución original, utilizando la intersección de forma / línea de Java incorporada (108 bytes)
Pruébalo en línea!
Créditos
fuente