punto 8 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. 8.
  2. problema medallero (j: JJOO) = result : [(Pais, [Z])]{
  3. //Se asegura que el resultado y el medallero sin repeticiones tengan los mismos elementos.
  4. asegura mismos(result, sacarSinMedallas(crearMedallero(j)));
  5. //Se asegura de que el medallero esté ordenado de mayor a menor.
  6. asegura medalleroOrdenado(result);
  7. }
  8. aux listaNacionalidadesAtletas(j: JJOO) : [Pais] = [nacionalidad(at) | at <-- atletas(j)];
  9. //Crea una lista a partir de las nacionalidades de los atletas. Si hay dos atletas rusos, Rusia aparece dos veces.
  10. aux sacarRepeticiones(ls : [T]) : [T] = [ls[x] | x <- [0..|ls|-1], ¬en(ls[x], ls[0..x-1])];
  11. //Dada una lista cualquiera, describe una lista con una sola aparición de cada elemento de la lista original.
  12. aux listaPaises(j: JJOO) : [Pais] = sacarRepeticiones(listaNacionalidadesAtletas(j));
  13. //ListaPaises decribe la lista de los países participantes de los juegos, sin repeticiones.
  14. aux cuenta(x: T, a: [T]): Int = long([y | y <- a, y == x]);
  15. //Cuenta las apariciones del elemento x en la lista a.
  16. aux nacionalidadPrimerosTres(c:Competencia):[Pais] =
  17. [ifthenelse(i<=|ranking (c)|-1, nacionalidad(ranking(c)[i]), "Narnia")| i <- [0..2]];
  18. //Dada una competencia finalizada, describe una lista con los primeros tres países del ranking. Si el ranking tiene menos de tres elementos, rellena los otros con Narnia.
  19. aux ganadoresOroTotales (j: JJOO) : [Pais] =
  20. [nacionalidadPrimerosTres(c)[0] | dia <-- [1.. jornadaActual(j)], c <-- cronograma(j, dia), finalizada(c)];
  21. //Describe una lista de todos los países que ganaron oro hasta ahora. Si ganó varias veces, aparece varias veces en la lista.
  22. aux ganadoresPlataTotales (j: JJOO) : [Pais] =
  23. [nacionalidadPrimerosTres(c)[1] | dia <-- [1.. jornadaActual(j)], c <-- cronograma(j, dia), finalizada(c)];
  24. //Describe una lista de todos los países que ganaron plata hasta ahora. Si ganó varias veces, aparece varias veces en la lista.
  25. aux ganadoresBronceTotales (j: JJOO) : [Pais] =
  26. [nacionalidadPrimerosTres(c)[2] | dia <-- [1.. jornadaActual(j)], c <-- cronograma(j, dia), finalizada(c)];
  27. //Describe una lista de todos los países que ganaron bronce hasta ahora. Si ganó varias veces, aparece varias veces en la lista.
  28. aux crearMedallero (j: JJOO) : [(Pais, [Z])] =
  29. [(p, [cuenta(p, ganadoresOroTotales(j)), cuenta(p, ganadoresPlataTotales(j)), cuenta(p, ganadoresBronceTotales(j))]) | p <-- listaPaises(j)];
  30. //Para cada país participante en los juegos, describe una tupla con el nombre del país y una lista que consiste en tres ints, que son la cantidad de veces que el país aparece en la lista de ganadores de medallas de oro, de plata y de bronce respectivamente. Como Narnia no participa en los juegos, no aparece en la lista resultante.
  31. aux sacarSinMedallas(lista : [(Pais, [Z])]) : [(Pais, [Z])] = [x | x <-- lista, sgn(x)!=[0,0,0]];
  32. //Dada una lista de tuplas de países y listas de sus respectivas medallas, describe una lista subconjunto la anterior en la que solo aparecen los países que ganaron alguna medalla.
  33. aux medalleroOrdenado(lista : [(Pais, [Z])]) : Bool =
  34. paraTodo(x<--[0..|lista|-2]) ((sgd(lista[x])[0]>=sgd(lista[x+1])[0])
  35. || ((sgd(lista[x])[0]==sgd(lista[x+1])[0])&&(sgd(lista[x])[1]>=sgd(lista[x+1])[1]))
  36. || ((sgd(lista[x])[0]==sgd(lista[x+1])[0])&&(sgd(lista[x])[1]==sgd(lista[x+1])[1])&&(sgd(lista[x])[2]>=sgd(lista[x+1])[2])));
  37. //Dada una lista de paises con sus medallas [oro, plata, bronce], medalleroOrdenado vale true si todo elemento de la lista tiene más o igual medallas de oro que el siguiente, o tiene igual medallas de oro pero más o igual platas que el siguiente, o tiene igual medallas de oro y de plata pero más o igual de bronce que el siguiente.