Vértices de un cuadrado
Definir la función
1 |
esCuadrado :: (Num a, Ord a) => (a,a) -> (a,a) -> (a,a) -> (a,a) -> Bool |
tal que (esCuadrado p q r s) se verifica si los puntos p, q, r y s son los vértices de un cuadrado. Por ejemplo,
1 2 3 4 5 6 7 8 9 |
esCuadrado (0,0) (0,1) (1,1) (1,0) == True esCuadrado (0,0) (2,1) (3,-1) (1, -2) == True esCuadrado (0,0) (1,1) (0,1) (1,0) == True esCuadrado (1,1) (1,1) (1,1) (1,1) == True esCuadrado (0,0) (0,2) (3,2) (3,0) == False esCuadrado (0,0) (3,4) (8,4) (5,0) == False esCuadrado (0,0) (0,0) (1,1) (0,0) == False esCuadrado (0,0) (0,0) (1,0) (0,1) == False esCuadrado (0,0) (1,0) (0,1) (-1,-1) == False |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import Data.List (sort, tails) esCuadrado :: (Num a, Ord a) => (a,a) -> (a,a) -> (a,a) -> (a,a) -> Bool esCuadrado p q r s = and [a == b, b == c, c == d, e == f, a + b == e] where [a,b,c,d,e,f] = sort (distancias p q r s) -- (distancias p q r s) es la lista de los cuadrados de las longitudes -- de los lados y de las diagonales del cuadrilátero cuyos vértices son -- los puntos p, q, r y s. Por ejemplo, -- distancias (0,0) (0,1) (1,1) (1,0) == [1,2,1,1,2,1] -- distancias (0,0) (3,4) (8,4) (5,0) == [25,80,25,25,20,25] -- distancias (0,0) (0,2) (3,2) (3,0) == [4,13,9,9,13,4] -- distancias (0,0) (0,0) (1,1) (0,0) == [0,2,0,2,0,2] -- distancias (0,0) (0,0) (1,0) (0,1) == [0,1,1,1,1,2] distancias :: Num a => (a,a) -> (a,a) -> (a,a) -> (a,a) -> [a] distancias p q r s = [l | (h:t) <- tails [p,q,r,s], l <- map (dist h) t] -- (dist p q) es el cuadrado de la distancia del punto p al q. Por -- ejemplo, -- dist (6,4) (3,8) == 25 dist :: Num a => (a,a) -> (a,a) -> a dist (x1,y1) (x2,y2) = (x2-x1)^2 + (y2-y1)^2 |
4 Comentarios