Ranking zawodników

Zadanie 8 z 9 · rozdział 22Trudność: 2 z 3sortkeylambdatuple

Treść zadania

Wczytaj wyniki zawodów: dla każdego zawodnika jego imię, liczbę zdobytych punktów i czas (w sekundach). Ułóż ranking według następujących zasad:

  1. więcej punktów — wyższe miejsce (punkty malejąco),
  2. przy równej liczbie punktów: krótszy czas — wyższe miejsce (czas rosnąco),
  3. przy równych punktach i czasie zawodnicy dzielą miejsce, a w rankingu wypisujemy ich alfabetycznie według imienia (imię rosnąco).

Zawodnicy, którzy mają te same punkty i ten sam czas, zajmują to samo miejsce, a kolejne miejsca są pomijane — tak jak w sporcie: np. 1, 2, 2, 4. Miejsce zawodnika to $1 +$ liczba zawodników, którzy mają od niego lepszy wynik.

Dane wejściowe

  • 1. linia: liczba zawodników $N$
  • kolejne $N$ linii: imię punkty czas — imię (jedno słowo), punkty i czas (liczby całkowite $\ge 0$), oddzielone spacjami

Dane wyjściowe

$N$ linii w kolejności rankingu, każda w postaci:

<miejsce>. <imię> <punkty> <czas>

Ograniczenia

  • $1 \le N \le 100$
  • Imiona są różne.

Uwagi

  • Kilka kryteriów naraz zapiszesz jako krotkę zwracaną przez funkcję key — Python porównuje krotki element po elemencie: najpierw pierwsze elementy, a przy remisie kolejne.
  • Żeby posortować liczby malejąco w kluczu, który poza tym sortuje rosnąco, wystarczy je zanegować:
    sorted(zawodnicy, key=lambda z: (-z[1], z[2], z[0])) (dla krotek (imię, punkty, czas)).
  • Po posortowaniu miejsce zawodnika jest równe miejscu poprzednika, jeśli ma on te same punkty i czas, a w przeciwnym razie — jego pozycji w rankingu (licząc od 1).

Przykład

Wejście
5
Ola 90 300
Adam 95 320
Ewa 90 300
Kuba 90 280
Zosia 70 250
Wyjście
1. Adam 95 320
2. Kuba 90 280
3. Ewa 90 300
3. Ola 90 300
5. Zosia 70 250

Ewa i Ola mają te same punkty i ten sam czas, więc dzielą 3. miejsce (wypisujemy je alfabetycznie), a następna zawodniczka zajmuje miejsce 5.

Potrzebujesz teorii?

Zasady obowiązujące w rozdziale 22

Zadania w tym rozdziale pokazują, jak sortować w praktyce: napisy, słowa, pary, obiekty — często według własnego kryterium. Tutaj wolno (a nawet warto) korzystać z wbudowanych narzędzi Pythona: sorted(), list.sort() i parametru key=.

Konwencje wspólne:

  • Każde zadanie to osobny program: czyta standardowe wejście i wypisuje wynik na standardowe wyjście.
  • Jeśli wejściem jest napis — wczytaj całą linię (łącznie ze spacjami).
  • Jeśli wejściem jest lista — najpierw podana jest liczba elementów $N$, a potem elementy (w jednej linii albo w kolejnych liniach — zależnie od zadania).
  • Napisy porównujemy tak jak Python, czyli według kodów znaków Unicode: wielkie litery są „mniejsze” od małych ('Z' < 'a'), a polskie litery są „większe” od wszystkich liter alfabetu łacińskiego ('z' < 'ą').
  • Sortowanie w Pythonie (sorted(), list.sort()) jest stabilne: elementy równe według kryterium sortowania zachowują kolejność z wejścia. Korzystają z tego zadania, w których mogą wystąpić remisy.
  • Program nie wypisuje komunikatów typu „Podaj liczbę:”.

Zadanie pochodzi z otwartego zbioru Nauka-Programowania (z rozwiązaniami wzorcowymi). Zgłoś błąd w treści lub testach.

Python uruchomi się w przeglądarce przy pierwszym teście.

Kod zapisuje się automatycznie w tej przeglądarce. Tab wstawia wcięcie; aby opuścić edytor klawiaturą, naciśnij Esc, a potem Tab.

Testy

Program dostaje „Wejście” przez input() i musi wypisać „Oczekiwane wyjście”. Liczby porównywane są z tolerancją 0,01, a tekst podany w input("…") nie jest sprawdzany.

Test 1

Nie uruchomiono
Wejście
1
Solo 0 0
Oczekiwane wyjście
1. Solo 0 0

Test 2

Nie uruchomiono
Wejście
3
C 10 100
B 10 100
A 10 100
Oczekiwane wyjście
1. A 10 100
1. B 10 100
1. C 10 100

Test 3

Nie uruchomiono
Wejście
4
Zenon 50 200
Ania 50 200
bartek 50 199
Cyryl 60 500
Oczekiwane wyjście
1. Cyryl 60 500
2. bartek 50 199
3. Ania 50 200
3. Zenon 50 200

Test 4

Nie uruchomiono
Wejście
6
P1 5 10
P2 7 10
P3 5 9
P4 7 10
P5 5 10
P6 1 1
Oczekiwane wyjście
1. P2 7 10
1. P4 7 10
3. P3 5 9
4. P1 5 10
4. P5 5 10
6. P6 1 1

Test 5

Nie uruchomiono
Wejście
3
marek 10 50
Marek 10 50
łukasz 10 50
Oczekiwane wyjście
1. Marek 10 50
1. marek 10 50
1. łukasz 10 50
Uruchom z własnymi danymi