Acá pongo los que faltaban para terminar la práctica. Pido disculpas porque el 5.3 quedó HORRIBLE. (tampoco es que los otros son una belleza...)
Si ven algo mal avisen por favor. Saludos!
Para bajar los hs:
Ejercicio 5
Ejercicio 6
Ejercicio 5:
ordena :: Ord a => [a] -> [a]
ordena [] = []
ordena (x:[]) = [x]
ordena l = (ordena (sacaUnaVez l (primero l))) ++ [(primero l)]
ordenaDescendiente :: Ord a => [a] -> [a]
ordenaDescendiente [] = []
ordenaDescendiente (x:[]) = [x]
ordenaDescendiente l = (primero l):(ordenaDescendiente (sacaUnaVez l (primero l)))
agrupa :: Ord a => [a] -> [[a]]
agrupa l = auxAgrupa2 l ((length (elementos l))-1)
--AUXILIARES--
primero :: Ord a => [a] -> a
primero (x:[]) = x
primero (x:xs)
| x>(head xs) = primero (x:(tail xs))
| otherwise = primero xs
sacaUnaVez :: Eq a => [a] -> a -> [a]
sacaUnaVez [] e = []
sacaUnaVez (x:xs) e
| x==e = xs
| otherwise = x:(sacaUnaVez xs e)
elementos :: Eq a => [a] -> [a]
elementos [] = []
elementos (x:[]) = [x]
elementos (x:xs)
| elem x xs = elementos xs
| otherwise = x:(elementos xs)
elemOrdenados :: Ord a => [a] -> [a]
elemOrdenados l = ordena (elementos l)
cuenta :: Eq a => [a] -> a -> Int
cuenta [] _ = 0
cuenta (x:xs) e
| x==e = 1+(cuenta xs e)
| otherwise = cuenta xs e
creaSubLista :: a -> Int -> [a]
creaSubLista x 0 = []
creaSubLista x n = x:(creaSubLista x (n-1))
sub :: [a] -> Int -> a
sub l 0 = head l
sub (x:xs) n = sub xs (n-1)
auxAgrupa :: Ord a => [a] -> [a] -> Int -> [a]
auxAgrupa l e n = creaSubLista (elem) (cuenta l elem)
where elem = sub e n
auxAgrupa2 :: Ord a => [a] -> Int -> [[a]]
auxAgrupa2 l 0 = [auxAgrupa l (elemOrdenados l) 0]
auxAgrupa2 l n = (auxAgrupa2 l (n-1))++[(auxAgrupa l (elemOrdenados l) n)]
Ejercicio 6
reverso :: [Char] -> [Char]
reverso [] = []
reverso (x:xs) = (reverso xs) ++ [x]
capicua :: [Char] -> Bool
capicua l = l==(reverso l)
sumaAcumulada :: [Int] -> [Int]
sumaAcumulada l = auxSumaAcumulada l ((length l)-1)
descomponerEnPrimos :: [Int] -> [[Int]]
descomponerEnPrimos l = auxDescomponer l ((length l)-1)
--AUXILIARES --
listaHasta :: [Int] -> Int -> [Int]
listaHasta l 0 = [head l]
listaHasta (x:xs) n = x:(listaHasta xs (n-1))
auxSumaAcumulada :: [Int] -> Int -> [Int]
auxSumaAcumulada l 0 = [sum(listaHasta l 0)]
auxSumaAcumulada l i = (auxSumaAcumulada l (i-1)) ++ [sum(listaHasta l i)]
sub :: [a] -> Int -> a
sub l 0 = head l
sub (x:xs) n = sub xs (n-1)
esPrimo :: Int -> Bool
esPrimo n = length (divisores n) == 2
divisores :: Int -> [Int]
divisores n
| n>0 = auxdivisores n n
| n<0 = auxdivisores (-n) (-n)
auxdivisores :: Int -> Int -> [Int]
auxdivisores z 1 = [1]
auxdivisores z n
| mod z n == 0 = (auxdivisores z (n-1)) ++ [n]
| otherwise = auxdivisores z (n-1)
auxFactores :: Int -> [Int] -> [Int]
auxFactores n (x:[]) = if esPrimo x then repite x (valencia n x) else []
auxFactores n (x:xs)
| esPrimo x = (repite x (valencia n x)) ++ (auxFactores n xs)
| otherwise = (auxFactores n xs)
repite :: a -> Int -> [a]
repite x 0 = []
repite x n = x:(repite x (n-1))
valencia :: Int -> Int -> Int
valencia n p = auxvalencia n p 0
auxvalencia :: Int -> Int -> Int -> Int
auxvalencia n p v
| (mod n (p^v))==0 && (mod n (p^(v+1)))/=0 = v
| otherwise = (auxvalencia n p (v+1))
factorizacion :: Int -> [Int]
factorizacion n = auxFactores n (divisores n)
factNesimo :: [Int] -> Int -> [Int]
factNesimo l n = factorizacion (sub l n)
auxDescomponer :: [Int] -> Int -> [[Int]]
auxDescomponer l 0 = [factNesimo l 0]
auxDescomponer l n = (auxDescomponer l (n-1)) ++ [(factNesimo l n)]