| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- 8.
- problema medallero (j: JJOO) = result : [(Pais, [Z])]{
- //Se asegura que el resultado y el medallero sin repeticiones tengan los mismos elementos.
- asegura mismos(result, sacarSinMedallas(crearMedallero(j)));
- //Se asegura de que el medallero esté ordenado de mayor a menor.
- asegura medalleroOrdenado(result);
- }
- aux listaNacionalidadesAtletas(j: JJOO) : [Pais] = [nacionalidad(at) | at <-- atletas(j)];
- //Crea una lista a partir de las nacionalidades de los atletas. Si hay dos atletas rusos, Rusia aparece dos veces.
- aux sacarRepeticiones(ls : [T]) : [T] = [ls[x] | x <- [0..|ls|-1], ¬en(ls[x], ls[0..x-1])];
- //Dada una lista cualquiera, describe una lista con una sola aparición de cada elemento de la lista original.
- aux listaPaises(j: JJOO) : [Pais] = sacarRepeticiones(listaNacionalidadesAtletas(j));
- //ListaPaises decribe la lista de los países participantes de los juegos, sin repeticiones.
- aux cuenta(x: T, a: [T]): Int = long([y | y <- a, y == x]);
- //Cuenta las apariciones del elemento x en la lista a.
- aux nacionalidadPrimerosTres(c:Competencia):[Pais] =
- [ifthenelse(i<=|ranking (c)|-1, nacionalidad(ranking(c)[i]), "Narnia")| i <- [0..2]];
- //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.
- aux ganadoresOroTotales (j: JJOO) : [Pais] =
- [nacionalidadPrimerosTres(c)[0] | dia <-- [1.. jornadaActual(j)], c <-- cronograma(j, dia), finalizada(c)];
- //Describe una lista de todos los países que ganaron oro hasta ahora. Si ganó varias veces, aparece varias veces en la lista.
- aux ganadoresPlataTotales (j: JJOO) : [Pais] =
- [nacionalidadPrimerosTres(c)[1] | dia <-- [1.. jornadaActual(j)], c <-- cronograma(j, dia), finalizada(c)];
- //Describe una lista de todos los países que ganaron plata hasta ahora. Si ganó varias veces, aparece varias veces en la lista.
- aux ganadoresBronceTotales (j: JJOO) : [Pais] =
- [nacionalidadPrimerosTres(c)[2] | dia <-- [1.. jornadaActual(j)], c <-- cronograma(j, dia), finalizada(c)];
- //Describe una lista de todos los países que ganaron bronce hasta ahora. Si ganó varias veces, aparece varias veces en la lista.
- aux crearMedallero (j: JJOO) : [(Pais, [Z])] =
- [(p, [cuenta(p, ganadoresOroTotales(j)), cuenta(p, ganadoresPlataTotales(j)), cuenta(p, ganadoresBronceTotales(j))]) | p <-- listaPaises(j)];
- //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.
- aux sacarSinMedallas(lista : [(Pais, [Z])]) : [(Pais, [Z])] = [x | x <-- lista, sgn(x)!=[0,0,0]];
- //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.
- aux medalleroOrdenado(lista : [(Pais, [Z])]) : Bool =
- paraTodo(x<--[0..|lista|-2]) ((sgd(lista[x])[0]>=sgd(lista[x+1])[0])
- || ((sgd(lista[x])[0]==sgd(lista[x+1])[0])&&(sgd(lista[x])[1]>=sgd(lista[x+1])[1]))
- || ((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])));
- //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.
|