Étant donné 5 points distincts sur un plan bidimensionnel, déterminez le type de section conique formée par les points. La sortie est un des circle
, hyperbola
, ellipse
ou parabola
.
Règles
- Les points seront en position linéaire générale, ce qui signifie qu'il n'y a pas trois points colinéaires, et donc la conique qui les traverse sera unique.
- Les coordonnées des 5 points seront des nombres décimaux compris entre -10 et 10 inclus.
- La précision des valeurs décimales / flottantes doit être la précision du type natif flottant / décimal de votre langue. Si votre langue / type de données est à précision arbitraire, vous pouvez utiliser 12 chiffres après la virgule comme précision maximale requise, en arrondissant vers zéro (par exemple
1.0000000000005 == 1.000000000000
). - La capitalisation de la production n'a pas d'importance.
- La sortie
ellipse
lorsque la section conique est en fait un cercle n'est pas autorisée. Tous les cercles sont des ellipses, mais vous devez produire le plus spécifique.
Sur les imprécisions et la précision en virgule flottante:
J'essaie de rendre cela aussi simple que possible, afin que les problèmes d'inexactitudes en virgule flottante ne gênent pas. Le but est que si le type de données était "valeur de précision infinie magique" au lieu de float / double, alors tout fonctionnerait parfaitement. Mais, comme la "valeur de précision infinie magique" n'existe pas, vous écrivez du code qui suppose que vos valeurs sont d'une précision infinie, et tous les problèmes qui surviennent à la suite d'inexactitudes en virgule flottante sont des fonctionnalités, pas des bogues.
Cas de test
(0, 0), (1, 5), (2, 3), (4, 8), (9, 2) => hyperbola
(1.2, 5.3), (4.1, 5.6), (9.1, 2.5), (0, 1), (4.2, 0) => ellipse
(5, 0), (4, 3), (3, 4), (0, 5), (0, -5) => circle
(1, 0), (0, 1), (2, 1), (3, 4), (4, 9) => parabola
circle
semblent nécessiter la vérification de l'égalité des flotteurs pour se distinguer d'une ellipse très ronde. Quelle précision faut-il assumer ici?Réponses:
Matlab, 154 octets
Enregistré quelques octets grâce aux suggestions de Suever.
Prend l'entrée comme
[x1 y1;x2 y2;x3 y3; etc]
. Celui-ci a utilisé une matrice Vandermonde, et trouve la base de son espace nul, qui sera toujours un seul vecteur. Ensuite, il calcule le discriminant et l'utilise pour créer un index entre 1 et 4 qui est utilisé pour obtenir la chaîne.Non golfé:
La
sign(...)
partie calcule le discriminant, en donnant 1 si elle est positive (hyperbole), -1 si elle est négative (ellipse) et 0 si elle est 0 (parabole). Lemax(...)
soustrait 1 si c'est un cercle. Les tableaux Matlab sont à un index, alors ajoutez 3 pour donner les valeurs 1, 2, 3, 4 et utilisez-les pour indexer le tableau des noms de sections coniques.la source
max() == 0
vous pouvez simplifier~max()
ones(length(p),1)
vous pourriez le faire1+p(:,1)*0
max()
chose était idiote de ma part, j'ai déjà fait des comparaisons avant et je suis devenu paresseux évidemment! Cette façon d'obtenir leones
est également très agréable.JavaScript (ES6), 316
323 347Tout langage mieux adapté à la gestion de la matrice et du déterminant devrait avoir un meilleur score (APL, J, CJAM, Jelly)
Références: Forme générale d'une conique , Cinq points déterminent une conique , Système d'équations linéaires , Déterminant
Dans le plan cartésien, l'équation générale d'une conique est
ayant A ou B ou C différent de 0 (sinon c'est une ligne droite)
A ... F sont six inconnues à trouver. Avec cinq paires de (x, y), nous pouvons construire un système linéaire avec cinq équations, et la mise à l'échelle supprime une dimension. Autrement dit, nous pouvons définir l'un de A, B ou C sur 1 si ce n'est pas 0 (et nous savons qu'au moins un n'est pas 0).
Je construis et essaie de résoudre 3 systèmes: d'abord essayer A = 1. Si non résoluble alors B = 1, puis C. (Il pourrait y avoir une meilleure façon, mais c'est mon meilleur à l'époque)
Ayant les valeurs de A, B, C on peut classer la conique en regardant le discriminant
d=B*B-4*A*C
Moins golfé
Tester
la source
Python - 234 octets
Je ne ai jamais imprimer
circle
ouparabola
parce quet
etd[1]
ne jamais frapper exactement0
, mais OP dit était correct.la source
C, 500
Ma réponse JavaScript portée sur C. Juste pour voir si cela peut être fait.
Utilisation: lire 10 valeurs à partir de l'entrée standard
Production:
Test (idéone)
Moins golfé
la source
Sauge, 247 octets
Essayez-le en ligne
Cette fonction prend une iterable de
(x,y)
paires en entrée, le calcul essaie le discriminant de chacun des 3 systèmes linéaires possibles (A=1
,B=1
, etC=1
), et délivre en sortie le type de section conique sur la base des valeurs de discriminant,A
,B
, etC
.Il y a probablement encore du golf à faire, mais je suis rouillé avec Sage et somnolent en ce moment, donc je vais y travailler plus le matin.
la source