De http://en.wikipedia.org/wiki/Triangle :
Escriba un programa que tome tres tuplas de coordenadas 2d (cartesianas) y clasifique qué forma describen estos tres puntos.
En casi todos los casos, estos puntos describirán un triángulo de diferentes tipos. En algunos casos degenerados, los puntos describirán un punto singular o una línea recta. El programa determinará cuáles de las siguientes etiquetas se aplican a la forma descrita:
- Punto (3 puntos son coincidentes)
- Línea (3 puntos se encuentran en una línea recta; no más de 2 puntos pueden ser coincidentes)
- Equilátero (3 lados iguales, 3 ángulos iguales)
- Isósceles (2 lados iguales, 2 ángulos iguales)
- Escaleno (0 lados iguales, 0 ángulos iguales)
- Recto (1 ángulo exactamente π / 2 (o 90 °))
- Oblicuo (0 ángulos exactamente π / 2 (o 90 °))
- Obtuso (1 ángulo> π / 2 (o 90 °))
- Agudo (3 ángulos <π / 2 (o 90 °))
Tenga en cuenta que para algunas formas descritas, se aplicará más de una de las etiquetas anteriores. Por ejemplo, cualquier ángulo recto también será isósceles o escaleno.
Entrada
- El programa puede leer las 3 coordenadas de entrada de STDIN, línea de comandos, variables de entorno o cualquier método que sea conveniente para el idioma que elija.
- El formato de entrada puede ser formateado, sin embargo, es conveniente para su idioma de elección. Se puede suponer que todos los números de entrada están bien formados con respecto a los tipos de datos que termina utilizando.
- No se puede suponer nada sobre el orden de las coordenadas de entrada.
Salida
- El programa saldrá a STDOUT, cuadro de diálogo o cualquier método de visualización que sea conveniente para el idioma que elija.
- La salida mostrará todas las etiquetas aplicables a la forma descrita por las coordenadas de entrada.
- Las etiquetas pueden salir en cualquier orden.
Otras reglas
- Las bibliotecas / API trigonométricas de su idioma están permitidas, pero cualquier API que calcule específicamente los tipos de triángulos está prohibida.
- Al determinar la igualdad de ángulos o longitudes de lados, probablemente terminará comparando valores de punto flotante. Dos de estos valores deben considerarse "iguales" si uno está dentro del 1% del otro.
- "Lagunas" estándar que ya no son divertidas
- Este es el código de golf , por lo que gana la respuesta más corta en bytes.
Ejemplos
Input Output
(1,2) (1,2) (1,2) Point
(1,2) (3,4) (5,6) Line
(0,0) (1,1) (2,0) Isosceles Right
(0,0) (2,1) (10,1) Scalene Oblique Obtuse
Respuestas:
C (451 bytes)
Utiliza solo longitudes cuadradas y pendientes.
Sin golf (y el operador ternario reemplazado con if / else):
Formato de entrada (a través de stdin): xyxyxy
ex. 0 0 1 1 2 0 para Isósceles Derecha
fuente
./triangle <<< "1 2 1 2 1 2"
debe usarse con las comillas.C, 333
Dejé el espacio en blanco por el momento. Esto funciona, pero probablemente podría funcionar con un poco de limpieza y golf. Matemáticas similares a
@es1024
las de la respuesta, pero usa un bucle y matrices. Formato de entradax y x y x y
Variables
t[]
almacena tanto la entrada como los cuadrados de las longitudes. Al final del programa, se parece a la tabla a continuación (aumentar el número de iteraciones del bucle conduciría a una repetición indefinida de las longitudes al cuadrado). Al comienzo del bucle cuadrados de longitudes (basura ya que no todos los datos están disponibles ) se almacenan innecesariamente en las celdas 1,3 y 5, pero losscanf.
datos útiles se sobrescriben de inmediato y se escriben enz,b,c
ahds
cuandoi
= 9,11,13 (t[i]
yt[i-2]
se accede a ellos).g[]
se agregó tarde para mantener los valores dx y dy necesarios para el cálculo de la pendiente. Las únicas celdas utilizadas son del 6 al 9 (del 0 al 5 no son confiables ya que no todos los datos están disponibles cuando se escriben). Sig[6]/g[7]==g[8]/g[9]
las pendientes de 2 líneas son iguales y el triángulo es solo una línea (o un punto). La ecuación se reorganiza en el programa para evitar la división.r
es un valor intermedio utilizado para cuadrarz
cuenta el número de lados de longitud cero. Tiene un desplazamiento de +3 porque el ciclo lee 3 celdas en blancot[]
.c
cuenta el número de lados que tienen la misma longitud. También tiene un desplazamiento de +3. Tenga en cuenta que el ladoa
se escribet[]
dos veces para poder verificar a = b, b = c, c = a.b
es la mayor longitud de un lado, al cuadrado.s
es la suma de los cuadrados de todos los lados.Tenga en cuenta que comparar las longitudes de los lados A ^ 2 + B ^ 2 + C ^ 2 con 2 * B ^ 2 es lo mismo que comparar A ^ 2 + C ^ 2 con B ^ 2 (solo reste B ^ 2 de ambos lados). si B ^ 2 = A ^ 2 + C ^ 2 es un triángulo rectángulo. si B ^ 2 es mayor es obtuso, si es menor es agudo.
fuente
Golfscript (175 bytes)
Puede probarlo aquí (conjunto de prueba incluido).
Formato de entrada:
Versión comentada:
NOTA:
La razón por la que mi código no contiene resultados "equiláteros" es porque:
fuente
Mathematica (
313307 caracteres)Golfizado:
Sin golf:
El formato de entrada es una lista de puntos, sobre los cuales se llama la función:
fuente