Last active
May 21, 2019 14:11
-
-
Save gastonprieto/67ffe4909c76f88aa5094c485120d0ec to your computer and use it in GitHub Desktop.
Resolución Little Hero 6
This file contains hidden or 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
-- (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