Dados 5 puntos distintos en un plano bidimensional, determine el tipo de sección cónica formada por los puntos. La salida será uno de circle
, hyperbola
, ellipse
, o parabola
.
Reglas
- Los puntos estarán en posición lineal general, lo que significa que no hay tres puntos colineales y, por lo tanto, la cónica que los atraviesa será única.
- Las coordenadas de los 5 puntos serán números decimales entre -10 y 10, inclusive.
- La precisión de los valores decimales / flotantes debe ser la precisión del tipo flotante / decimal nativo de su idioma. Si su idioma / tipo de datos es de precisión arbitraria, puede usar 12 dígitos después del punto decimal como la precisión máxima requerida, redondeando hacia cero (por ejemplo
1.0000000000005 == 1.000000000000
). - La capitalización de la producción no importa.
- La salida
ellipse
cuando la sección cónica es en realidad un círculo no está permitida. Todos los círculos son elipses, pero debe generar el más específico.
En imprecisiones y precisión de coma flotante:
Estoy tratando de hacer esto lo más simple posible, para que los problemas con las imprecisiones de coma flotante no se interpongan en el camino. El objetivo es, si el tipo de datos fuera "valor de precisión infinita mágico" en lugar de flotante / doble, entonces todo funcionaría perfectamente. Pero, dado que el "valor de precisión infinita mágico" no existe, usted escribe un código que asume que sus valores son de precisión infinita, y cualquier problema que surja como resultado de imprecisiones de coma flotante son características, no errores.
Casos de prueba
(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
parecen requerir la verificación de la igualdad de flotante para distinguirla de una elipse muy redonda. ¿Qué precisión debemos asumir aquí?Respuestas:
Matlab, 154 bytes
Guardado algunos bytes gracias a las sugerencias de Suever.
Toma entrada como
[x1 y1;x2 y2;x3 y3; etc]
. Esto utilizó una matriz de Vandermonde, y encuentra la base de su espacio nulo, que siempre será un solo vector. Luego calcula el discriminante y lo usa para hacer un índice entre 1 y 4 que se usa para obtener la cadena.Sin golf:
La
sign(...)
parte calcula el discriminante, dando 1 si es positivo (hipérbola), -1 si es negativo (elipse) y 0 si es 0 (parábola). Elmax(...)
resta 1 de distancia si es un círculo. Las matrices de Matlab tienen un índice, así que agregue 3 para obtener los valores 1, 2, 3, 4 y úselo para indexar la matriz de nombres de secciones cónicas.fuente
max() == 0
, puede simplificar a~max()
ones(length(p),1)
que podría hacer1+p(:,1)*0
max()
cosa fue tonta de mi parte, ¡tuve comparaciones allí antes y obviamente me volví perezoso! Esa forma de obtenerla tambiénones
es muy agradable.JavaScript (ES6),
316323347Cualquier lenguaje más adecuado para manejar la matriz y el determinante debería tener una mejor puntuación (APL, J, CJAM, Jelly)
Referencias: forma general de una cónica , cinco puntos determinan una cónica , sistema de ecuaciones lineales , determinante
En el plano cartesiano, la ecuación general de una cónica es
Tener A, B o C no es igual a 0 (de lo contrario, es una línea recta)
A ... F hay seis incógnitas por encontrar. Con cinco pares de (x, y) podemos construir un sistema lineal con cinco ecuaciones, y la escala elimina una dimensión. Es decir, podemos establecer uno de A, B o C en 1 si no es 0 (y sabemos que al menos uno no es 0).
Construyo e intento resolver 3 sistemas: primero intento A = 1. Si no se puede resolver, entonces B = 1, luego C. (Podría haber una mejor manera, pero esa es mi mejor en ese momento)
Teniendo los valores de A, B, C podemos clasificar la cónica mirando el discriminante
d=B*B-4*A*C
Menos golf
Prueba
fuente
Python - 234 bytes
Nunca imprimo
circle
oparabola
porquet
yd[1]
nunca pego exactamente0
, pero OP dijo que estaba bien.fuente
C, 500
Mi respuesta de JavaScript se transfirió a C. Solo para ver si se puede hacer.
Uso: lea 10 valores de la entrada estándar
Salida:
Prueba (ideona)
Menos golf
fuente
Sabio, 247 bytes
Pruébalo en línea
Esta función toma un iterable de
(x,y)
pares como entrada, intenta calcular el discriminante de cada uno de los 3 sistemas lineales posibles (A=1
,B=1
yC=1
), y emite el tipo de sección cónica sobre la base de los valores de la discriminante,A
,B
, yC
.Probablemente hay más golf por hacer, pero estoy oxidado con Sage y tengo sueño en este momento, así que trabajaré más en él por la mañana.
fuente