Vous êtes le capitaine d'un cuirassé. Le département d'ingénierie a pris les devants avec des designs cette année, donc le navire sur lequel vous êtes prend la forme d'un simple triangle.
Vous sortez sur le pont et profitez de la brise marine ... mais pas pour longtemps. Un ennemi vous a tiré dessus! - mais le coup va-t-il frapper?
Contribution
Vous pouvez écrire une fonction ou un programme complet pour ce défi.
Votre programme comprendra 11 entiers, dont dix sont jumelés:
Les trois premières paires d'entiers (x 1 , y 1 ), (x 2 , y 2 ), (x 3 , y 3 ) spécifieront les sommets de votre vaisseau. Le triangle formé aura une aire non nulle.
La prochaine paire d'entiers (e x , e y ) spécifie l'emplacement du canon ennemi. Le canon ennemi ne reposera jamais sur ou à l'intérieur des limites de votre navire. *
La paire (a x , a y ) après cela spécifie où l'ennemi visait. Ce sera différent de (e x , e y ).
Le dernier entier positif R spécifie la portée du tir de l'ennemi
* Vous seriez un terrible capitaine si vous ne l'aviez même pas remarqué!
Production
Vous devez imprimer / retourner une valeur véridique (par exemple true, 1) si le cuirassé sera touché, sinon une valeur falsifiée (par exemple false, 0).
Qu'est-ce qu'un hit?
Le tir ennemi est un segment de ligne droite de longueur R de (e x , e y ) dans la direction de (a x , a y ). Si ce segment de ligne chevauche une partie de l' intérieur de votre cuirassé triangulaire, cela compte comme un coup. Sinon, ce n'est pas un succès.
Les coups qui frôlent le long du triangle ou atteignent seulement la limite du triangle ne comptent pas comme un coup.
Exemples
0 0 0 1 1 0
1 1
0 0
2
Hit: l'ennemi a tiré à travers le centre de votre vaisseau!
2 0 0 2 4 4
0 0
1 1
1
Aucun coup sûr : la portée de l'ennemi est trop courte, vous êtes donc en sécurité.
0 0 1 2 3 0
-4 0
0 0
8
Aucun coup sûr: l'ennemi a effleuré le côté de votre vaisseau, donc cela ne compte pas comme un coup sûr. Chanceux!
0 0 -1 3 4 -1
-3 -4
3 4
5
Aucun coup sûr : le tir ennemi s'arrête juste devant le navire, vous êtes donc en sécurité. Si le canon ennemi avait une portée encore légèrement meilleure, alors vous auriez été touché! Phew!
-2 -3 -3 6 7 -2
-6 2
1 -4
7
Coup: Même si le tir n'a pas pénétré de l'autre côté, c'est toujours un coup.
-3 2 2 -4 7 -3
-3 -4
-3 0
10
Pas de succès: Pour mémoire, il s'agit d'un autre coup sûr.
Cas de test supplémentaires
0 0 6 0 6 8
-6 -8
6 8
20
Pas de coup: c'est un autre pâturage, mais en biais.
0 0 -2 -5 5 3
-3 4
0 0
6
Coup: Le tir est entré via un sommet du navire.
Notation
Il s'agit de code-golf , donc le code le plus court en octets l'emporte. Des échappatoires standard s'appliquent.
0 0 -1 3 4 -1 -3 -4 3 4 6
.Réponses:
Python 3, 252 octets
C'est certainement la plupart des variables que j'ai jamais utilisées dans le golf de code. : ^ P
Légèrement non golfé, avec commentaires:
Comment ça fonctionne:
Exemples de cycles:
la source
Python 2.7, 235 octets
Calcule le produit croisé
AB x AP
entre les coins A, B et le point P. Si les trois ont le même signe, alors le point est à l'intérieur du triangle.Non golfé:
Tests:
la source
C, 247 octets
Certainement pas encore tout à fait au golf.
Actuellement, cela utilise une approche similaire à la solution de DLosc, c'est-à-dire qu'il parcourt toutes les coordonnées possibles sur le segment de ligne pour déterminer s'il intersecte avec le triangle. (Il échouera donc si la plage est supérieure à 1000). Cependant, il utilise la formule de http://mathworld.wolfram.com/TriangleInterior.html pour déterminer si un point se trouve à l'intérieur du triangle. Cela évite un tas de fonctions trigonométriques.
Exemple de vérification, doit s'imprimer
1 0 0 0 1 0
.la source
JavaScript (ES6) 320
448 522 627(Pourrait-on encore jouer au golf?)
Pas:
Réf:
Intersection de segments
Point à l'intérieur du triangle
Point dans un segment étant donné une distance
Tester dans Firefox
Non golfé
la source