Menu Close

Selección hasta el primero que falla inclusive

Enunciado

-- Definir la función
--    seleccionConFallo :: (a -> Bool) -> [a] -> [a]
-- tal que (seleccionConFallo p xs) es la lista de los elementos de xs
-- que cumplen el predicado p hasta el primero que no lo cumple
-- inclusive. Por ejemplo,
--    seleccionConFallo (<5) [3,2,5,7,1,0]  ==  [3,2,5]
--    seleccionConFallo odd [1..4]          ==  [1,2]
--    seleccionConFallo odd [1,3,5]         ==  [1,3,5]
--    seleccionConFallo (<5) [10..20]       ==  [10]

Soluciones

-- 1ª solución (por recursión):
seleccionConFallo1 :: (a -> Bool) -> [a] -> [a]
seleccionConFallo1 p []                 = []
seleccionConFallo1 p (x:xs) | p x       = x : seleccionConFallo1 p xs
                            | otherwise = [x]
 
-- 2ª solución (con span):
seleccionConFallo2 :: (a -> Bool) -> [a] -> [a]
seleccionConFallo2 p xs = ys ++ take 1 zs
    where (ys,zs) = span p xs

Referencia

El ejercicio está basado en el problema del 29 de abril de 1HaskellADay.

Medio

7 soluciones de “Selección hasta el primero que falla inclusive

  1. Luicanmar
    seleccionConFallo :: (a -> Bool) -> [a] -> [a]
    seleccionConFallo p xs 
        | length (fst (span p xs)) < length xs = (fst (span p xs))++[head (snd(span p xs))]
        | otherwise                            = fst (span p xs)
  2. luiporpir
    seleccionConFallo :: (a -> Bool) -> [a] -> [a]
    seleccionConFallo p (x:xs) | p x = x : seleccionConFallo p xs
                                 | otherwise = [x]
    seleccionConFallo _ _ = []
  3. Daniel Simon Aldana
    seleccionConFallo p [] = []
    seleccionConFallo p (x:xs) 
        | verificaP p x = x: seleccionConFallo p xs
        | otherwise     = [x]
     
    verificaP p x | p x       = True
                  | otherwise = False
  4. Daniel Sánchez
    seleccionConFallo p [] = []
    seleccionConFallo p (x:xs)| p x = x: seleccionConFallo p xs
                              | otherwise = [x]
  5. Loles Valverde
    seleccionConFallo :: (a -> Bool) -> [a] -> [a]
    seleccionConFallo p xs = take l xs
        where l = (length (takeWhile p xs))+1
  6. Vicsotron
    seleccionConFallo :: (a -> Bool) -> [a] -> [a]
    seleccionConFallo p [] = []
    seleccionConFallo p (x:xs) | p x       = x :seleccionConFallo p xs
                               | otherwise = [x]
  7. aguruipoy
    seleccionConFallo :: (a -> Bool) -> [a] -> [a]
    seleccionConFallo p xs =
        if all p xs then xs
        else (fst (span p xs)) ++ [head (snd (span p xs))]

Escribe tu solución

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