Definir la función
|
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])] |
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
|
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>
Se puede imprimir o compartir con