Siguiente mayor
Definir la función
1 |
siguienteMayor :: Ord a => [a] -> [Maybe a] |
tal que (siguienteMayos xs) es la lista obtenida sustiyendo cada elemento de xs por el primer elemento de xs a la derechha de x que sea mayor que x, si existe y Nothing en caso contrario. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 |
λ> siguienteMayor [4,5,2,3,9] [Just 5,Just 9,Just 3,Just 9,Nothing] λ> siguienteMayor [9,5,2,3,4] [Nothing,Nothing,Just 3,Just 4,Nothing] λ> siguienteMayor [9,5,2,2,4] [Nothing,Nothing,Just 4,Just 4,Nothing] λ> siguienteMayor "betis" [Just 'e',Just 't',Nothing,Just 's',Nothing] λ> siguienteMayor "sevilla" [Just 'v',Just 'v',Nothing,Just 'l',Nothing,Nothing,Nothing] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import Data.Maybe (listToMaybe) -- 1ª solución siguienteMayor :: Ord a => [a] -> [Maybe a] siguienteMayor [] = [] siguienteMayor (x:xs) | null ys = Nothing : siguienteMayor xs | otherwise = Just (head ys) : siguienteMayor xs where ys = [y | y <- xs, y > x] -- 2ª solución siguienteMayor2 :: Ord a => [a] -> [Maybe a] siguienteMayor2 [] = [] siguienteMayor2 (x:xs) = listToMaybe [y | y <- xs, y > x] : siguienteMayor2 xs -- 3ª solución siguienteMayor3 :: Ord a => [a] -> [Maybe a] siguienteMayor3 [] = [] siguienteMayor3 (x:xs) = listToMaybe (dropWhile (<=x) xs) : siguienteMayor3 xs |
Pensamiento
Si vivir es bueno
es mejor soñar,
y mejor que todo,
madre, despertar.Antonio Machado
Solución en Maxima:
siguienteMayor (xs):= if emptyp (xs) then [] else g(xs)$
g(xs):=if emptyp (f(xs)) then
(cons(Nothing, siguienteMayor (rest(xs))))
else (cons (first(f(xs)),siguienteMayor (rest (xs)))) $
f(xs) := delete (Nada,create_list(p(x,first(xs)),x,xs))$
p(x,y):=if x>y then x else Nada$