¡Ayuda! ¡Mi examen de matemáticas llegará pronto y no estudié! 1 Parte del examen es clasificar un cuadrilátero debido a sus coordenadas de vértice, que desafortunadamente no sé cómo hacer. 2
¡Entonces, su desafío es escribir un programa para hacer esto por mí para que no falle!
Desafío
Dados cuatro vértices de modo que no tres de ellos sean colineales, determine la clasificación más específica del cuadrilátero formado por esos cuatro vértices.
Lo que quiero decir con "clasificación más específica" es que, aunque todos los cuadrados son rectángulos, si la forma es un cuadrado, debe indicar que es un cuadrado y no indicar que es un rectángulo.
Entrada
La entrada se dará como cuatro coordenadas (x, y). Puede tomarlos como una lista de longitud 4 de listas / tuplas de longitud 2. Alternativamente, puede tomar la entrada como una lista de las coordenadas xy una lista de las coordenadas y respectivas.
Por ejemplo, si mi forma tiene vértices en los puntos (0, 0), (5, 0), (6, 1), y (1, 1), se puede optar por tomar de entrada en cualquiera de los siguientes formatos o algo similar:
[(0, 0), (5, 0), (6, 1), (1, 1)]
([0, 5, 6, 1], [0, 0, 1, 1])
Puede suponer que el cuadrilátero no se auto intersecta y que los puntos se dan en el orden correcto (es decir, dos puntos consecutivos en la entrada estarán conectados por un segmento de línea en el cuadrilátero).
Salida
Necesitará una salida única para cada una de las siguientes clases de cuadriláteros:
- Cuadrado
- Rectángulo
- Rombo
- Paralelogramo
- Trapecio / Trapecio
- Cometa
- Cuadrilátero
Este podría ser el nombre exacto en sí, un personaje, un número entero, etc.
Reglas
- Se aplican lagunas estándar
- Si su lenguaje de programación tiene una función incorporada que realizará esta tarea exacta, esa función no está permitida.
- Se permiten los elementos integrados para encontrar la distancia entre dos puntos.
- Se permiten los elementos integrados para encontrar el ángulo entre dos líneas.
En este punto, si conoce todos los términos, ¡está listo para comenzar a programar! (Los casos de prueba están al final)
Terminología
Esta sección es para cualquier persona que necesite aclaraciones sobre las definiciones de las diferentes formas.
Cuadrado
Un cuadrilátero es un cuadrado si y solo si sus 4 lados tienen la misma longitud y cada par de lados adyacentes es perpendicular (es decir, es un rectángulo y un rombo).
Rectángulo
Un cuadrilátero es un rectángulo si y solo si cada par de lados adyacentes es perpendicular.
Rombo
Un cuadrilátero es un rombo si y solo si sus 4 lados son iguales.
Paralelogramo
Un cuadrilátero es un paralelogramo si y solo si cada par de lados opuestos es paralelo y cada par de ángulos opuestos es igual. Ambas condiciones implican una a la otra, por lo que solo necesita verificar una de ellas.
Trapecio / Trapecio
Un cuadrilátero es un trapecio / trapecio si y solo si tiene al menos un par de lados paralelos.
Cometa
Un cuadrilátero es una cometa si dos pares opuestos de lados adyacentes tienen la misma longitud; es decir, dos de sus lados adyacentes son iguales y los otros dos también son iguales.
Casos de prueba
input as (x, y) * 4 -> full name
[(0, 0), (1, 0), (1, 1), (0, 1)] -> square
[(0, 0), (1, 1), (-1, 3), (-2, 2)] -> rectangle
[(0, 0), (5, 0), (8, 4), (3, 4)] -> rhombus
[(0, 0), (5, 0), (6, 1), (1, 1)] -> parallelogram
[(0, 0), (4, 0), (3, 1), (1, 1)] -> trapezoid/trapezium
[(0, 0), (1, 1), (0, 3), (-1, 1)] -> kite
[(0, 0), (2, 0), (4, 4), (0, 1)] -> quadrilateral
Enlaces (calculadora gráfica Desmos)
Aquí hay enlaces a visualizaciones de cada uno de los casos de prueba.
Cuadrado
Rectángulo
Rombo
Paralelograma
Trapecio / Trapecio
Cometa
Cuadrilátero
Criterios ganadores
Obviamente, no puedo traer una computadora al examen, así que necesito que escribas el código más corto posible para poder memorizarlo. ¡Necesito escribirlo en los márgenes y ejecutarlo usando TryItOffline TM para que quepa en los márgenes, su programa debe ser lo más pequeño posible!
1 Por supuesto que sí: P
2 Por supuesto que sí: P

