punto 13 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /*
  2. * Por cada dı́a, el mejor paı́s es aquél que más medallas de oro ganó.
  3. * En caso de haber un empate, nos quedaremos con el menor paı́s comparando lexicográficamente (pais mejor < pais otro).
  4. * Si un dı́a nadie ganó una medalla de oro, ese dı́a se saltea y no aparece en la lista.
  5. */
  6. Problema 13 uyOrdenadoAsíHayUnPatrón(j:JJOO) = res : Bool
  7. //??
  8. asegura res == True IF |mejoresPaises(j)|==|sinRepes(mejoresPaises(j)))|
  9. //Si el primero esta 1 vez y alguno de los otros se repite => explota a la mierda
  10. asegura res == False IF contar(primero...)==1 && |mejoresPaises(j)|>|sinRepes(mejoresPaises(j)))|
  11. asegura res ==
  12. IF |mejoresPaises(j)|==|sinRepes(mejoresPaises(j)))| then
  13. true
  14. else
  15. IF contar(primero...)==1 && |mejoresPaises(j)|>|sinRepes(mejoresPaises(j)))| then
  16. false
  17. else
  18. (paratodo i←[0..|mejorespaises(j)|-1],
  19. k←[0..|mejoresPaises(j)|-1],
  20. i mod |patron(mejoresPaises(j))| == k mod |patron(mejoresPaises(j))| )
  21. s[i] == s[k]
  22. //Caso borde: nunca repite el primero => valido siempre?
  23. aux mejoresPaises(j :JJOO) : [Paises] =
  24. [ cab(ordenar(masOrosDelDia(j,d) ) | d ← [1.. jornadaActual(j) - 1], cronograma(j,d) != [ ], masOrosDelDia(j,d) != [] ]
  25. aux patron(ls: [T]) : [T] =
  26. if |ls|==1 then
  27. ls
  28. else
  29. sub(ls, 0, min ( [ i | i <- [1..|ls|-1], ls[i] == ls[0] ] ) )
  30. aux masOrosDelDia( j:JJOO, d: dia) : [pais] =
  31. filtrarTuplaPorPrmMax(j, uniqSgdLista( tuplasMedallOroComaPais(j,d) ), d)
  32. aux tuplasMedallaOroComaPais(j : JJOO, d: Dia) : [(int, Pais)]
  33. [ ( contar(pais,PaisesConOroTalDia(j,d)), pais ) | pais <- paisesConOroTalDia(j,d) ]
  34. aux paisesConOroTalDia(j:JJOO, d: Dia) : [Pais]
  35. [ pais (cab(ranking(c)) | c ← cronograma (j,d), finalizada(c) && |ranking(c)|>0 ]
  36. \aux{uniqSgdLista}{ls:[(\ent,\ent)]}{[(\ent,\ent)]}
  37. {[ ls(i) | i \leftarrow [0..|ls|-1], j\leftarrow [0..|ls|-1], i \neq j, sgd(ls[i]) \neq sgd(ls[j]) ]}
  38. aux filtrarTuplaPorPrmMax(j:JJOO, ls:[(\ent,Pais)], d:Dia) : [Pais]
  39. [ sgd(tupla) | tupla <- tuplasMedallaOroComaPais(j,d), prm(tupla) >= maxListaTuplas(tuplasMedallaOroComaPais(j,d)) ]
  40. aux maxListaTuplas( ls: [(ent, Pais)]) : ent =
  41. max([ prm(tupla) | tupla <- ls ])
  42. }