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 ganadoresMTotales (M: int, j: JJOO) : [Pais] = [nacionalidadPrimerosTres(c)[M] | 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, ganadoresMTotales(0,j)), cuenta(p, ganadoresMTotales(1,j)), cuenta(p, ganadoresMTotales(2,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.