Respuestas:
APL (Dyalog) ,
104898082817978 bytesPruébalo en línea!
De entrada y salida
Toma una matriz de coordenadas 4 × 2 como entrada
Salidas
1 1 1para la plaza1 1 0para rombo1 0 1para rectángulo1 0 0para paralelogramo1 0para la cometa0 1para trapecio0 0para cuadriláteroAlgoritmo
Primero, encuentre las 4 longitudes y ángulos laterales del cuadrilátero
Si ambos pares de ángulos opuestos son iguales (
OA), entonces la forma es algún tipo de paralelogramo. Determine si todas las longitudes de los lados son iguales (AS, lados adyacentes) y si todos los ángulos son iguales (AA).Si no
OA, entonces:Determine si hay exactamente 2 pares de lados adyacentes iguales y si están separados (en
aabblugar deaaab). Si es así, la forma es una cometa.Determine si hay exactamente 1 par de lados opuestos paralelos. Si es así, la forma es un trapecio.
De lo contrario, la forma es un cuadrilátero.
Código
⍙←{⍵⍺⍺1⌽⍵}define un nuevo operador. En APL, un operador significa una función de orden superior . Este operador toma 1 argumento funcional (⍺⍺) y devuelve una función monádica que:1⌽) el argumento (⍵)⍺⍺entre él y⍵Esto es especialmente útil para las funciones escalares, ya que la mayoría de ellas se mapean implícitamente en los argumentos de la matriz, lo
⍙que permite aplicarlas entre cada par de elementos adyacentes con ajuste. Por ejemplo,+⍙1 2 3 4es el1 2 3 4 + 2 3 4 1que evalúa3 5 7 5.x←-⍙⎕+.×1 0J1convierte la matriz de coordenadas de entrada en una matriz de números complejos que representan los vectores de los 4 lados de la forma.⎕, cuando se hace referencia, toma y devuelve la entrada1 0J1representa el vector [1, i] ("vector" en el sentido matemático e "i" como la raíz cuadrada de -1). En APL,a+bise escribe un número complejoaJb+.×multiplicación de matrices Matemáticamente, el resultado sería una matriz 4 × 1. Sin embargo,+.×se llama "producto interno" en APL que generaliza la multiplicación de matrices y el producto interno de vectores y le permite hacer incluso cosas como "multiplicar" una matriz tridimensional con una bidimensional. En este caso, estamos multiplicando una matriz de 4 × 2 y un vector de 2 elementos, lo que resulta en un vector de 4 elementos (de las representaciones de números complejos de los 4 vértices dados).-⍙es una resta por pares con envoltura como se indicó anteriormente. Esto proporciona los vectores de los 4 lados de la forma (como números complejos). Estos vectores apuntan en la dirección "inversa" pero eso no importa.x←almacena eso en la variablex2|1+-⍙(12○x)÷○1encuentra (una representación de) los ángulos exteriores en los 4 vértices de la forma.12○xencuentra el argumento principal , en radianes, de cada uno de los 4 vectores laterales.÷○1se divide por π para que los ángulos sean más fáciles de trabajar. Por lo tanto, todos los ángulos se expresan como un múltiplo de un ángulo recto.-⍙Sustracción por pares con envoltura como se indicó anteriormente. Esto le da a los 4 ángulos exteriores.2|1+El argumento principal está limitado (-1,1] y la resta por pares hace el rango (-2,2]. Esto es malo ya que el mismo ángulo tiene 2 representaciones diferentes. Al hacer "sumar 1 mod 2", el ángulo es re limitado a (0,2]. Aunque todos los ángulos son 1 más de lo que debería ser, está bien si lo tenemos en cuenta.|xencuentra la magnitud de cada uno de los 4 vectores laterales{⍵≡2⌽⍵:≡⍙¨0⍺⍵⋄2 4=+/1=2|+⍙↑⍵(=⍙⍺)}define y aplica una función con la matriz de 4 ángulos exteriores como argumento correcto⍵y la matriz de 4 longitudes laterales como argumento correcto⍺.⍵≡2⌽⍵es el guardia.1la siguiente expresión≡⍙¨0⍺⍵y se devuelve su valor.0, esa expresión se omite y la siguiente2 4=...=⍙⍺)se ejecuta en su lugar.⍵≡2⌽⍵comprueba si ambos pares de ángulos opuestos son iguales.2⌽⍵Rota la matriz de ángulos en 2 lugares.⍵≡comprueba si que es el mismo que⍵en sí≡⍙¨0⍺⍵devuelve un valor único para cada forma de tipo paralelogramo.0⍺⍵es la matriz de 3 elementos del escalar0, la matriz de longitudes laterales⍺y la matriz de ángulos⍵.≡⍙¨se ejecuta≡⍙para cada uno de esos elementos.≡⍙comprueba si todos los valores de una matriz son iguales comprobando si al girarla en 1 se obtiene la misma matriz. Los escalares no giran, por lo que≡⍙0regresa1. Como se señaló anteriormente,≡⍙⍺busca un rombo y≡⍙⍵busca un rectángulo.2 4=+/1=2|+⍙↑⍵(=⍙⍺)devuelve un valor único para cada forma de tipo no paralelogramo. Esto se logra entrelazando los controles para la cometa y el trapecio.2=+/1=2|+⍙⍵busca un trapecio.+⍙⍵da las sumas de ángulos adyacentes. Los ángulos interiores de las líneas paralelas suman un ángulo recto, por lo que también lo hacen los ángulos exteriores de los lados paralelos de un cuadrilátero. Entonces, cada par de lados paralelos debe conducir a dos1o-1en las sumas de los ángulos adyacentes.1=2|Sin embargo, los ángulos en⍵son 1 más de lo que deberían ser, por lo que los ángulos en realidad suman1o3. Esto se puede verificar con "mod 2 es igual a 1".+/suma la matriz. Esto da un recuento de sumas de ángulos adyacentes que es1o3.2=compruebe si eso es igual a 2. (es decir, si hay exactamente un par de lados paralelos)4=+/1=2|+⍙(=⍙⍺)busca una cometa.(=⍙⍺)da una matriz que indica qué lados adyacentes son iguales. A diferencia≡, el=trabajo en cuanto a elementos. Por lo tanto, esta es una matriz de 4 elementos con1s donde la longitud de ese lado es igual a la del lado "siguiente".+⍙Suma por pares con envoltura.1=2|Dado que(=⍙⍺)da una matriz booleana (una con solo0sy1s), los únicos valores posibles de suma por pares son0,1y2. Entonces1=2|es lo mismo que justo1=.+/suma la matriz. Esto da un recuento de sumas por pares que es1.4=compruebe si eso es igual a 4. La única forma en que sucede es si(=⍙⍺)es1 0 1 0o0 1 0 1. Como se señaló anteriormente, esto significa que la forma es una cometa.2 4=+/1=2|+⍙↑⍵(=⍙⍺)entrelaza los controles anteriores.⍵(=⍙⍺)es la matriz anidada de 2 elementos de la matriz⍵y la matriz(=⍙⍺)↑promueve la matriz anidada a una matriz adecuada. Dado que⍵(=⍙⍺)es una matriz de 2 elementos de matrices de 4 elementos, el resultado es una matriz de 2 × 4.+⍙Dado que⌽(y, por extensión,⍙) gira el último eje (horizontal),+⍙a una matriz es lo mismo que aplicar+⍙a cada fila individualmente.1=2|tanto residual / mod (|) como equals (=) funcionan por elemento, incluso para matrices.+/Por defecto, reduce (/) funciona a lo largo del último eje (horizontal). Entonces,+/suma a lo largo de filas y convierte una matriz de 2 × 4 en una matriz simple de 2 elementos.2 4=Como=funciona por elemento, esto verifica las condiciones de cometa y trapecio simultáneamente.fuente
Mathematica, 195 bytes
Con espacios en blanco:
Salidas
1para cuadrados,2rombos,3rectángulos,4paralelogramos,5cometas,6trapecios y7cualquier otra cosa. Publicaría un enlace TIO, pero aparentemente esto no funciona en matemáticas.Si los cuatro puntos son
P,Q,R, yS, a continuación,{##,#}se{P,Q,R,S,P}, por lo queses la lista de vectores secundarios{Q-P,R-Q,S-R,P-S},les las longitudes de los vectores, yres la condición de que el ángulo entreQ-PyR-Qasí como el ángulo entreR-QyS-Rson ambos90grados.Por lo tanto, si todas las longitudes de los lados son iguales, entonces el cuadrilátero es un rombo. Si se
rmantiene, de hecho es un cuadrado, de lo contrario es solo un rombo simple.Descartando los rombos, si ambos pares de lados opuestos son iguales, entonces el cuadrilátero sigue siendo paralelogramo. Si se
rmantiene, de hecho es un rectángulo, de lo contrario, es solo un paralelogramo simple.Al descartar paralelogramos, la lista de longitudes de los lados
les de la forma{a,b,b,a}o{a,a,b,b}para algunosayb, luego, el cuadrilátero es una cometa. Tenga en cuenta que, además, no puede ser un trapecio o, de hecho, sería un rombo.Descartando paralelogramos y cometas, si el cuadrilátero tiene un par de lados paralelos, entonces es un trapecio. Verificamos esto mediante
Normalizelos vectores laterales y verificando si se suma un par de vectores opuestos{0,0}.Descartando todo lo anterior, si
1 > 0(es mejor que sea), entonces el cuadrilátero es simplemente un viejo cuadrilátero.fuente
Python 2 ,
463410408397 bytesAhorró 53 bytes usando una tupla en la sexta línea en lugar de indexar en una lista.
Ahorró 11 bytes al cambiar a los enteros de salida 1 a 7 en lugar de la primera letra de cada forma. Los enteros corresponden de la siguiente manera:
Pruébalo en línea!
Sin ánimo de mostrar la lógica
Se muestra como una función para mostrar la salida de las diferentes entradas de prueba. tenga en cuenta que cambié el ejemplo de prueba "Rectángulo" del que se proporcionó originalmente en la pregunta, que no era un rectángulo.
La lógica se basa en productos de punto y la norma (longitud) de los vectores formados por los lados del cuadrilátero para evaluar si los lados son iguales en longitud, paralelos en lados opuestos o perpendiculares a lados adyacentes.
Pruébalo en línea!
fuente
[(0, 0), (2, 2), (4, 0), (0,-2)]Lote, 287 bytes
Salidas en binario:
1= Cometa,10= Cuadrilátero,11= Trapecio,100= Paralelogramo,101= Rombo,110= Rectángulo,111= Cuadrado. Explicación:g, h, i, json los cuadrados de las longitudes de los lados.pes el número de pares de lados opuestos con la misma longitud,qdistingue entre paralelogramos / rectángulos y rhobmi / cuadrados al verificar si los pares opuestos son de hecho iguales,rdistingue entre paralelogramos / rombos y rectángulos / cuadrados a través de una verificación de perpendicularidad,kverifica si hay un cometa buscando pares de lados adyacentes iguales ytcomprueba un trapecio a través de un par de controles laterales paralelos.fuente
2=|-.=⍙⍺. Sin duda se ve compacto si se ignora el puesto de trabajo en el cálculo⍺(las longitudes de los lados 4) y toda una línea para definir⍙