Skip to content

Тексты и решения задач с конкурса OZON Route256, и немного аналитики.

Notifications You must be signed in to change notification settings

notdest/OZON_route256_2024_sliv

Repository files navigation

Ozon Route256 2024 слив задач

Слив не слив (хотя подготовительный раунд я весь прорешал), но это скорее всего самый высокочастотный запрос по тематике связанной с этим конкурсом. Также я сохранил все тексты задач, если захочешь подготовиться и увидеть реальные задачи, сохранил распределение призовых баллов и провёл небольшую аналитику. Если у тебя прорешаны другие задачи — скинь их либо через MR, либо в issue, либо в группу в телеге в конце текста.

Тренировочный раунд Route 256: Middle Go-разработчик (Август 2024)

1 О новых форматах заданий (код) 5 баллов
Просто вывести "ОК"

2 Ошибка округления (код, полностью решена) 5 баллов
Округление до произвольной точности, и потом форматированный вывод

3 Корень дерева (код, полностью решена) 10 баллов
Сначала заморочный ввод потомков в графе, потом с помощью сортировки нахожу отсутствующий элемент в массиве. Отсутствующий элемент можно найти быстрее и хитрее — из суммы арифметической последовательности вычитаешь сумму номеров потомков в графе, и получится номер вершины, которая не была ни у кого потомком.

4 Сломанный сервер (код, полностью решена) 15 баллов
Самая длинная последовательность из 2-х символов. Надо помнить длину последовательности из одного символа

5 JSON prettify (код, полностью решена) 20 баллов
Вводим многострочный JSON, потом циклично регуляркой из него выпиливаем пустые элементы

6 Упаковка коробок (код, полностью решена) 30 баллов
Просто список какое количество каких коробок, и одна функция, которая «загружает» машину под завязку, от больших к меньшим

7 Похожие логины (код, полностью решена) 35 баллов
Хэш-функция не чувствительная к расположению букв, входные строки хранятся в массиве массивов строк по хэшу.

8 Добыча природных ресурсов (код, полностью решена, но с грязным хаком) 40 баллов
Боль, страдания и наебалово. Перебор самых редких вершин, потом перебираешь остальные, пытаешься найти какой-то оптимальный маршрут.

Кстати после трёх удачных загрузок выскакивает такое сообщение:

Прикольное ограничение

Основной раунд Route 256: Middle Go-разработчик (Август 2024)

1 Удалить цифру из числа (код, полностью решена), 5 баллов
Формулировка задачи отдаёт токсичным наймом, но цифры в тестах не помещаются ни в один числовой тип. Решил на строках.

Комментарий SonyaForest: У вас решение выглядит сложнее. Если длина строки 1 — то 0. Далее запускаем цикл (я сделала от 1) и проверяем, если prev < current, то из строки удаляем prev и выводим результат.

2 Деление массивов (код, частично решена), 10 баллов
Подлость задачи, что получается число нереальных размеров, которое не влезает в числовые типы. Если просто каждый раз брать остаток от деления результата на 1000000007 (это простое число), то получишь частичное решение. Но при полном решении возникает умножение чисел близких к 1000000007, которое переполнит любой тип. Полное решение скорее всего либо в использовании библиотеки для произвольных чисел (math/big), либо в формуле для остатков x⋅y mod m = (m-x)⋅(m-y) mod m (видос). Я слишком долго искал варианты решения, вместо попыток решения остальных задач.

Комментарий SonyaForest: На C# использовала библиотеку Math.BigMul.

