Menu Close

Día: 1 abril, 2021

Reducción de consecutivos relacionados

Definir la función

   reducida :: (a -> a -> Bool) -> [a] -> [a]

tal que (reducida r xs) obtenida elimando en xs las repeticiones de elementos consecutivos queverifican la relación r. Por ejemplo,

   reducida (==) [4,4,2,1,1,1,2,5]  ==  [4,2,1,2,5]
   reducida (<)  [4,4,2,1,1,1,2,5]  ==  [4,4,2,1,1,1]
   reducida (>=) [4,4,2,1,1,1,2,5]  ==  [4,5]
   reducida (>)  [4,4,2,1,1,1,2,5]  ==  [4,4,5]
   reducida (/=) [4,4,2,1,1,1,2,5]  ==  [4,4]

Soluciones

import Data.List (groupBy)
 
-- 1ª solución
reducida :: (a -> a -> Bool) -> [a] -> [a]
reducida _ []     = []
reducida r (x:xs) = x : reducida r (dropWhile (r x) xs)
 
-- 2ª solución
reducida2 :: (a -> a -> Bool) -> [a] -> [a]
reducida2 r = foldr aux []
  where aux x xs = x : dropWhile (r x) xs
 
-- 3ª solución
reducida3 :: (a -> a -> Bool) -> [a] -> [a]
reducida3 r xs =
  map head (groupBy r xs)

Nuevas soluciones

  • En los comentarios se pueden escribir nuevas soluciones.
  • El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>