Dimchik
Это решение О(n) time, можно в O(1), но я бы не парился))
Lynn «Кофеман»
Основное, неправильно выбраный способ решения «в лоб».
Подсказка: сколько нечётных чисел от 1 до 2N?
Vilena
Vilena
почему способ решения "в лоб" неправильный?
Роман
Dimchik
в основном это задачи с AoC 🤣🤣
Viktor
n?
направление верное. теперь надо учесть, что в задаче интервалы не строго 2*N, то есть четные, бывают и нечетные.
Viktor
Viktor
четвертая задача в контестах всегда в лоб не решается
Lynn «Кофеман»
Потому что перебор миллиарда чисел это долго и если с ними нужно делать хоть что-то нетривиальное, то ты гарантированно не уложишься в лимиты времени.
В общем случае, если твое решение перебирает миллиард чисел значит оно с вероятностью 99.99% неоптимально и нужно придумать другое.
Alexander
Alexander
Я понимаю, что ты про задачу с литкода, это шутка
Lynn «Кофеман»
Есть такая штука, большие данные
Есть. Но не на литкоде в начальных этапах.
И там будут миллиард после выбора оптимального алгоритма против триллионов/квадриллионов в «лобовом»
Alexander
Viktor
Dzianis
Alexander
В прошлом году я хотел рыб сделать на яндексовом MR кластере
Alexander
там 2Т выходная таблица получалась
Viktor
Alexander
Кстати, поясните плиз
Alexander
17 день
Alexander
цикл я нашел просто перебором seed и размера цикла
Роман
@vylenne Вы senior front end?
Alexander
int64_t s = 15;
int64_t v = 1015;
auto seed_height = chamber.run(s);
auto cycle_height = chamber.run(v) - seed_height;
auto leftover_height = chamber.run((Q - s) % v) - cycle_height + seed_height;
int64_t total_height = seed_height + ((Q - s) / v) * cycle_height + leftover_height;
cout << total_height << endl;
Alexander
почему код выше не работает? chamber.run(x) возвращает текущую высоту, chamber не сбрасывается
Alexander
ошибка ровно в 2 seed_height
Alexander
то есть я прогоняю сид, нахожу высоту которую добавляет цикл и потом прогоняю еще остаток цикла до Q
Lynn «Кофеман»
Lynn «Кофеман»
вот именно, открывающие есть, а закрывающих нет!
Alexander
браузер сам закроет
Lynn «Кофеман»
мой парсер сломался! 😂
Alexander
убрал чуть вывода, он там в общем ни о чем
Evgeniy
Поделитесь инпутом со вчерашнего дня. Проверить эвристику.
Dimchik
Evgeniy
Evgeniy
На моих данных терпимо считает. Но неясно, будет ли на других так же.
Dimchik
https://github.com/StaffEngineer/adventofcode-2022/blob/main/day19/input.txt
Evgeniy
Dimchik
ответ 1294 и 13640
Evgeniy
Совпало. Максимум 40 миллионов перебирало.
Evgeniy
(28, 50, 8, 16, 3, 7, 5, 4, 0), counter=40000000 cacheHits=6850906 (0,17127%, maxGeHits=20133853 (0,50335%)
Evgeniy
Проценты только неверные, на 100 не умножено
Evgeniy
https://github.com/edevyatkin/AdventOfCode/blob/2097f604f637cb3d7cc90d98e27c437c380ac037/AdventOfCode2022/Day19.cs#L56
Evgeniy
Немного поправил эвристику, вместо использования времени поставил просто -1. Скорость выросла аж в 4 раза. Считало где-то 30 с чем-то секунд, теперь около 7 (на данных из примера). Оптимизировать можно бесконечно, надо остановиться =)
Dimchik
как же долго я сегодня голову ломал с DLL 😆
Viktor
Вот и пригодился бинарный поиск, во второй части сегодняшней 🙂
Dzianis
Alexandr
Viktor
А, диапазоны. Просто цикл запустил от 1 до 1e13 и проверил где граница.
Viktor
у меня была на 1e13
Viktor
ну да, сами границы в коде захардкодил.
Dzianis
Что именно? 🤔
Ответ)
Я сегодня вторую часть просто перебором, с момента где diff между a и b менялся с + на -, добавлял значащую цифру)
Viktor
Dzianis
Но к слову норм задачи вернулись, не хардкор как в середине aoc, вполне сносно и с удовольствием можно поделать)
Viktor
хотя может можно было и не упарываться
Viktor
Dzianis
не, бинарный поиск же 😄
А откуда у тебя гарантия монотонности?
Если бы там была степенная зависимость можно было бы выйти из клюшки и пытаться найти ответ в бесконечности)
Viktor
Evgeniy
Evgeniy
А я уже начал делать вычислением, переделывая выражения
Evgeniy
Ну да ладно)
Viktor
Viktor
вот если бы там было умножение скажем, то как-то уже хз.
Viktor
Dzianis
Viktor
Dzianis
да, именно. но так нет.
Лан) это я оправдываюсь что руками подобрал ответ задачи 😃
Хорошая мысль тут бинпоиск)
Evgeniy
хм, а как ты хотел?
Заменить один из ключей в выражении root = a * b (например) на a * a. В других выражениях b заменить тоже на a. Потом сделать что-то подобное:
a = b + c
c = a - c
c = a - b
и так далее, для вычитаний, делений и умножений. И так же, как к первой части отсортировать топологической сортировкой.
Viktor
Viktor
Неплохо
Evgeniy
Неплохо
С бинарным поиском даже мысли не было. Это (бинпоиск) легче, быстрее.
Viktor
Viktor
как Вселенная