Кинотеатр "Сокол" запустил сервис для онлайн-просмотра фильмов. За несколько месяцев работы сервиса накопилась история просмотров разными пользователями и владельцы решили внедрить в него систему рекомендаций, которая предлагала бы пользователям интересный фильм на основе их истории просмотров.
У вас есть два файла, которые нужно добавить в свой репозиторий:
- Список доступных фильмов. Где каждая строка содержит числовой идентификатор фильма и его название, разделенные запятой.
Например:
1,Мстители: Финал
2,Хатико
3,Дюна
4,Унесенные призраками
- История просмотров по всем пользователям сервиса. Каждая строка файла содержит список идентификаторов фильмов, просмотренных одним человеком за все время пользования сервисом. Идентификаторы разделены запятыми. Например:
2,1,3
1,4,3
2,2,2,2,2,3
На основе этих данных реализуйте алгоритм рекомендаций, который бы для списка просмотров конкретного пользователя рекомендовал следующий фильм.
Алгоритм выбора рекомендации:
-
Для просмотров пользователя из историй по всем пользователям выбираются те, у которых хотя бы половина фильмов совпадает с заданной. (То есть, выбираются все пользователи, которые посмотрели минимум половину фильмов пользователя, для которого формируется рекомендация.)
-
Из отобранных списков исключаются все, которые пользователь уже посмотрел.
-
Для оставшегося списка фильмов подсчитывается суммарное количество просмотров среди всех пользователей сервиса и фильм с максимальным числом просмотров выбирается как рекомендация (если таких фильмов оказалось несколько, выбирается любой из них).
Список просмотров текущего пользователя задается через пользовательский ввод, рекомендация выдается в виде названия фильма в System.out. Пути к файлам с названиями фильмов и истории просмотров пользователей сервиса могут быть определены в виде констант в приложении.
[in]
2,4
[out]
Дюна
Усложнения:
- чем больше общих фильмов просмотрено - тем больше вес этих рекомендаций. (Половина - 0.5, 70% в общих - 0.7, все фильмы совпали - 1). 1 - все фильмы которые выбрал новый пользователь - были просмотрены нашим клиентом.
Ваша команда разрабатывает приложение для проведения социологических опросов. Вы работаете над модулем разбивки респондентов по возрастным группам. При этом модуль вы реализуете в виде отдельного Python-приложения, работающего со стандартными потоками ввода-вывода. На вход оно принимает список участников опроса в текстовом виде, на выходе выдает их разбивку по группам возрастов.
В качестве аргументов командной строки приложению указывается последовательность чисел, задающих границы возрастных групп.
18 25 35 45 60 80 100
Эта последовательность определяет возрастные группы: от 0 до 18 лет, от 19 до 25 лет, от 26 до 35 лет и так далее. Последняя группа: от 101 года и старше.
Входные данные (список респондентов) задаются в виде строк:
<ФИО>,<возраст>
Строка END сигнализирует об окончании списка.
Выходные данные (разбивка по возрастным группам) представлены как последовательность строк следующего формата:
<Группа>: <ФИО_1> (возраст_1), <ФИО_2> (возраст_2), …, <ФИО_N> (возраст_N)
При этом:
- группы строк перечисляются в порядке от старшей к младшей
- в каждой группе перечисляются только респонденты, попадающие в нее по возрасту
- список респондентов в каждой группе отсортирован по возрасту в порядке убывания, если возраст совпадает - по ФИО в порядке возрастания
- если в возрастную группу не попадает ни один из респондентов, строка с этой группой не выводится
101+: Кошельков Захар Брониславович (105)
81-100: Дьячков Нисон Иринеевич (88), Иванов Варлам Якунович (88)
46-60: Старостин Ростислав Ермолаевич (50)
26-35: Ярилова Розалия Трофимовна (29)
0-18: Соколов Андрей Сергеевич (15), Егоров Алан Петрович (7)
При реализации можно учитывать, что:
- нет людей старше 123 лет
- в рамках одного опроса не может встретиться полных однофамильцев с одинаковыми возрастами
Реализуйте приложение. При этом постарайтесь продумать структуру данных и использовать коллекции, максимально подходящие для поставленных целей.