Ded Moroz Competition

Вы все - сотрудники Ded Moroz Inc. Все вы начинаете в аэропорту Великого Устюга, и вам нужно развести новогодние подарки во все аэропорты Земли (в нашей игре их 1812).

Находясь в каком-то аэропорту вы можете совершать перелет в любой другой аэропорт, находящийся в радиусе не более 1000 км от того, где вы находитесь. Попадая в какой-то из аэропортов раньше других Дедов Морозов, вы доставляете туда новогодние подарки.

Ваша задача написать программу, которая будет управлять перемещениями вашего Деда Мороза. При этом есть две цели:

Подготовка

Для успешной работы вам понадобиться установить модуль requests. Если вы работаете из школы, для вас будут другие инструкции. Если вы работает из дома, то вам нужно выполнить команду

pip install requests

А еще вам нужно скачать и положить в ту же папку, где будет лежать ваша программа, специальный модуль dedmoroz.py. Вы можете изучать его код, но не должны вносить в него никаких изменений.

Для работы вам также понадобятся логин и токен для вашего Деда Мороза (берется у ВАМ).

Еще вам может оказаться полезным файл с данными об аэропортах игры.

Начало

В начале вашей программы вы должны написать следующие две строчки:

import dedmoroz
Если вы пишете из школы, то вторая строчка будет такая:
ya = dedmoroz.dedmoroz("login", "token", "Ded Moroz 1")
а если вы участвуете из дома:
ya = dedmoroz.dedmoroz("login", "token", "Ded Moroz 1", home=True)
Вместо login и token вы должны указать выданные вам логин и токен, а вместо Ded Moroz 1 - любое имя, под которым вы хотите отображаться в игре. Имя можно менять от запуска к запуску.

Теперь ваш Дед Мороз добавлен в текущую игру, а у вас в программе есть объект ya - это, собственно, ваш Дед Мороз. Вы можете давать ему разные команды или получать какую-то информацию об игре.

Что можно делать

Всегда, когда вы хотите в команду передать в качестве параметра аэропорт, нужно указывать его трехбуквенный код, а когда пользователя - его логин.

city = ya.whereami()
Команда возвращает строку - код аэропорта, где сейчас находится ваш Дед Мороз (команда не делает запроса к серверу)
city = ya.getneighbors()
Команда возвращает список аэропортов, куда вы можете долететь из текущего местоположения (команда не делает запроса к серверу)
n = ya.moveto(city)
Команда перемещает вашего Деда Мороза в указанный вами город city. Если в город переместиться нельзя (например, он слишком далеко), то программа завершится с ошибкой. Результатом команды является список городов, в которые он может переместиться из того города, куда он только что прилетел.
route = ya.userroute()
или
route = ya.userroute(user)
Получает список городов, посещенных пользователем в том порядке, в каком он их посещал. Последний город - это текущее положение. Если пользователь посещал город несколько раз, он будет несколько раз упомянут в списке. Если длина маршрута игрока более 10000 городов, то будут возвращены последние 10000. В качестве параметра указывается логин пользователя. Параметр можно не указывать, тогда вы получите свой маршрут.
users = ya.players()
Результатом команды является словарь, в котором ключами являются логины игроков, а значениями - города, в которых они находятся. Например, если у нас два игрока с логинами login1 и login2, то результат может быть, например, таким:
{"login1": "DME",
 "login2": "VKO"}
airports = ya.airports()
Результатом команды является информация обо всех аэропортах. Результат представляет собой словарь, в котором ключами являются коды аэропортов, а значениями - словари с информацией. Как мог бы выглядеть ответ, если бы аэропортов было всего 2:
{
"VKO": {
         'code': 'VKO', 
         'latlon': [55.60315, 37.2921], 
         'name': 'Внуково', 
         'owner': "login1"
    },
"SVO": {
         'code': 'SVO', 
         'latlon': [55.966324, 37.416573], 
         'name': 'Шереметьево', 
         'owner': None
    }
}
В этом словаре есть следующие поля:
  • code - код аэропорта, всегда совпадает с ключом записи,
  • latlon - список из двух чисел - координаты аэропорта,
  • name - строковое название аэропорта,
  • owner - если в аэропорт уже доставлены подарки, то логин того, кто их доставил. Если подарки еще не доставлены, то None (специальное значение, это не строка, оно пишется без кавычек).
distance = dedmoroz.distance_coords(a, b)
В модуле dedmoroz функция distance_coords вычисляет расстояние между двумя точками по их координатам. Каждый из параметров - это список из двух чисел, задающих latitude и longitude точек. Результат - расстояние в метрах. Например, если у вас есть структура airports (полученная командой airports = ya.airports()) с информацией об аэропортах, то посчитать расстояние между VKO (Внуково) и VUS (Великий Устюг) можно так:
d = dedmoroz.distance_coords(airports["VKO"]["latlon"], airports["VUS"]["latlon"])

Важные замечания

Все запросы, кроме ya.whereami() и ya.getneighbors(), выполняются в течение 1 секунды.

Запросы ya.whereami() и ya.getneighbors() выполняются без обращения на сервер. Они могут возвращать устаревшую информацию, если кто-то еще управляет вашим Дедом Морозом.

В процессе игры при вызове функций модуля на экран пишется некоторая информация, которуя может быть полезна для понимая происходящего.

Если ваша программа упадет с ошибкой, или вы приостановите ее работу, ваш Дед Мороз останется в том месте, куда он дошел, и все посещенные им города никуда не денутся. Когда вы запустите программу заново, вы продолжите с того места, на котором остановились.

И что?

Наблюдать за процессом игры можно тут: