Divisez le premier quadrant (y compris l'axe x positif, l'axe y positif et l'origine) en grilles 1x1, chaque grille étant étiquetée par les coordonnées de son coin inférieur gauche, comme illustré ci-dessous:
Notez que chaque grille contient ses limites et ses sommets. En utilisant des symboles mathématiques, la grille étiquetée (m, n) représenterait le carré {(x,y) | m ≤ x ≤ m+1, n ≤ y ≤ n+1}
.
Compte tenu d' une ligne droite sous la forme d' ax+by+c=0
avec des nombres entiers a
, b
et c
, et une grille représentée par (m,n)
, la sortie si la ligne passe à travers la grille, à savoir si un point quelconque de la grille donnée est sur la ligne.
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
Veuillez suggérer plus de tests dans les commentaires.
C'est du code-golf . La réponse la plus courte en octets l'emporte. Des échappatoires standard s'appliquent.
la source
[a, b, c]
(la ligne) et[m, n]
(le carré)?Réponses:
Python 3,
8466 octetsPremier golf, premier échec (peut-être).
Merci à Rod d'avoir rasé 18 octets en utilisant une fonction au lieu d'une entrée directe.
Essayez-le en ligne!
Explication:
Fondamentalement, nous calculons la valeur de la fonction de ligne pour m et m + 1, si n est entre les valeurs, alors la liste doit la traverser à un moment donné. Ce serait beaucoup mieux si le langage avait un moyen plus simple de saisir plusieurs entiers.
la source
b
est0
.Gelée , 10 octets
Essayez-le en ligne!
Contexte
Comme d'autres réponses avant la mienne, cela repose sur le fait qu'une ligne droite divise l'avion en deux demi-plans. Le rectangle est soit contenu dans l'un de ces demi-plans (pas d'intersection avec la ligne) ou coupe les deux demi-plans (et donc la ligne qui les sépare.
Comment ça fonctionne
la source
Python 2 , 59 octets
Essayez-le en ligne!
Nous pouvons dire de quel côté de la ligne se trouve un point par le signe
a*x+b*y+c
. La ligne passe par le carré (en comptant le toucher) à moins que les quatre sommets ne(m,n),(m,n+1),(m+1,n),(m+1,n+1)
soient strictement du même côté de la ligne. Nous pouvons brancher ces valeurs dans un extrait de la constantea*m+b*n+c
qui apparaît dans les quatre:Ainsi, la ligne passe par le carré à moins que ces quatre valeurs soient toutes positives ou toutes négatives. Il suffit donc que leur minimum
<=0
et leur maximum soient>=0
.La soustraction du commun
a*m+b*n+c
de chaque partie donne le code.Une approche légèrement plus longue consiste à vérifier si l'ensemble des signes (+, 0, -) a une longueur d'au moins 2.
Python 2 , 62 octets
Essayez-le en ligne!
la source
Mathematica,
6055 octets-5 octets merci à @MartinEnder
formulaire de saisie
la source
Solve
fonction ...Lot, 66 octets
Explication: Nous considérons les valeurs prises par l'équation aux quatre coins de la cellule. Si la ligne n'intersecte pas la cellule, alors les quatre valeurs ont le même signe, mais si elle intersecte la cellule, alors au moins une valeur sera zéro ou le signe opposé. La comparaison est simplifiée en multipliant les paires de coins opposés, puis si les deux valeurs sont positives, la ligne n'intersecte pas la cellule. Un peu de twiddling convertit ensuite les multiplications en un résultat global.
la source
Mathematica, 50 octets
Essayez-le en ligne!
Prend
m, n, c, a, b
en entrée dans cet ordre.Explication:
Tuples@{{#,#+1},{#2,#2+1}}
fait une liste des coordonnées des quatre coins du carré, puis prend le produit scalaire avec.{##4}
(ce qui signifie{#4, #5}
) et ajoute des+#3
calculsax + by + c
pourx,y
à chaque coin. Si la ligne passe par le point, c'est zéro; si la ligne est plus éloignée de l'origine, c'est négatif; et si la ligne est plus proche de l'origine, elle est positive - nous vérifions donc leSign
s de ces quatre valeurs. La ligne passe à l'extérieur du carré si et seulement si les quatre valeurs sont égales à 1 ou si les quatre sont égales à -1, nous vérifions donc que leur somme est strictement comprise entre -4 et 4.(Cette réponse est vaguement inspirée de ma réponse à cette question .)
la source
Python 2,
147110 octetsEt un énorme merci à Leaky Nun!
TIO.
la source
Python , 54 octets
Essayez-le en ligne!
(Merci à xnor pour le script de test.)
Comment ça fonctionne
La ligne passe par m + 1/2 + x , n + 1/2 + y si et seulement 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 .
C'est possible pour certains | x |, | y | ≤ 1/2 si et seulement si | 2⋅ ( a ⋅ m + b ⋅ n + c ) + a + b | ≤ | a | + | b |.
la source
Java (OpenJDK 8) , 71 octets
Essayez-le en ligne!
Port de la solution Python de xnor.
Solution originale, utilisant l'intersection forme / ligne de Java intégrée (108 octets)
Essayez-le en ligne!
Crédits
la source