Created
May 6, 2016 05:23
-
-
Save Charlyzzz/e70ae1206b662f18ae3e3f39cd214828 to your computer and use it in GitHub Desktop.
Correción de Gonzalo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Data.Char | |
instance Show (a -> b) where | |
show a= "<function>" | |
{- | |
import Text.Show.Functions | |
-} | |
data Barbaro = Barbaro {nombre :: String,fuerza :: Int, habilidades :: [String], objetos :: [Barbaro -> Barbaro]} deriving (Show) | |
{- | |
Te hubiese servido definir el tipo objeto como Barbaro -> Barbaro | |
-} | |
type Aventura = (Barbaro -> Bool) | |
dave :: Barbaro | |
dave = (Barbaro "Dave" 100 ["tejer","escribirPoesia"] [ardilla]) | |
otro = (Barbaro "Dave" 100 ["tejer","Escribir Poesia Atroz"] [ardilla]) | |
otrootro = (Barbaro "Faffy" 100 ["tejer","Robar"] [ardilla]) | |
espadas :: Barbaro -> Int -> Barbaro | |
espadas (Barbaro nombre fuerza habilidades objetos) peso = (Barbaro nombre (sumarFuerza fuerza peso) habilidades objetos) | |
{- | |
Reacomodando los parámetros y utilizando la abstracción de objeto te podría haber quedado armado como | |
espadas :: Int -> Objeto | |
-} | |
sumarFuerza :: Int -> Int -> Int | |
sumarFuerza fuerza = (+fuerza).(2*) | |
amuletosMisticos :: Barbaro -> String -> Barbaro | |
amuletosMisticos (Barbaro nombre fuerza habilidades objetos) habilidad = (Barbaro nombre fuerza (habilidades ++ [habilidad]) objetos) | |
varitasDefectuosas :: Barbaro -> Barbaro | |
varitasDefectuosas = desaparecerObjetos.(flip amuletosMisticos "hacerMagia") | |
desaparecerObjetos :: Barbaro -> Barbaro | |
desaparecerObjetos (Barbaro nombre fuerza habilidades objetos) = (Barbaro nombre fuerza habilidades []) | |
ardilla :: Barbaro -> Barbaro | |
ardilla = id | |
cuerda :: (Barbaro -> Barbaro) -> (Barbaro -> Barbaro) -> (Barbaro -> Barbaro) | |
cuerda = (.) | |
megafono :: Barbaro -> Barbaro | |
megafono (Barbaro nombre fuerza habilidades objetos) = (Barbaro nombre fuerza (potenciarHabilidades habilidades) objetos) | |
potenciarHabilidades :: [String] -> [String] | |
potenciarHabilidades habilidades= [concatMap (map toUpper) habilidades] | |
megafonoBarbarico :: Barbaro -> Barbaro | |
megafonoBarbarico = cuerda ardilla megafono | |
invasionDeSuciosDuendes :: Aventura | |
invasionDeSuciosDuendes (Barbaro _ _ habilidades _) = any (== "Escribir Poesia Atroz") habilidades | |
cremalleraDelTiempo :: Aventura | |
cremalleraDelTiempo (Barbaro nombre _ _ _) = (nombre == "Faffy") || (nombre == "Astro") | |
{- | |
Otra opción también sería | |
cremalleraDelTiempo = flip elem ["faffy", "astro"] . nombre | |
-} | |
ritualDeFechorias :: Aventura | |
ritualDeFechorias barbaro = (saqueo barbaro) || (gritoDeGuerra barbaro) || (caligrafia barbaro) | |
{- | |
Otra forma cheta es | |
ritualDeFechorias barbaro = any ($barbaro) [saqueo,gritoDeGuerra,caligrafía] | |
ó | |
ritualDeFechorias barbaro = any (flip ($) barbaro) [saqueo,gritoDeGuerra,caligrafía] | |
$ también es un chirimbolito, entonces se puede usar tanto como: | |
($) even 2 (forma prefija) | |
even $ 2 (forma infija) | |
-} | |
saqueo :: Aventura | |
saqueo (Barbaro _ fuerza habilidades _) = (tieneRobar habilidades) && (fuerza > 80) | |
tieneRobar :: [String] -> Bool | |
tieneRobar = any (=="Robar") | |
gritoDeGuerra :: Aventura | |
gritoDeGuerra barbaro = (poder barbaro) == 4 * (cantidadObjetos barbaro) | |
poder :: Barbaro -> Int | |
poder (Barbaro _ _ habilidades _) = (length.concat) habilidades | |
{- | |
poder = length . concat . habilidades | |
-} | |
cantidadObjetos :: Barbaro -> Int | |
cantidadObjetos (Barbaro _ _ _ objetos) = length objetos | |
caligrafia :: Aventura | |
caligrafia (Barbaro _ _ habilidades _) = all (vocalesYMayuscula) habilidades | |
vocalesYMayuscula :: String -> Bool | |
vocalesYMayuscula habilidad = (tieneMasde3Vocales habilidad) && (empiezaConUpper habilidad) | |
tieneMasde3Vocales :: String -> Bool | |
tieneMasde3Vocales = (>3).length.filter (esVocal) | |
esVocal :: Char -> Bool | |
esVocal a = True | |
esVocal e = True | |
esVocal i = True | |
esVocal o = True | |
esVocal u = True | |
esVocal _ = False | |
empiezaConUpper :: String -> Bool | |
empiezaConUpper = isUpper.head | |
sobrevivientes :: Aventura -> [Barbaro] -> [Barbaro] | |
sobrevivientes = filter | |
{- | |
Genial! | |
-} | |
sinRepetidos :: (Eq a) => [a] -> [a] | |
sinRepetidos [] = [] | |
sinRepetidos lista | (length.filter (== (head lista))) lista == 1 = [head lista] ++ sinRepetidos (tail lista) | |
| otherwise = sinRepetidos (tail lista) | |
{- | |
No pienses en el como, cuando te alejás del que ya empieza a parecer algorítmico | |
Los patrones de listas te pueden ser útiles | |
sinRepetidos [] = [] | |
sinRepetidos (x:xs) | |
| any (== x) xs = sinRepetidos xs | |
| otherwise = x : sinRepetidos xs | |
-} | |
descendientes :: Barbaro -> [Barbaro] | |
descendientes (Barbaro nombre fuerza habilidades objetos) = [aplicarFunciones (Barbaro (nombre) fuerza (sinRepetidos habilidades) objetos) objetos] ++ descendientes (Barbaro (nombre ++ "*") fuerza habilidades objetos) | |
aplicarFunciones :: Barbaro -> [(Barbaro -> Barbaro)] -> Barbaro | |
aplicarFunciones barbaro = foldl (flip ($)) barbaro | |
{- | |
Se puede ver muuuy claro utilizando un iterate | |
descendientes = iterate (\ barbaro -> aplicarObjetos (objetos barbaro) barbaro ) | |
-} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment