Пуши | Doubletapp
RU / EN
+7 (495) 003 46 87Consultation

Пуши

Ограничение по времени на тест: 2 секунды

Ограничение по памяти на тест: 128 мегабайт

Ввод: стандартный ввод

Вывод: стандартный вывод

Представьте, что вы разрабатываете мобильное приложение, получающее пуш-уведомления, которое локально принимает решение, нужно ли их показать пользователю. Пуши бывают разных типов, разные типы пушей могут фильтроваться разными правилами. Некоторые правила подходят к нескольким типа пушей. Вам нужно разработать систему, которая бы умела фильтровать входящие пуши. Система должна уметь принимать на вход параметры, определяющие свое состояние. Параметры, которые может принимать система следующие:
  • time — время, установленное на устройстве, тип long;
  • age — возраст пользователя, тип int;
  • gender — пол пользователя, возможные значения: m, f;
  • os_version — версия операционной системы, тип int;
  • x_coord — x координата пользователя в условных единицах, тип float;
  • y_coord — y координата пользователя в условных единицах, тип float.
Также система получает пуши. Пуши бывают разного типа, у всех пушей есть следующие параметры:
  • text — текст для показа, тип string;
  • type — тип пуша;
Типы пушей:
  • LocationPush — пуш с дополнительными параметрами: x_coord (float), y_coord (float), radius (int), expiry_date (long);
  • AgeSpecificPush — пуш с дополнительными параметрами: age (int), expiry_date (long);
  • TechPush — пуш с дополнительным параметром os_version;
  • LocationAgePush — пуш с дополнительными параметрами: x_coord (float), y_coord (float), radius (int), age (int);
  • GenderAgePush — пуш с дополнительными параметрами: gender, age (int);
  • GenderPush — пуш с дополнительными параметрами gender.
Набор правил фильтрации:
  • Фильтрация по положению. Применяется для пушей типа LocationPush, LocationAgePush. Правило: если координаты системы по евклидову расстоянию x_coord, y_coord строго дальше от координат пуша на radius из пуша, то пуш должен быть отфильтрован (т.е. не показан).
  • Фильтрация по возрасту. Применяется для пушей типа AgeSpecificPush, LocationAgePush, GenderAgePush. Правило: если age, указанный в пуше, строго больше, чем age, заданный системе, то пуш должен быть отфильтрован.
  • Фильтрация по версии системы. Применяется для TechPush. Правило: если os_version в системе строго больше, чем os_version в пуше, то пуш должен быть отфильтрован (то есть, пуш показывается на равных и более старых версиях, чем указано в пуше).
  • Фильтрация по дате протухания пуша. Применяется для LocationPush, AgeSpecificPush. Правило: если expiry_date у пуша строго меньше, чем time в системе, то пуш должен быть отфильтрован.
  • Фильтрация по полу. Применяется для пушей GenderAgePush, GenderPush. Правило: если gender, указанный в системе, отличен от переданного в пуше, то пуш должен быть отфильтрован.

Входные данные

1. В первых 6-и строках через пробел — параметры системы в случайном порядке. 2. В следующей строке — количество пушей 3. раз: следующая строка — количество параметров пуша после которой идет строк с параметрами пуша в случайном порядке.

Выходные данные

Для каждого неотфильтрованного пуша поле text с новой строки в той же последовательности, в которой они пришли во входных данных (например, если пришло 3 пуша, а система отфильтровала только 2-ой пуш, то нужно вывести text сначала 1-го, а потом 3-го пуша). Если система отфильтровала все пуши, то вывести -1.

Примеры

входные данные

time 10000

gender m

age 21

os_version 15

x_coord 45.1

y_coord 45.5

2

6

type LocationAgePush

text Cheap_beer_in_your_area

age 18

x_coord 44.1

y_coord 50.0

radius 10

3

type TechPush

text Update_is_available

os_version 14

выходные данные

Cheap_beer_in_your_area

входные данные

time 10000

gender m

age 15

os_version 15

x_coord 45.1

y_coord 45.5

1

6

type LocationAgePush

text Cheap_beer_in_your_area

age 18

x_coord 44.1

y_coord 50.0

radius 4

выходные данные

-1

Примечание

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

Читайте наш блог

UX для НЕдизайнеров, или что должен знать разработчик мобильных приложений

21 мая 2020

В статье мы рассмотрим типичные проблемы в UX, которые встречаются в приложениях как стартапов, так и больших корпораций.

Read

Как мы провели курс по Android-разработке в УрФУ (feat. СКБ Контур)

14 апреля 2020

Как организовали тестовое, построили процесс подготовки к лекциям и приёма домашних заданий, как перешли в онлайн.

Read

Опыт вместо денег: как (не) заработать на мобильном приложении в России

9 апреля 2020

Рассказ наших клиентов об истории развития и продажах мобильного приложения для медитаций.

Read