-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPdePerritos.hs
104 lines (81 loc) · 3.88 KB
/
PdePerritos.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
-- PARTE A
data Perrito = Perrito {
raza :: String,
juguetesFavoritos :: [Juguete],
tiempoAPermanecer :: Int,
energia :: Int
}
type Juguete = String
data Guarderia = Guarderia {
nombre :: String,
rutina :: [(Actividad, Tiempo)]
}
type Actividad = Perrito -> Perrito
type Tiempo = Int
jugar :: Actividad
jugar unPerrito
| (energia.modificarEnergia (flip (-) 10)) unPerrito > 0 = modificarEnergia (flip (-) 10) unPerrito
| otherwise = modificarEnergia (flip (-) (energia unPerrito)) unPerrito
modificarEnergia :: (Int -> Int) -> Perrito -> Perrito
modificarEnergia operacion unPerrito = unPerrito {energia = operacion.energia $ unPerrito}
ladrar :: Int -> Actividad
ladrar cantidad = modificarEnergia (+ div cantidad 2)
regalar :: Juguete -> Actividad
regalar unJuguete unPerrito = unPerrito {juguetesFavoritos = unJuguete : juguetesFavoritos unPerrito}
diaDeSpa :: Actividad
diaDeSpa unPerrito
| tiempoAPermanecer unPerrito > 50 && esRazaExtravagante unPerrito = regalar "peine de goma".energiaAlPalo $ unPerrito
| otherwise = unPerrito
esRazaExtravagante :: Perrito -> Bool
esRazaExtravagante unPerrito = elem (raza unPerrito) ["dalmata", "pomerania"]
energiaAlPalo :: Perrito -> Perrito
energiaAlPalo unPerrito = unPerrito {energia = 100}
diaDeCampo :: Actividad
diaDeCampo = pierdePrimerJuguete.jugar
pierdePrimerJuguete :: Perrito -> Perrito
pierdePrimerJuguete unPerrito = unPerrito {juguetesFavoritos = tail.juguetesFavoritos $ unPerrito}
zara :: Perrito
zara = Perrito {
raza = "dalmata",
juguetesFavoritos = ["pelota", "mantita"],
tiempoAPermanecer = 90,
energia = 80
}
guarderiaPdePerritos :: Guarderia
guarderiaPdePerritos = Guarderia {
nombre = "Guarderia P de Perritos",
rutina = [(jugar, 30), (ladrar 18, 20), (regalar "pelota", 0), (diaDeSpa, 120), (diaDeCampo, 720)]
}
-- PARTE B
tiempoRutina :: Guarderia -> Int
tiempoRutina = sum . map snd. rutina
puedeEstarEn :: Guarderia -> Perrito -> Bool
puedeEstarEn unaGuarderia unPerrito = tiempoAPermanecer unPerrito > tiempoRutina unaGuarderia
esResponsable :: Perrito -> Bool
esResponsable = ( > 3).length.juguetesFavoritos.diaDeCampo
realizarRutina :: Guarderia -> Perrito -> Perrito
realizarRutina unaGuarderia unPerrito
| puedeEstarEn unaGuarderia unPerrito = foldl (\perro actividad -> actividad perro) unPerrito (map fst.rutina $ unaGuarderia)
| otherwise = unPerrito
estaCansado :: Perrito -> Bool
estaCansado = (<5).energia
quedanCansados :: Guarderia -> [Perrito] -> [Perrito]
quedanCansados unaGuarderia = filter estaCansado .map (realizarRutina unaGuarderia)
-- PARTE C
piPerrito :: Perrito
piPerrito = Perrito {
raza = "labrador",
juguetesFavoritos = infinitasSogas,
tiempoAPermanecer = 314,
energia = 159
}
infinitasSogas :: [Juguete]
infinitasSogas = map (("soga "++). show) [1..]
{-
1) Es posible averiguar la raza de pi, entonces se puede determinar si es extravagante al pasar a pi como argumento de la funcion esRazaExtravagante, que dara como resultado False
2) a) habría que recorrer la interminable cantidad de sogas para despues ver si hay algun huesito, pero como la cantidad de sogas no tiene fin, nunca se determinaria si un huesito forma parte de su lista de juguetes.
b) Si se encontraría ya que los juguetes agregados por el diaDeSpa (que es una actividad que forma parte de la rutina Guarderia de Perritos) encabeza a la pelota dentro de la lista de juguetes, y gracias a la evaluación diferida de haskell, cuando ya se encuentra al juguete buscado, se deja de mirar al resto de juguetes y se salta a la respuesta, que devolvería True.
c) Idem respuesta b
3) Es posible, mientras que las actividades de la rutina no involucren procesos con su lista de juguetes que no lleguen a una respuesta en una cantidad finita de tiempo.
4) Se va a encabezar en su lista de juguetes, sus juguetes favoritos quedarian de la forma: ["hueso", "soga 1", "soga 2",...
-}