Skip to content

Instantly share code, notes, and snippets.

@gonziesc
Last active June 5, 2023 00:25
import Text.Show.Functions
type Victoria = (Nombre, Anio)
type Nombre = String
type Anio = Int
data Personaje = Personaje {nombre::Nombre, poder::Int, victorias::[Victoria], equipamientos::[Equipamiento]} deriving Show
entrenamiento::[Personaje] -> [Personaje]
entrenamiento personajes = map (entrenamientoPersonal (length personajes)) personajes
entrenamientoPersonal:: Int -> Personaje -> Personaje
entrenamientoPersonal cantidadEntrenando personaje = modificarPoder (*cantidadEntrenando) personaje
cantidadDeVictorias::Personaje->Int
cantidadDeVictorias = length.victorias
rivalesDignos::[Personaje] -> [Personaje]
rivalesDignos = filter esRivalParaThanos.entrenamiento
esRivalParaThanos::Personaje -> Bool
esRivalParaThanos personaje = ((>500).poder) personaje && algunaDeSusVictimasSeLlama "Hijo de Thanos" personaje
algunaDeSusVictimasSeLlama::Nombre -> Personaje -> Bool
algunaDeSusVictimasSeLlama nombre = elem nombre.nombresVictimas
nombresVictimas::Personaje -> [Nombre]
nombresVictimas = map fst.victorias
guerraCivil::[Personaje] -> [Personaje] -> [Personaje]
guerraCivil = zipWith pelear
pelear::Personaje -> Personaje -> Personaje
pelear unPersonaje otroPersonaje
|unPersonaje `leGanaA` otroPersonaje = ganarleA unPersonaje otroPersonaje
|otherwise = ganarleA otroPersonaje unPersonaje
leGanaA::Personaje -> Personaje -> Bool
leGanaA unPersonaje otroPersonaje = poder unPersonaje > poder otroPersonaje
ganarleA::Personaje -> Personaje -> Personaje
ganarleA ganador perdedor = modificarVictorias (++ [(nombre perdedor, 2018)]) ganador
--Parte B
type Equipamiento = Personaje -> Personaje
modificarPoder::(Int -> Int) -> Personaje -> Personaje
modificarPoder modificador personaje = personaje{poder = modificador.poder $ personaje}
escudo::Equipamiento
escudo personaje
|cantidadDeVictorias personaje >= 5 = modificarPoder (+ 50) personaje
|otherwise = modificarPoder (subtract 100) personaje
trajeMecanizado::Int -> Equipamiento
trajeMecanizado version = agregarVersion version.ironizar
modificarNombre:: (Nombre -> Nombre) -> Personaje -> Personaje
modificarNombre modificador personaje = personaje{nombre = modificador.nombre $ personaje}
ironizar::Personaje -> Personaje
ironizar = modificarNombre ("Iron " ++)
agregarVersion:: Int -> Personaje -> Personaje
agregarVersion version = modificarNombre (++ (" V" ++ show version))
seLlama::Nombre -> Personaje -> Bool
seLlama unNombre = (==unNombre).nombre
equipamientoExclusivo:: Nombre -> (Personaje -> Personaje) -> Personaje -> Personaje
equipamientoExclusivo nombrePersonajeExclusivo accion personaje
|seLlama nombrePersonajeExclusivo personaje = accion personaje
|otherwise = personaje
limpiarVictorias::Personaje -> Personaje
limpiarVictorias personaje = personaje { victorias = [] }
hacerDiosDelTrueno::Personaje -> Personaje
hacerDiosDelTrueno = modificarNombre (++ " dios del trueno")
stormBreaker::Equipamiento
stormBreaker = equipamientoExclusivo "Thor" (limpiarVictorias.hacerDiosDelTrueno)
todosLosExtras::[String]
todosLosExtras = map (("extra numero " ++).show) [1..]
todosLosAnios::[Int]
todosLosAnios = [2018..]
victoriaDeTodosLosExtras::[Victoria]
victoriaDeTodosLosExtras = zip todosLosExtras todosLosAnios
ganarleAExtras::Personaje -> Personaje
ganarleAExtras = modificarVictorias (++ victoriaDeTodosLosExtras)
ganarleATodosLosExtras:: ([Victoria] -> [Victoria]) -> Personaje -> Personaje
ganarleATodosLosExtras modificador personaje = personaje{victorias = modificador.victorias $ personaje}
modificarVictorias:: ([Victoria] -> [Victoria]) -> Personaje -> Personaje
modificarVictorias modificador personaje = personaje{victorias = modificador.victorias $ personaje}
gemaDelAlma::Equipamiento
gemaDelAlma = equipamientoExclusivo "Thanos" ganarleAExtras
esGemaDelInfinito::Equipamiento -> Bool
esGemaDelInfinito = undefined
guanteleteInfinito::Equipamiento
guanteleteInfinito = equipamientoExclusivo "Thanos" aplicarGemasDelInfinito
aplicarGemasDelInfinito::Personaje -> Personaje
aplicarGemasDelInfinito personaje = foldl (flip ($)) personaje.gemasDelInfinito $ personaje
gemasDelInfinito::Personaje -> [Equipamiento]
gemasDelInfinito = filter esGemaDelInfinito.equipamientos
{-
Parte C
a) No va a terminar, porque para usar el escudo se necesita evaluar length de una lista infinita.
b) Depende
Si el hijo de thanos es alguna de sus victorias esto va a terminar.
Si el hijo de thanos no estuviera en sus victorias, entonces va a buscar infinitamente en la lista de
victorias a ver si esta, y nunca va a terminar.
c) Sí, porque sólo va a evaluar los primeros 100 de la lista por más que las victorias que queden a thanos
sean infinitas.
-}
thanos = Personaje "Thanos" 100 (("Hijo de Thanos",2018):victoriaDeTodosLosExtras) []
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment