Skip to content

Instantly share code, notes, and snippets.

@gastonprieto
Last active May 21, 2019 14:11
Show Gist options
  • Save gastonprieto/67ffe4909c76f88aa5094c485120d0ec to your computer and use it in GitHub Desktop.
Save gastonprieto/67ffe4909c76f88aa5094c485120d0ec to your computer and use it in GitHub Desktop.
Resolución Little Hero 6
-- (ataque, defensa, agallas, agresividad)
type Caracteristica = (Int, Int, Int, Int)
-- (TemaQueSabe, Area)
type Conocimiento = (String, String)
-- nombre vida caracteristicas conocimientos equipamientos
data Personaje = Personaje String Int Caracteristica [Conocimiento] [(Personaje -> Personaje)]
-- Accesors
nombre (Personaje nombre' _ _ _ _) = nombre'
vida (Personaje _ vida' _ _ _) = vida'
caracteristica (Personaje _ _ caracteristica' _ _ ) = caracteristica'
conocimientos (Personaje _ _ _ conocimientos' _ ) = conocimientos'
equipamientos (Personaje _ _ _ _ equipamientos' ) = equipamientos'
cambiarEquipamiento (Personaje nombre vida caracteristica conocimientos _) nuevosEquipamientos =
Personaje nombre vida caracteristica conocimientos nuevosEquipamientos
area (_, areaQueSabe) = areaQueSabe
ataque (ataque', _, _, _) = ataque'
defensa (_, defensa', _, _) = defensa'
agallas (_, _, agallas', _) = agallas'
agresividad (_, _, _, agresividad') = agresividad'
incrementarVidaEn cantidad (Personaje nombre vida caracteristica conocimientos equipamientos) =
Personaje nombre (vida + cantidad) caracteristica conocimientos equipamientos
-- Analizando a los personajes
-- 1) Si está desmayado, que es cuando su vida está en 0.
estaDesmayado = (==0) . vida
-- 2) Si es Baymax (claramente, se sabe porque su nombre es Baymax).
esBaymax = (=="Baymax") . nombre
-- 3) -- Si es un cerebrito, si todos los conocimientos que tiene son de la misma área y al menos tiene 10 conocimientos
mismaArea unConocimiento otroConocimiento = area unConocimiento == area otroConocimiento
sabeDeLoMismo [] = False
sabeDeLoMismo (algunConocimiento:otrosConocimientos) = all (mismaArea algunConocimiento) otrosConocimientos
esCerebrito personaje = (sabeDeLoMismo.conocimientos) personaje && ((> 10) . length . conocimientos) personaje
-- 4)
-- Si puede chamuyar de un área de conocimiento, esto es cuando tiene al menos un conocimiento del área.
puedeChamuyarDe areaDeChamuyo = any ((==areaDeChamuyo) . area) . conocimientos
-- Seleccionando a los mejores
segunDesmayo personaje valor
| estaDesmayado personaje = 0
| otherwise = valor
-- 5) Su poder de ataque, es el ataque más un 10% de su agresividad. Si está desmayado no tiene poder de ataque
agresividadDe = agresividad . caracteristica
ataqueDe = ataque . caracteristica
poderDeAtaque personaje = segunDesmayo personaje (0.1 * (fromIntegral . agresividadDe) personaje + (fromIntegral . ataqueDe) personaje)
-- 6) Su poder de defensa. Si está desmayado no tiene poder de defensa
poderDeDefensa personaje = segunDesmayo personaje (defensa . caracteristica $ personaje)
-- 7) Cuales pueden ser héroes, estos son los que sus agallas sean mayores a 100 o Baymax
-- Baymax no necesita agallas para ser un Héroe, ya que es uno de los protagonistas principales de esta historia
tieneAgallas = (>100) . agallas . caracteristica
puedeSerHeroe personaje = esBaymax personaje || tieneAgallas personaje
posiblesHeroes = filter puedeSerHeroe
-- 8) Cuales están listos para la batalla. Son aquellos que después de curarse están listos para pelear
listoParaLaBatalla = (> 80) . vida
curar = incrementarVidaEn 10
listosParaLaBatalla = filter listoParaLaBatalla . map curar
-- 9) Agregar un equipamiento al personaje (se agrega para después usarlo). Ojo que a
-- Baymax como tiene el chip de curar, no se le pueden agregar elementos que
-- aumenten su habilidad (Tip: simular que se le aplicó el equipamiento).
seVuelveAgresivoCon equipamiento personaje = (agresividad . caracteristica . equipamiento) personaje > (agresividad . caracteristica) personaje
determinarEquipamiento equipamiento personaje
| esBaymax personaje && seVuelveAgresivoCon equipamiento personaje = equipamientos personaje
| otherwise = equipamiento : (equipamientos personaje)
agregarEquipamiento equipamiento personaje = cambiarEquipamiento personaje $ determinarEquipamiento equipamiento personaje
-- 10)
-- iron = aumentarPoder 10 . aumentarDefensa 5 . bajarAgresividad 5
-- alma = aprender ("PatadaAlta", "Kung Fu") . incrementarDefensa 80
-- > agregarEquipamiento iron personaje
-- > agregarEquipamiento alma personaje
-- 11) Hacer que un personaje utilice todos los equipamientos que tienen. Recordar que
-- una vez puestos estos equipamientos, no podrá ponerselos de nuevo
ponerEquipamiento personaje = foldr ($) personaje (equipamientos personaje)
equiparse = flip cambiarEquipamiento [] . ponerEquipamiento
-- 12)
-- a) pelearConKabuki, luego de equiparse, todos los integrantes que estén listos
-- para la batalla y además puedan ser héroes, si no existiera ninguno siempre
-- se puede recurrir a baymax.
-- pelearConKabuki = sinoBaymax . filter listoParaLaBatalla . map equiparse
pelearConKabuki = estanParaLaMision listoParaLaBatalla
-- b) convencerALaTia,​ luego de equiparse, todos los integrantes que
-- puedanChamuyar sobre “Comida”, si no existiera ninguno siempre se puede
-- recurrir a baymax
-- convencerALaTia = sinoBaymax . filter puedeChamuyarDe "Comida" . map equiparse
convencerALaTia = estanParaLaMision (puedeChamuyarDe "Comida")
-- c) ○ irAJeopardy, luego de equiparse, todos los integrantes que son cerebritos, si
-- no existiera ninguno siempre se puede recurrir a baymax.
-- irAJeopardy = sinoBaymax . filter esCerebrito . map equiparse
irAJeopardy = estanParaLaMision esCerebrito
-- Devuelve los personajes listos para la misión o sino a Baymax
estanParaLaMision criterio = sinoBaymax . filter criterio . map equiparse
empty = (==0) . length
baymax = Personaje "baymax" 10 (10, 10, 10, 10) [] []
sinoBaymax personajes
| empty personajes = [baymax]
| otherwise = personajes
-- 13)
todoSobreKungFu = map (\n -> ("KungFu-" ++ show n, "ArtesMarciales")) [1..]
agregarConocimientos (Personaje nombre vida caracteristica conocimientos equipamientos) otrosConocimientos =
Personaje nombre vida caracteristica (conocimientos ++ otrosConocimientos) equipamientos
intersect personaje = agregarConocimientos personaje todoSobreKungFu
-- 14)
-- fLoca :: (Num a, Ord a) => (Personaje -> a) -> (Personaje -> b) -> Int -> [Personaje] -> [(a, b)]
fLoca x z y = filter ((>0).fst) . map (\n -> (x n, z n)) . filter ((y>).vida)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment