En la lista circular [3,2,5,7,9]
- el vecino izquierdo de 5 es 2 y su vecino derecho es 7,
- el vecino izquierdo de 9 es 7 y su vecino derecho es 3,
- el vecino izquierdo de 3 es 9 y su vecino derecho es 2,
- el elemento 4 no tiene vecinos (porque no está en la lista).
Para indicar las direcciones se define el tipo de datos
data Direccion = I | D deriving Eq |
data Direccion = I | D deriving Eq
Definir la función
vecino :: Eq a => Direccion -> [a] -> a -> Maybe a |
vecino :: Eq a => Direccion -> [a] -> a -> Maybe a
tal que (vecino d xs x) es el vecino de x en la lista de elementos distintos xs según la dirección d. Por ejemplo,
vecino I [3,2,5,7,9] 5 == Just 2
vecino D [3,2,5,7,9] 5 == Just 7
vecino I [3,2,5,7,9] 9 == Just 7
vecino D [3,2,5,7,9] 9 == Just 3
vecino I [3,2,5,7,9] 3 == Just 9
vecino D [3,2,5,7,9] 3 == Just 2
vecino I [3,2,5,7,9] 4 == Nothing
vecino D [3,2,5,7,9] 4 == Nothing |
vecino I [3,2,5,7,9] 5 == Just 2
vecino D [3,2,5,7,9] 5 == Just 7
vecino I [3,2,5,7,9] 9 == Just 7
vecino D [3,2,5,7,9] 9 == Just 3
vecino I [3,2,5,7,9] 3 == Just 9
vecino D [3,2,5,7,9] 3 == Just 2
vecino I [3,2,5,7,9] 4 == Nothing
vecino D [3,2,5,7,9] 4 == Nothing
Soluciones
data Direccion = I | D deriving Eq
-- 1ª solución
-- ===========
vecino1 :: Eq a => Direccion -> [a] -> a -> Maybe a
vecino1 d xs x = busca x (vecinos d xs)
-- (vecinos d xs) es la lista de elementos de xs y sus vecinos según la
-- direccioń d. Por ejemplo,
-- vecinos I [1..5] == [(2,1),(3,2),(4,3),(5,4),(1,5)]
-- vecinos D [1..5] == [(1,2),(2,3),(3,4),(4,5),(5,1)]
vecinos :: Direccion -> [a] -> [(a,a)]
vecinos I xs = zip (tail (cycle xs)) xs
vecinos D xs = zip xs (tail (cycle xs))
-- (busca x ps) es el la segunda componente de primer par de ps cuya
-- primera componente es igual a x. Por ejemplo,
-- busca 3 [(4,1),(3,2),(3,7)] == Just 2
-- busca 7 [(4,1),(3,2),(3,7)] == Nothing
busca :: Eq a => a -> [(a,b)] -> Maybe b
busca x ps
| null zs = Nothing
| otherwise = Just (head zs)
where zs = [z | (x',z) <- ps, x' == x]
-- 2ª solución
-- ===========
vecino2 :: Eq a => Direccion -> [a] -> a -> Maybe a
vecino2 d xs x = lookup x (vecinos d xs)
-- 3ª solución
-- ===========
vecino3 :: Eq a => Direccion -> [a] -> a -> Maybe a
vecino3 I xs x = lookup x (zip (tail (cycle xs)) xs)
vecino3 D xs x = lookup x (zip xs (tail (cycle xs))) |
data Direccion = I | D deriving Eq
-- 1ª solución
-- ===========
vecino1 :: Eq a => Direccion -> [a] -> a -> Maybe a
vecino1 d xs x = busca x (vecinos d xs)
-- (vecinos d xs) es la lista de elementos de xs y sus vecinos según la
-- direccioń d. Por ejemplo,
-- vecinos I [1..5] == [(2,1),(3,2),(4,3),(5,4),(1,5)]
-- vecinos D [1..5] == [(1,2),(2,3),(3,4),(4,5),(5,1)]
vecinos :: Direccion -> [a] -> [(a,a)]
vecinos I xs = zip (tail (cycle xs)) xs
vecinos D xs = zip xs (tail (cycle xs))
-- (busca x ps) es el la segunda componente de primer par de ps cuya
-- primera componente es igual a x. Por ejemplo,
-- busca 3 [(4,1),(3,2),(3,7)] == Just 2
-- busca 7 [(4,1),(3,2),(3,7)] == Nothing
busca :: Eq a => a -> [(a,b)] -> Maybe b
busca x ps
| null zs = Nothing
| otherwise = Just (head zs)
where zs = [z | (x',z) <- ps, x' == x]
-- 2ª solución
-- ===========
vecino2 :: Eq a => Direccion -> [a] -> a -> Maybe a
vecino2 d xs x = lookup x (vecinos d xs)
-- 3ª solución
-- ===========
vecino3 :: Eq a => Direccion -> [a] -> a -> Maybe a
vecino3 I xs x = lookup x (zip (tail (cycle xs)) xs)
vecino3 D xs x = lookup x (zip xs (tail (cycle xs)))