Ближайшие записи лога по двум метрикам

тема: Расстояния и kNN · уровень: средний

Условие

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

Для заданной точки с координатами (p, t) требуется независимо найти две записи журнала: ближайшую по манхэттенскому расстоянию и ближайшую по евклидову расстоянию. Координатами записи являются pages_viewed и active_minutes.

Манхэттенское расстояние между запросом (p, t) и записью (x, y) равно |p - x| + |t - y|. Евклидово расстояние равно sqrt((p - x)^2 + (t - y)^2).

Строки, в которых пропущено число страниц или время активности, не участвуют в поиске. Гарантируется, что после исключения таких строк остаётся хотя бы одна запись. При равенстве расстояний выбирается запись, расположенная раньше в файле data.csv.

Округление не выполняется: требуется вывести два целых номера записей.

Формат ввода

В стандартный ввод подаются два целых числа p и t через пробел: число просмотренных страниц и время активности точки запроса.

Рядом с программой находится файл data.csv в кодировке UTF-8. Разделитель полей — запятая, первая строка содержит заголовок. Файл содержит столбцы log_id, visit_date, pages_viewed, active_minutes, device.

Формат вывода

Выведите через пробел два целых числа: сначала log_id ближайшей записи по манхэттенскому расстоянию, затем log_id ближайшей записи по евклидову расстоянию.

Ограничения

В файле от 300 до 2000 строк с данными.

log_id — целое число от 1 до 1000000, номера записей не повторяются.

visit_date имеет длину 10 символов и записана в формате YYYY-MM-DD.

pages_viewed — целое число от 0 до 300 или пустая строка.

active_minutes — целое число от 0 до 720 или пустая строка.

device — строка длиной от 2 до 12 символов.

Во входных данных 0 ≤ p ≤ 300, 0 ≤ t ≤ 720.

Решить задачу с автопроверкой на Python →

Куда дальше