Paradigma Funcional - TP 1
RALLY
Se requiere desarrollar un programa en Haskell para procesar la información acerca de los resultados de un rally.
Las velocidades promedio de cada corredor sobre las distintas superficies son las siguientes:
En ripio, Fer tiene una velocidad promedio de 92 km/h, Pablo de 65 km/h y Mati de 90 km/h. Sobre asfalto, Mati circula a 80 km/h, Fer a 90 km/h y Pablo a 100 km/h.
Modelar la información anterior en una Ćŗnica función, utilizando el concepto de āpattern matchingā.
Definir una función que nos permita saber cual es el mÔs rÔpido entre dos pilotos sobre una superficie dada (en caso de igualdad, devolver uno cualquiera de los dos).
Queremos saber si un piloto esta chiflado. Un piloto estĆ” chiflado si su nivel de locura es mayor a 500.
El nivel de locura de un piloto estĆ” dado por la sumatoria de los nĆŗmeros que se encuentran entre la velocidad promedio en asfalto y hasta la velocidad promedio en ripio (incluyendo estos lĆmites), siempre que la de ripio sea mayor o igual que la de asfalto. Si, en cambio, la velocidad promedio en asfalto es mayor a la de ripio, entonces su nivel de locura es de cero.
Ejemplos: Fer tiene una velocidad promedio de 90 km/h sobre asfalto y de 92 km/h sobre ripio. Su nivel de locura es de 90 + 91 + 92 = 273, por lo tanto no estĆ” chiflado.
Pablo tampoco estĆ” chiflado. Tiene un nivel de locura de 0, porque su velocidad en asfalto es mayor a la de ripio.
Mati tiene un nivel de locura de 935 (80 + 81 + 82 +... + 90), por lo tanto sĆ estĆ” chiflado.
Determinar si un piloto conduce una catramina. Decimos que un piloto conduce una catramina cuando las velocidades promedio tanto sobre ripio como sobre asfalto son menores a 95 km/h.
En los ejemplos dados, Ćŗnicamente Pablo no conduce una catramina, porque sobre asfalto tiene una velocidad promedio de 100 km/h. Fer y Mati no llegan al lĆmite, ni sobre ripio ni sobre asfalto, por lo tanto decimos que sĆ conducen catraminas.
A partir de este punto, se elige representar la información de cada corredor en la competencia como una lista de ternas (origen, destino, tiempo de sprints medido en minutos), cada terna representa un tramo del rally. Por ejemplo:
cocho = [("bsas","rosario",[45,41,38]),
Ā Ā Ā Ā Ā Ā Ā Ā ("rosario","cordoba",[72,76,73]),
Ā Ā Ā Ā Ā Ā Ā Ā ("cordoba","tucuman",[107,104,112])]
lucho = [("bsas","rosario",[36,35,40]),
Ā Ā Ā Ā Ā Ā Ā Ā ("rosario","cordoba",[79,77,83]),
Ā Ā Ā Ā Ā Ā Ā Ā ("cordoba","tucuman",[92,102,99]),
Ā Ā Ā Ā Ā Ā Ā Ā ("tucuman","santiago",[65,68,63])]
pedro = [("bsas","rosario",[43,47,44]),
Ā Ā Ā Ā Ā Ā Ā Ā ("rosario","cordoba",[74,68,71]),
Ā Ā Ā Ā Ā Ā Ā Ā ("santiago","salta",[70,82,95,51])]
vueltaArgentina = [("cocho",cocho),("lucho",lucho),("pedro",pedro)]
Nota: De acĆ” en adelante, cuando hablemos de āun corredorā, vamos a estar haciendo referencia a la lista de tramos del corredor, como se ve en los ejemplos (notar que se usan funciones constantes, no strings).
Definir las siguientes funciones:
5. esTramoEntre: dados un par de ciudades y un tramo (terna) indica si el origen y el destino del tramo son las ciudades del par, respetando el orden. Por ejemplo entre estas tres
esTramoEntre ("bsas","rosario") ("bsas","rosario",[36,35,40])
esTramoEntre ("bsas","cordoba") ("bsas","rosario",[36,35,40])
esTramoEntre ("rosario","bsas") ("bsas","rosario",[36,35,40])
la primera devuelve True, mientras que las otras dos devuelven False.
6. tiempos: dados un par (origen,destino) y un corredor, devuelve la lista de tiempos de los sprints del tramo entre las ciudades del par para ese corredor. Por ejemplo
tiempos ("bsas","rosario") lucho
devuelve [36,35,40].
7. incluyeTramoEntre: que dados un par (origen,destino) y un corredor, indica si el corredor hizo el tramo entre el par de ciudades. Por ejemplo, en:
incluyeTramoEntre ("santiago","salta") cocho
incluyeTramoEntre ("bsas","rosario") cocho
la primera devuelve False y la segunda devuelve True.
8. cuantosLesFaltaTramoEntre: dados un par (origen,destino) y una lista de corredores, devuelve la cantidad que no hicieron el tramo indicado. Por ejemplo
cuantosLesFaltaTramoEntre ("cordoba","tucuman") [cocho,lucho,pedro]
devuelve 1, porque ese tramo le falta a Pedro y a nadie mƔs.
9. primeroMenor y ultimoMenor: indican en una lista de nĆŗmeros si el primer elemento/Ćŗltimo elemento son los menores de la lista. Por ejemplo en
primeroMenor [45,41,38]
primeroMenor [92,102,99]
ultimoMenor [45,41,38]
ultimoMenor [92,102,99]
la primera y la cuarta devuelven False; segunda y tercera devuelven True.
Se puede usar la función minimum, la cual existe en el Prelude. Esta función recibe una lista y devuelve el menor de sus elementos.
Notas:
Para algunos Ćtems es recomendable definir alguna función auxiliar, vale hacerlo.
TambiĆ©n es vĆ”lido usar las funciones definidas en Ćtems anteriores.