3 ProductID, 15 баллов
Комментарий SonyaForest: Если кратко, то я сделала список списков продуктов (id, name). Операция change копирует предыдущий элемент и меняет состояние какого-то продукта в это списке. Во время get просто копируется предыдущий элемент. Получается что-то вроде { {p1, p2, p3 ...}, {p1,p2`,p3...} }. На каждый момент времени хранится состояние всех продуктов.

4 Валидация ответа, 20 баллов
Комментарий SonyaForest: В этой задачи условие удалось понять после 100 перечитывания. Может быть реально описание задачи непонятное. Решить тоже получилось. Сформировать из каждой строки массив. В шарпах для этого Split(' '). В случае, если несколько пробелов идут подряд в массив попадают пустые элементы.
Если количество элементов не совпадает, то NO.
Второй массив уже отсортирован по возрастанию. Сортирую первый массив. В цикле от 0 до n, начала проверяю элемент второго массива, если пустой - NO. Затем сравниваю элементы, если равны, то переход на следующий этап, если нет возвращаю NO.
В результате, если цикл не был прерван, то результат YES.

5 YAML to INI, 25 баллов
Комментарий SonyaForest: Задача аналогична Prettify в пробном. Также рекурсией. Предполагаю, что надо использовать стек. Ещё не пробовала такое решение.

6 Зеркальные пары, 30 баллов
Ждёт своего героя

7 Крестики-нолики (Middle), 35 баллов
Ждёт своего героя

8 Галерея искусств (Middle), 40 баллов
Ждёт своего героя

Всякие размышления и выводы

Я сохранил здесь лидерборды для основного и тренировочного раунда, также сделал таблицу, где можно посмотреть место человека в обоих раундах одновременно. Самые любопытные могут копировать себе гугл-таблицу (часть промежуточных листов скрыта), где я рисовал все эти графики (оттуда удобно копировать формулы в ячейках).

Распределение баллов выглядит следующим образом:

Распределение по баллам

Распределение по баллам

Т.к. задачи дают разное количество баллов, то посмотрим на количество решённых задач:

Распределение по задачам

Распределение по задачам

Распределение по задачам

Распределение по задачам

Больше всего здесь выделился человек с ником kind_vulture_18828 на 109 месте, который умудрился решить 5 задач частично. Просто гений посредственных решений. В целом количество решённых задач растёт нелинейно, и к первым местам значительно убывает количество задач, за которые вообще не брались. Может быть выше уровень конкурсанта, может выигрышней тактика попробовать больше задач. Далее рассмотрим корреляцию между местами в раундах, она практически отсутствует (если место 800 - значит человек вообще не участвовал в подготовительном раунде)

Корреляция мест в раундах

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

Задачи по вкладу

Наибольший вклад давала шестая задача, до 73 процентов результата. А если учесть, что скорее всего часть из первых 75 конкурсантов не будут устраиваться на курсы, а значит и после 75-го места будут набирать, то вполне вариант решить первую и шестую задачу, и оказаться в выигрыше. Далее посмотрим процент решённых задач среди выигравших и проигравших:

Процент решённых задач

Выпирает первая, вторая, четвёртая и шестая, шестая самая жирная по баллам. Далее частично решённые задачи:

Процент решённых задач

Здесь не вижу ничего существенного. Сильные чаще частично решали сложные задачи, слабые чаще частично решали простые задачи. И только шестую задачу они частично решали поровну. Далее посмотрим тех, кто потратили на задачу время, и не смогли её решить:

Процент решённых задач

Здесь выпирают третья и четвёртая задача. То есть третья прям паскудная задача — малая вероятность решения, жрёт время, и даёт мало баллов (всего 15, треть от минималки). Теперь соотношение задач, за которые не брались:

Процент решённых задач

Среди победителей практически нет тех, кто не брались за шестую задачу. Четвёртая тоже значительно выделялась — даже на вторую забивали чаще. А третья наоборот, очень обделена вниманием у победителей. И дело тут скорее всего как в том приколе — шубка у зайки серенькая не потому, что он так захотел, а потому, что остальные сдохли. Возможно какие-то хорошо подготовленные ребята взялись за третью, и это перенесло их в группу проигравших.

Выводы

  • Времени капец как мало, и ты невыспавшийся. Лучше позвать друзей на помощь, тем более задачи можно решать параллельно (только по времени отправки не палиться).
  • Если нанимаешь программеров себе — возможно имеет смысл убрать параллельность, не больше одной задачи одновременно. Так меньше фактора случайности в оценке.
  • Среди победителей (41-е место) есть те, кто не смогли решить ПЕРВУЮ задачу. Тем более она даёт мало баллов. Так что упираться рогом вообще не надо, лучше попробовать больше задач.
  • Задачи матанистые, учась на инженера я с таблицей умножения остатков не сталкивался. Можно нанять в день контеста репетитора по олимпиадным задачам. Или среди родственников его найти.
  • Текст задачи написан на задротском, трудно оценить сложность. Лучше в отдельном файле переводить на человеческий.
  • Если ты нанимаешь программеров себе — пиши понятно, если у вас конечно таски не профессора ставят. Много хороших понятных рисунков, протестированных на своих.
  • Самые интересные задачи — ближе к сложным. Они дают нормально баллов, и их реально решить. Получается в идеале нужно начать с самой сложной задачи, которую ты можешь решить.
  • Решать задачи от меньших к большим — путь к провалу. Чтобы попасть в конец списка победителей нужно идеально решить первые четыре задачи.
  • Даже прочитав задачу нифига не понятно, их надо пробовать решать. А всё это жрёт время. Значит надо пробовать решать (без фанатизма) более сложные задачи, и помечать, что не получилось.
  • Сейчас все общаются в телеге. Я под эту тему создал группу https://t.me/route256_sliv, туда можно скинуть способ решения если решил какую-то задачу. Ну или на других конкурсах ищи группы по теме или создавай свою.
  • Отладчик здесь вряд ли поможет, нету времени ковыряться. На прочтение и полное решение каждой задачи не больше часа. Получается тащеры (8 адовых задач за 5 часов) пишут просто в один заход.
  • Если тебя срезали на скорости выполнения — можно воспользоваться профайлером runtime/pprof, чтобы найти узкое место. Я сделал пример для третьей задачи.
  • Задачи конкурсов C# и Go разработчиков полностью совпадали... А значит предварительное участие в других конкурсах одного организатора может дать тебе много информации.

About

Тексты и решения задач с конкурса OZON Route256, и немного аналитики.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages