Definir la función
eliminaciones :: [a] -> [(a,Int,[a])] |
eliminaciones :: [a] -> [(a,Int,[a])]
tal que (eliminaciones xs) es la lista de ternas (x,i,zs) tales que x es un elemento de xs, i es la posición de x en xs y zs es la lista de los restantes elementos de xs. Por ejemplo,
λ> eliminaciones [5,7,6,5]
[(5,0,[7,6,5]),(7,1,[5,6,5]),(6,2,[5,7,5]),(5,3,[5,7,6])] |
λ> eliminaciones [5,7,6,5]
[(5,0,[7,6,5]),(7,1,[5,6,5]),(6,2,[5,7,5]),(5,3,[5,7,6])]
Soluciones
import Test.QuickCheck (quickCheck)
-- 1ª solución
eliminaciones :: [a] -> [(a,Int,[a])]
eliminaciones xs = [(z,i,zs) | ((z,zs),i) <- zip (aux xs) [0..]]
where aux [] = []
aux [x] = [(x,[])]
aux (x:y:zs) = (x,y:zs) : [(v,x:vs) | (v,vs) <- aux (y:zs)]
-- 2ª solución
eliminaciones2 :: [a] -> [(a,Int,[a])]
eliminaciones2 xs =
[(v,i,us++vs) | i <- [0..length xs - 1],
let (us,v:vs) = splitAt i xs]
-- Comprobación de equivalencia
-- ============================
-- La propiedad es
prop_equivalencia :: [Int] -> Bool
prop_equivalencia xs =
eliminaciones xs == eliminaciones2 xs
-- La comprobación es
-- λ> quickCheck prop_equivalencia
-- +++ OK, passed 100 tests. |
import Test.QuickCheck (quickCheck)
-- 1ª solución
eliminaciones :: [a] -> [(a,Int,[a])]
eliminaciones xs = [(z,i,zs) | ((z,zs),i) <- zip (aux xs) [0..]]
where aux [] = []
aux [x] = [(x,[])]
aux (x:y:zs) = (x,y:zs) : [(v,x:vs) | (v,vs) <- aux (y:zs)]
-- 2ª solución
eliminaciones2 :: [a] -> [(a,Int,[a])]
eliminaciones2 xs =
[(v,i,us++vs) | i <- [0..length xs - 1],
let (us,v:vs) = splitAt i xs]
-- Comprobación de equivalencia
-- ============================
-- La propiedad es
prop_equivalencia :: [Int] -> Bool
prop_equivalencia xs =
eliminaciones xs == eliminaciones2 xs
-- La comprobación es
-- λ> quickCheck prop_equivalencia
-- +++ OK, passed 100 tests.
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>