Vecino en lista circular
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
1 |
data Direccion = I | D deriving Eq |
Definir la función
1 |
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,
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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))) |
10 Comentarios