19 и 20 октября в Санкт-Петербурге прошла конференция Joker — лучшее мероприятие для тех, кто любит то же, что и мы: крутые доклады, общение с продвинутыми экспертами по Java и головоломки.
Не будем расхваливать третий выпуск задач от GridGain ( 1 , 2 ), лучше процитировать отзывы участников: «Их задачи казались глупыми и не связанными с IT» «Задачи, как всегда, отличные (хоть я и не выполнил ни одну из них)» «Зависимость в проблемах» «Топовые задачи, как всегда» Публикуем, как и обещали, подробные решения.
Поместили под спойлер, чтобы те, кто пропустил конференцию, могли попробовать свои силы.
Проблема 1
Три месяца назад мы написали это задание, но в октябре 2018 года президент выступил с инициативой декриминализировать 282 статью, чему мы несказанно рады, но уже устали переделывать тексты.Так что пусть все в этой задаче останется, как было.
* «Центр определенного письма» отслеживает размещение оскорбительных мемов, а также их лайки и репосты в социальных сетях.
В рамках цифровой трансформации целый офис сотрудников отдела мониторинга был заменен искусственным интеллектом.
Нововведение помогло быстро рассчитать вероятность перехода пользователей от лайков к репостам, чтобы дело можно было успешно довести до суда.
Ранее обвинительный приговор по заявлению «Центра одной буквы» достигался с вероятностью 90% в течение 192 дней.
Автоматизация процесса довела показатели до 12 дней с вероятностью 99,9%.
Вопрос: Во сколько раз благодаря инновационному подходу увеличилась конверсия мемов в осуждения за 282, если частота предложений имеет экспоненциальное распределение? Решение проблемы 1 *Назвав автора цитаты и работы на нашем стенде, вы сразу же получите подарок.
Конечно, это Юрий Хой (Клинских), «Сектор газа» и трек «Бомж».
Согласно исходному условию, поскольку частота предложений имеет показательное распределение, то до и после внедрения робота имеем следующие выражения для оценки вероятности того, что предложение было вынесено за время ≤ t:
Где
– неизвестные параметры, определяющие частоту вынесения приговоров, t – параметр времени, по условию получается, что:
Из этих уравнений очень легко выражаются параметры
Исходя из предположения, что количество судимостей и количество мемасиков имеют линейную зависимость, можно сделать вывод, что соотношение
просто дает желаемое значение:
Проблема 2
С точки зрения буддиста Василия, код совершенен не тогда, когда к нему нечего добавить, а когда ничего нельзя убрать.Руководствуясь этой идеей, наш Василий решил улучшить EpsilonGC и явил миру Dzen-GC — продукт совершенной мысли, который не только не умеет очищать кучу памяти, но даже не позволяет ее выделить.
Очевидно, что размещение в JVM с помощью этого инновационного GC возможно только в стеке и только для примитивных типов.
Для тестирования нового функционала Василий решил написать на Java функцию, которая находит режим по 6 значениям (режим — это значение в наборе наблюдений, которое встречается чаще всего), то есть имеет следующую сигнатуру:
Чтобы приблизиться к просветлению, Василий не стал объявлять в своем коде дополнительные локальные переменные и методы, а также программировал только мизинцем левой ноги.public static int mode(int n0, int n1, int n2, int n3, int n4, int n5)
Задача: помогите Василию реализовать эту функцию (все пальцы разрешены).
Решение проблемы 2 Попробуем разобраться, как можно было бы решить эту проблему, если бы не было таких жестких ограничений.
Скажем так, значения передаются в массиве, и дополнительную память желательно не использовать (но немного можно).
Затем отметим варианты, использующие Map , и обратите внимание, что искать режим удобнее всего в отсортированном массиве: если значение повторяется, все дубликаты находятся рядом.
Мы отсортируем массив и за один проход (и две переменные) найдем значение с максимальным количеством повторений.
Теперь заметим, что: 1) Вы можете сортировать значения рекурсивно.
// Expectation: if there are more than one mode, we are free to return any of them.
// 2,2,3,3,4,4 has 3 modes : 2,3,4. I expect that 3 is correct answer.
public static int mode (int a, int b, int c, int d, int e, int f){
// If arguments are not sorted, let's sort them with bubble sort :)
if (a > b)
return mode(b,a,c,d,e,f);
if (b > c)
return mode(a,c,b,d,e,f);
if (c > d)
return mode(a,b,d,c,e,f);
if (d > e)
return mode(a,b,c,e,d,f);
if (e > f)
return mode(a,b,c,d,f,e);
2) У нас есть только 6 отсортированных значений.
3) Если значение повторяется 3 раза (половина всех значений) - это уже мода! 3.1) Если нет, но есть 2 повтора - значит это мод! 3.2) Если повторяющихся значений нет, то любое значение является модой.
// Check for mode with 3+ repeats. 3 repeats is enough to say value is a mode (3 is half of 6).
// Since args are sorted, a == b && b == c is the same as a == c;
if (a == c)
return a;
if (b == d)
return b;
if (c == e)
return c;
if (d == f)
return d;
// Check for 2 repeats.
if (a == b)
return a;
if (b == c)
return b;
if (c == d)
return c;
if (d == e)
return d;
if (e == f)
return e;
return f;
}
Строго говоря, у проблемы может быть много решений, но нам понравилось это, как самое простое и гармоничное.
Проблема 3
Два наркомана решили выбраться из Матрицы и выяснить, кто из них Избранный.Для этого они получили 1 упаковку синих и 4 упаковки красных таблеток (пачки одинакового размера), а для усиления эффекта решили запить их зеленкой.
Внезапно выяснилось, что из-за сбоя в Матрице (так думали наркоманы) их лица, изначально имевшие цвета RGB #2D241D и #F4E3E1, стали меняться в зависимости от количества употребленных таблеток и зеленки: каждая таблетка( или 1 мл зеленки) линейно увеличивает количество соответствующих цветов на лице наркомана.
При этом значение каждой RGB-компоненты не может превышать #FF, то есть дальнейшее использование таблеток или зеленки не имеет никакого эффекта.
Изначально было несколько полных флаконов Зеленки по 20 мл, всего в 2 мл меньше, чем общее количество таблеток в штуках.
После события по выходу из Матрицы, в котором ел второй наркоман Поскольку красных таблеток на 54 больше, чем первых синих, у наркоманов ничего не осталось.
Вопрос: сколько таблеток и зеленки употребил каждый наркоман, если в итоге на их лицах были цвета #F0FF6B и #FFFEFF соответственно, а известно, что зеленка в 3 раза сильнее красных таблеток, которые, в свою очередь, в 2 раза сильнее слабее синего? Решение проблемы 3 Для начала выберем среди итоговых значений цветов только те, которые строго меньше 0xFF, поскольку по соглашению за значение 0xFF мы можем дать только нижний предел используемого усилителя цвета.
Эти значения — 0xF0, 0x6B и 0xFE. Получаем следующие уравнения:
или
Здесь k – коэффициент действия красных таблеток,
, - количество израсходованных бустеров (таблетки измеряются в штуках, зеленка - в миллилитрах) соответствующего цвета соответствующим потребителем.
Далее мы знаем, что второй съел красных таблеток на 54 больше, чем первый синий, всё просто:
Другое уравнение получается из условия зависимости количества таблеток от миллилитров бриллиантовой зелени:
Также мы имеем взаимосвязь между красными и синими табличками:
Кроме того, мы знаем, что зеленки было 20 мл:
, где z — неотрицательное целое число.
Если исходить из того, что k целое и таблетки едят целиком (зелень можно пить сколько угодно), то подходит единственный ответ:
Его можно получить достаточно просто, например, используя метод, описанный ниже.
У нас есть соотношение
.
Единственные две факторизации числа 39 — это {1, 39}, {3, 13}.
Таким образом, k может принимать значения только из набора {1, 3, 13, 39}.
Давайте попробуем значение «3».
Но в то же время
должно быть кратно 20, что неверно для значения (79,5 + 3).
Значения «13» и «39» устраняются точно так же.
Единственное значение, которое остается для k, — это единица.
Подставив его, мы не приходим к противоречиям и получаем ответ.
Фактически, поскольку нигде в задаче не сказано, что коэффициент линейного приращения k красной RGB-компоненты является целым числом, получается целое семейство решений, *даже* если предположить, что зеленку пьют только в объемы, кратные 1 мл, причем таблетки расходуются целиком (что также не оговаривается отдельно):
n — неотрицательное целое число.
Чтобы получить это семейство, нужно избавиться от k в первых трёх уравнениях, переписав их, например, так:
после чего решить систему линейных диофантовых уравнений (естественно, включая в нее остальные уравнения, приведенные к нужному виду).
Если не считать, что зеленка расходуется только в объемах, кратных миллилитру, то получим нелинейную систему диофантовых уравнений, принимая числитель и знаменатель g1 и g2 (которые, очевидно, должны быть рациональными) как неизвестные целые числа.
Если решить задачу в самом общем виде (все значения непрерывны), то решений будет еще больше.
Победители
Алексей Рыжиков и Валентин Шипилов правильно решили все задачи.Призы также получили Алексей Галкин, Антон Блинов, Илья Перевозчиков и еще несколько участников.
Поздравляем! Теги: #математика #Занимательные задачи #задачи для программистов #развлекательные задачи #jokerconf #joker2018 #задачи #задачи и решения
-
Мудрость Толпы И Социальных Сетей
19 Oct, 24 -
Тортphp. Поведение - Измена!
19 Oct, 24 -
Отчет С Митапа Для Back-End Разработчиков
19 Oct, 24