Menu Close

Colinealidad de una lista de puntos

Una colección de puntos son colineales si existe una línea recta tal que todos están en dicha línea. Por ejemplo, los puntos (2,1), (5,7), (4,5) y (20,37) son colineales porque pertenecen a la línea y = 2*x-3.

Definir la función

   colineales :: [(Int,Int)] -> Bool

tal que (colineales ps) se verifica si los puntos de la lista ps son colineales. Por ejemplo,

   colineales [(2,1),(5,7),(4,5),(20,37)]  ==  True
   colineales [(2,1),(5,7),(4,5),(21,37)]  ==  False

Soluciones

-- 1ª definición
colineales1 :: [(Int,Int)] -> Bool
colineales1 ((x1,y1):(x2,y2):xys) =
    all (\(x,y) -> (x-x1)*dy == (y-y1)*dx) xys
    where (dx,dy) = (x2-x1,y2-y1)
colineales1 _ = True
 
-- 2ª definición
colineales2 :: [(Int,Int)] -> Bool
colineales2 ((x,y):xys) = all (\(dx',dy')-> dx'*dy == dy'*dx) ds 
    where ((dx,dy):ds) = [(x'-x,y'-y) | (x',y') <- xys]
 
-- 3ª definición
colineales3 :: [(Int,Int)] -> Bool
colineales3 ((x1,y1):(x2,y2):xys) =
    all (\(x,y) -> x*dy-y*dx == k) xys
    where (dx,dy,k) = (x2-x1,y2-y1,x1*dy-y1*dx)
colineales3 _ = True

3 soluciones de “Colinealidad de una lista de puntos

  1. josejuan
    {-# LANGUAGE LambdaCase #-}
     
    colineales :: [(Int,Int)] -> Bool
    colineales = case []                 -> False
                       [_]                -> False
                       [_,_]              -> True
                       ((u, v):(r, s):ps) ->
                         let (i, j, k) = (r - u, s - v, u * j - v * i)
                             c (x, y) = x * j - y * i == k
                         in  all c ps
  2. Jesús Navas Orozco
    colineales :: [(Int,Int)] -> Bool
    colineales ((a1,b1):(a2,b2):(a3,b3):xs) =
         (b2-b1)*(a3-a1)== (b3-b1)*(a2-a1) &&colineales ((a1,b1):(a2,b2):xs)
    colineales _ = True
  3. Pedro Martín Chávez
    colineales :: [(Int,Int)] -> Bool
    colineales [] = True
    colineales ((a,b):xs)
        | null ys = True
        | otherwise = all ((x,y) -> (y-b)*(c-a) == (d-b)*(x-a)) (tail ys) 
        where ys = dropWhile (==(a,b)) xs
              (c,d) = head ys

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.