Cursosā€Ž > ā€ŽCursadas Anterioresā€Ž > ā€Ž2014ā€Ž > ā€ŽMaƱ-SĆ”badoā€Ž > ā€Ž

TP Funcional 1

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.


  1. Modelar la información anterior en una Ćŗnica función, utilizando el concepto de ā€œpattern matchingā€.


  1. 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).


  1. 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.


  1. 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.