Posiciones de máximos locales
Los vectores se definen usando tablas como sigue:
1 |
type Vector a = Array Int a |
Un elemento de un vector es un máximo local si no tiene ningún elemento adyacente mayor o igual que él.
Definir la función
1 |
posMaxVec :: Ord a => Vector a -> [Int] |
tal que (posMaxVec p) devuelve las posiciones del vector p en las que p tiene un máximo local. Por ejemplo,
1 2 3 |
posMaxVec (listArray (1,6) [3,2,6,7,5,3]) == [1,4] posMaxVec (listArray (1,2) [5,5]) == [] posMaxVec (listArray (1,1) [5]) == [1] |
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 39 40 41 |
import Data.Array type Vector a = Array Int a -- 1ª definición posMaxVec :: Ord a => Vector a -> [Int] posMaxVec p | n == 1 = [1] | otherwise = (if p!1 > p!2 then [1] else []) ++ [i | i <- [2..n-1], p!(i-1) < p!i && p!(i+1) < p!i] ++ (if p!(n-1) < p!n then [n] else []) where (_,n) = bounds p -- 2ª definición posMaxVec2 :: Ord a => Vector a -> [Int] posMaxVec2 p | n == 1 = [1] | otherwise = [1 | p ! 1 > p ! 2] ++ [i | i <- [2..n-1], p!(i-1) < p!i && p!(i+1) < p!i] ++ [n | p ! (n - 1) < p ! n] where (_,n) = bounds p -- 3ª definición posMaxVec3 :: Ord a => Vector a -> [Int] posMaxVec3 p | n == 1 = [1] | otherwise = [i | i <- [1..n], all (<p!i) [p!j | j <- vecinos i]] where (_,n) = bounds p vecinos 1 = [2] vecinos j | j == n = [n-1] | otherwise = [j-1,j+1] -- 4ª definición posMaxVec4 :: Ord a => Vector a -> [Int] posMaxVec4 p = [i | (i,x) <- assocs p , i == a || p!(i-1) < x , i == b || p!(i+1) < x ] where (a,b) = bounds p |