-
Notifications
You must be signed in to change notification settings - Fork 0
/
ParcialTelevision.hs
142 lines (101 loc) · 4.07 KB
/
ParcialTelevision.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
data Serie = Serie {
nombreSerie :: String,
actores :: [Actor],
presupuesto :: Int,
cantTemporadas :: Int,
rating :: Float,
cancelada :: Bool,
bienestar :: Int
}
data Actor = Actor {
nombreActor :: String,
sueldoPretendido :: Int,
restriccionesTrabajo :: [String]
}
johnnyDepp = Actor{
nombreActor = "johnny depp",
sueldoPretendido = 2000000,
restriccionesTrabajo = []
}
helena = Actor{
nombreActor = "helena",
sueldoPretendido = 1500000,
restriccionesTrabajo = []
}
data Productor = Productor {
tarea :: [Serie -> Serie]
}
timBurton = Productor {
tarea = [acomodo [johnnyDepp, helena] ]
}
gatopardeitor = Productor {
tarea = [noHacerNada]
}
estireitor = Productor {
tarea = [estirarDuracion]
}
desespereitor = Productor {
tarea = [noHacerNada, estirarDuracion]
}
canceleitor = Productor {
tarea = [cancelar 5.3]
}
-- PUNTO 1 - A (Saber si la serie está en rojo, esto es si el presupuesto no alcanza a cubrir lo que quieren cobrar todos los actores.)
laSerieEstaEnRojo :: Serie -> Bool
laSerieEstaEnRojo unaSerie = presupuesto unaSerie < (sum . sueldoActores . actores ) unaSerie
sueldoActores :: [Actor] -> [Int]
sueldoActores = map sueldoPretendido
--PUNTO 1 B (Saber si una serie es problemática, esto ocurre si tienen más de 3 actores o actrices con más de 1 restricción)
--VERSION CASI SIN DELEGAR
--esProblematica :: Serie -> Bool
--esProblematica = (>3) . length . cantidadDeRestricciones . actores
--cantidadDeRestricciones :: [Actor] -> [Actor]
--cantidadDeRestricciones = filter ( (>1) . length . restriccionesTrabajo )
--VERSION CON MAS DELEGACION
esProblematica :: Int -> Serie -> Bool
esProblematica cantRestricciones unaSerie = (length.actoresConMuchasRestricciones cantRestricciones) (actores unaSerie) > 3
actoresConMuchasRestricciones :: Int -> [Actor] -> [Actor]
actoresConMuchasRestricciones cantRestricciones = filter (restriccionesPorActor cantRestricciones)
restriccionesPorActor :: Int -> Actor -> Bool
restriccionesPorActor cantRestricciones unActor = (length . restriccionesTrabajo) unActor > cantRestricciones
--PUNTO 2
-- ============= Funcion a reutilizar =================
evaluacionProductor:: Productor -> Serie -> Serie
evaluacionProductor unProductor unaSerie = foldl (\x f -> f x) unaSerie (tarea unProductor)
-- ===================================================
--B
acomodo :: [Actor] -> Serie -> Serie
acomodo actoresAcomodados unaSerie = unaSerie { actores = ((actoresAcomodados ++) . sacarDelReparto) (actores unaSerie)}
sacarDelReparto :: [Actor] -> [Actor]
sacarDelReparto = drop 2
--C
noHacerNada :: Serie -> Serie
noHacerNada unaSerie = unaSerie
--D
estirarDuracion :: Serie -> Serie
estirarDuracion unaSerie = unaSerie {cantTemporadas = ((2*) . cantTemporadas) unaSerie }
--F
cancelar :: Float -> Serie -> Serie
cancelar cifraDeRating unaSerie = unaSerie {cancelada = controlarEstado cifraDeRating unaSerie}
controlarEstado :: Float -> Serie -> Bool
controlarEstado cifraDeRating unaSerie = laSerieEstaEnRojo unaSerie || rating unaSerie < cifraDeRating
--PUNTO 4 ======================================================
calculoBienestar :: Serie -> Serie
calculoBienestar unaSerie
| cancelada unaSerie = modificarBienestar 0 unaSerie
| otherwise = modificarBienestar 1 unaSerie
criterio1 :: Serie -> Int
criterio1 unaSerie
|cantTemporadas unaSerie > 4 = 5
|otherwise = (10 - cantTemporadas unaSerie) *2
criterio2 :: Serie -> Int
criterio2 unaSerie
| (length . actores) unaSerie < 10 = 3
| otherwise = length. filter (restriccionesPorActor 2) $ actores unaSerie
modificarBienestar :: Int -> Serie -> Serie
modificarBienestar num unaSerie = unaSerie { bienestar = (criterio1 unaSerie + criterio2 unaSerie) * num}
-- PUNTO 6
esControvertida :: Serie -> Bool
esControvertida unaSerie = sueldosMenorMayor (actores unaSerie)
sueldosMenorMayor :: [Actor] -> Bool
sueldosMenorMayor (x:y:z) = sueldoPretendido x < sueldoPretendido y && sueldosMenorMayor (y:z)