NumPy: вычисления и устройство массивов

Сортировка массивов: sort и argsort

Содержание курса

Турнирная таблица: сортировка участников по оценке через argsort

Рейтинг олимпиады

Организационный комитет ежегодной городской олимпиады по математике завершил проверку работ. Каждый участник получил целочисленную оценку — количество набранных баллов. Оценки у всех разные: система проверки устроена так, что ничья невозможна. Теперь нужно сформировать итоговую турнирную таблицу: список участников, упорядоченный от наименьшего результата к наибольшему.

Почему от наименьшего? Оргкомитет придерживается традиции «восходящего рейтинга»: в финальном протоколе первым идёт участник с минимальным баллом, а победитель — в самом конце. Это удобно для последующей рассылки: письма с поздравлениями отправляются в обратном порядке чтения таблицы, и победитель получает своё письмо последним — в торжественный момент церемонии.

Откуда берутся данные

Секретарь олимпиады формирует два списка в том порядке, в котором участники сдавали работы:

  • список имён участников;
  • список оценок — по одной на каждого участника, в той же позиции.

Например, если Алиса сдала работу первой и получила 72 балла, то в списке имён на первом месте стоит «Алиса», а в списке оценок на первом месте стоит 72. Важно, что порядок сдачи работ не несёт смысловой нагрузки — он случаен.

Что требуется от программы

Программа-помощник секретаря должна принять оба списка и выдать четыре строки итогового протокола.

Первая строка — это перестановочный индекс: для каждой позиции в отсортированном рейтинге указывается, какой номер (считая с нуля) имел соответствующий участник в исходном списке сдачи работ. Эта строка нужна техническому отделу для сверки с архивом бумажных работ.

Вторая строка — отсортированные оценки участников: от минимальной к максимальной. Бухгалтерия использует её для расчёта призового фонда.

Третья строка — имена участников в том же порядке, что и отсортированные оценки. Это и есть сам рейтинг, который вывешивается на доску объявлений.

Четвёртая строка — техническая метка формата: она фиксирует размерность каждого из трёх результирующих массивов. Системный администратор использует её для автоматической валидации файла перед загрузкой в базу данных. Метка имеет строго определённый вид: shape idx=(n,) scores_sorted=(n,) names_sorted=(n,), где вместо n подставляется конкретное число участников.

Важное техническое ограничение

Программа не должна изменять исходные списки имён и оценок — они могут понадобиться секретарю позже в исходном виде (например, для формирования справок в порядке сдачи работ). Поэтому сортировка выполняется через вычисление индекса перестановки (np.argsort), который возвращает новый массив и не затрагивает исходные данные.


Формальный контракт

Входные данные (stdin):

n
name_0 name_1 ... name_{n-1}
score_0 score_1 ... score_{n-1}
  • Первая строка — целое число n (количество участников).
  • Вторая строка — n имён через пробел; читается как одномерный массив np.array.
  • Третья строка — n попарно различных целых чисел через пробел (оценки); читается как np.array(..., dtype=int).

Действия:

  1. Вычислить idx = np.argsort(scores) — массив индексов, упорядочивающих оценки по возрастанию.
  2. Применить idx к scores и к names через fancy indexing, получив scores_sorted и names_sorted.
  3. Убедиться, что исходные scores и names не изменились.

Выходные данные (stdout) — ровно четыре строки:

idx_0 idx_1 ... idx_{n-1}
score_sorted_0 score_sorted_1 ... score_sorted_{n-1}
name_sorted_0 name_sorted_1 ... name_sorted_{n-1}
shape idx=(n,) scores_sorted=(n,) names_sorted=(n,)
  • Элементы в строках 1–3 разделены одиночными пробелами.
  • В строке 4 вместо n стоит конкретное число участников, например (5,) при n=5.
  • Никаких дополнительных строк, пробелов в конце строк или пустых строк выводить не нужно.
О данных в ответах

Используйте учебные данные. Не вставляйте пароли, токены, ключи доступа, паспортные и банковские данные, а также персональные данные других людей. Политика обработки данных.

Проверяется тестами (1)
  • Тест 1
    Ввод
    5
    Алиса Борис Вера Глеб Дина
    72 45 91 60 83
    Ожидаемый вывод
    1 3 0 4 2
    45 60 72 83 91
    Борис Глеб Алиса Дина Вера
    shape idx=(5,) scores_sorted=(5,) names_sorted=(5,)
Решение
Как проверяется решение

Сравнение вывода: Правила исходной проверяющей системы. Интерактивный запуск не влияет на оценку. Лимит сессии — 5 минут, процессорного времени — 10 секунд.

Отправьте решение, чтобы увидеть результаты тестов.