Skip to content

Instantly share code, notes, and snippets.

@Charlyzzz
Created May 6, 2016 05:23
Show Gist options
  • Save Charlyzzz/e70ae1206b662f18ae3e3f39cd214828 to your computer and use it in GitHub Desktop.
Save Charlyzzz/e70ae1206b662f18ae3e3f39cd214828 to your computer and use it in GitHub Desktop.
Correción de Gonzalo
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