На днях решал Яндекс.Контест
На днях решал Яндекс.Контест 👨💻
Зарегался на мероприяте от Яндекс - Баттл Вузов. Баттл вузов — турнир по программированию среди студентов, финал которого пройдёт на сцене фестиваля-приключения Young Con.
Поскольку я студент, хоть и магистр, решил попробовать. Мне нравятся мероприятия Яндекс, научная миссия и компания в целом, вклад, который они вносят в российское IT-сообщество.
Сгенерировано в Шедеврум
Все по классике, если хочешь туда, где организатор Яндекс - решай задачки. Пришла мне после регистрации ссылка на Яндек.Контест, теперь подробнее расскажу про то, какие были задачи, а решения выложил в GitHub.
🤔 Но сначала пару мыслей) Безусловно понятно, почему и зачем эти задачи, они явно этим самым отбирают особо сильных ребят. В то же время так обидно пролетать, потому что не смог набрать порог, а задачи местами сложные, что даже идеи не возникает, как их решать.
Справедливости ради, в этом контесте задачи были нормальные. За исключением ограничений к этим задачам 😡
Все задачи, но не все их решения выложу в свой GitHub, подробности смотрите там.
За каждую задачу проставляются баллы.
Первая задача "Аналитика для начинающих" - 6 баллов из 6.
Задача простая. Вам дан скрипт, создающий некоторые таблицы БД. Необходимо написать параметризированный запрос с выводом определенных полей.
Ограничения: не больше двух операторов SELECT и единственным параметром запроса должно быть название артиста.
В комментариях к посту выложу условие и запрос, который я написал.
Вторая задача "Обработка заявок" - 0 баллов из 8.
Среднего уровня задачка, но как я сказал выше - есть ограничения (злой смайлик) По времени - 1 секунда, по памяти - 256 Мб. И вот я падал по TL (time limit). Я решений 4-5 перепробовал, с разным набором структур данных и никакое не входило в рамки. Вышло очень обидно.
Выложу их все в свой GitHub, буду рад, если дадите рекомендации или скажете, что я делал не так.
Условие несложное. Есть набор заявок с определенным приоритетом, необходимо для каждой заявки типа "0 i" вывести приоритет i-й по важности заявки в системе.
Третья задача "Видео для души" - 1 балл из 6.
Вот это уже сложный уровень. Для решения требуется обратиться к биномиальному распределению. Прочитав первый раз, моя реакция была такая (смайлик шока). В итоге в этом оказалось просто разобраться, но не так просто это за ограниченное время реализовать. Биномиальное распределение - это модель вероятности, которая описывает случайные эксперименты с двумя возможными исходами (обычно "успех" и "неудача"), где вероятность успеха остается постоянной для каждого испытания.
В задача дана выгрузка из бд и нужно расчитать вероятности по определенным условиям. Даже смог набрать 1 балл за это)
Четвертая задача "Электронный журнал" - 6 баллов из 6.
Задача показалась даже слишком простой.
В качестве примера дана выгрузка из электронного журнала студентов, в котором могут быть ошибки.
Условие: определить, есть ли в нём ошибки или нет, и вывести информацию о найденных ошибках.
Пятая задача "Злоумышленники в сети" - 0 баллов из 8.
Задача решается только C++, поэтому не стал тратить на этом время. В условии дан заголовочный и бинарный файл, необходимо написать программу, которая будет посылать пробные пакеты между произвольными вершинами, выявляя то ребро, на котором происходит заражение.
Шестая задача "Картонная избушка" - 0 баллов из 12.
Задача очень интересная, но у меня не осталось времени, чтобы полностью разобраться и написать реализацию. Мой код давал неверный результат.
Условия почти нет. Задаются два натуральных числа: n (n≤10^4) — длина пароля и k (k≤10^3) — любимое число директора банка.
Нужно рассчитать, сколько секунд следует заложить грабителям на перебор всех вариантов пароля.
📞 Посмотрим на вердикт Яндекса, но в любом случае приятная тренировка для мозгов.
Немыкин.Продакшн
#Yandex #Contest #GitHub

Первая задача "Аналитика для начинающих"
Ниже представлен скрипт, создающий некоторые таблицы базы данных, описывающей библиотеку музыкального стримингового сервиса:
CREATE TABLE [Artist]
(
[ArtistId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
-- Название артиста
[Name] NVARCHAR(120)
);
CREATE TABLE [Album]
(
[AlbumId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
-- Название альбома
[Title] NVARCHAR(160) NOT NULL,
[ArtistId] INTEGER NOT NULL,
FOREIGN KEY ([ArtistId]) REFERENCES [Artist] ([ArtistId])
ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE [Track]
(
[TrackId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
-- Название трека
[Name] NVARCHAR(200) NOT NULL,
[AlbumId] INTEGER NOT NULL,
-- Длительность трека в миллисекундах
[Milliseconds] INTEGER NOT NULL,
-- Размер трека в байтах
[Bytes] INTEGER NOT NULL,
-- Стоимость трека
[UnitPrice] NUMERIC(10, 2) NOT NULL,
FOREIGN KEY ([AlbumId]) REFERENCES [Album] ([AlbumId])
ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY ([GenreId]) REFERENCES [Genre] ([GenreId])
ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY ([MediaTypeId]) REFERENCES [MediaType] ([MediaTypeId])
ON DELETE NO ACTION ON UPDATE NO ACTION
);
Для аналитической отчётности заказчик попросил написать запрос, который по названию артиста выводит информацию о всех его альбомах в сервисе в следующем порядке:
ID альбома;
Название альбома;
Количество треков;
Общая продолжительность треков в миллисекундах;
Общий размер треков на носителе в байтах.
При этом альбомы в выдаче необходимо отсортировать по возрастанию их ID.
Эту задачу поручили Вам как стажёру отдела бизнес-аналитики.
Напишите параметризованный запрос, выполняющий поставленную задачу, с использованием максимум двух операторов SELECT. Единственным параметром запроса должно быть название артиста.
Формат ввода
При выполнении запроса будет передан один параметр: название артиста без кавычек.
Гарантируется, что вся строка состоит только из символов кодировки ASCII. При этом не гарантируется, что артист будет существовать или что у него будут альбомы с треками. В запросе этот параметр должен указываться как $name.
Формат вывода
В качестве результата запрос должен возвращать выборку, описанную в условии, с учётом порядка строк и столбцов.
Примечания
Для анализа данных в компании используется СУБД SQLite, но гарантируется, что работающий запрос можно написать для СУБД SQLite, PostgreSQL и MS SQL Server.
При необходимости вместо квадратных скобок при указании полей можно использовать двойные кавычки.
Мое предложенное решение:
WITH AlbumTracksInfo AS (
SELECT
Album.AlbumId,
Album.Title,
COUNT(Track.TrackId) AS TrackCount,
SUM(Track.Milliseconds) AS TotalMilliseconds,
SUM(Track.Bytes) AS TotalBytes
FROM
Artist
JOIN Album ON Artist.ArtistId = Album.ArtistId
LEFT JOIN Track ON Album.AlbumId = Track.AlbumId
WHERE
Artist.Name = $name
GROUP BY
Album.AlbumId, Album.Title
)
SELECT
AlbumTracksInfo.AlbumId,
AlbumTracksInfo.Title,
AlbumTracksInfo.TrackCount,
AlbumTracksInfo.TotalMilliseconds,
AlbumTracksInfo.TotalBytes
FROM
AlbumTracksInfo
ORDER BY
AlbumTracksInfo.AlbumId;