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