/infinitywar.hs Secret
Last active
June 5, 2023 00:25
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 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