#advent_of_code_2024
Day 5
https://adventofcode.com/2024/day/5
Part 1
Парсимо першу частину оутпуту в одну сутність, а другу - в іншу
Треба буде проходитись по апдейтам і валідувати їх, зважаючи на рули
Щоб не робити цикл в циклі, створюємо певну мапу або "павутину", яка має всю інформацію про рули: які сторінки повинні йти раніше, а які пізніше, за тотожню і перевіряємо кожну сторінку в апдейті
Part 2
можемо використати код з першої частини та відфільтрувати незапринтені апдейти, саме їх треба пофіксити і знайти суму їх еверейдж чисел
для цього будемо використовувати наступний алгоритм:
ітеруємось форіфом по масиву, кожного разу створюючи слайс
в цей слайс поетапно "пихаємо" останній елемент, поки слайс не стане валідним (використовуючи функцію-предикат, який вже написали в 1 частині)
головне не забути перезаписати основний масив новим пофікшеним слайсом
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
Day 5
https://adventofcode.com/2024/day/5
Part 1
Парсимо першу частину оутпуту в одну сутність, а другу - в іншу
Треба буде проходитись по апдейтам і валідувати їх, зважаючи на рули
Щоб не робити цикл в циклі, створюємо певну мапу або "павутину", яка має всю інформацію про рули: які сторінки повинні йти раніше, а які пізніше, за тотожню і перевіряємо кожну сторінку в апдейті
Part 2
можемо використати код з першої частини та відфільтрувати незапринтені апдейти, саме їх треба пофіксити і знайти суму їх еверейдж чисел
для цього будемо використовувати наступний алгоритм:
ітеруємось форіфом по масиву, кожного разу створюючи слайс
в цей слайс поетапно "пихаємо" останній елемент, поки слайс не стане валідним (використовуючи функцію-предикат, який вже написали в 1 частині)
головне не забути перезаписати основний масив новим пофікшеним слайсом
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
GitHub
GitHub - Pyroarsonist/advent-of-code-2024: https://adventofcode.com/2024
https://adventofcode.com/2024. Contribute to Pyroarsonist/advent-of-code-2024 development by creating an account on GitHub.
🥱1
#advent_of_code_2024
Day 6
https://adventofcode.com/2024/day/6
Part 1
Записуємо інпут в матрицю і створюємо окрему матрицю "візитерів"
Симулюємо "кроки" в циклі, під час яких записуємо візити та дивимось, чи охоронець вийшов за межі поля або підійшов до перешкоди. Напрямок охоронця конвертуємо в dx, dy координат і так симулюємо його хід.
В кінці рахуємо суму всіх булеан-візитів.
Part 2
Треба знайти шляхи, по яким ходить охоронець без доданих перешкод і ітерувати по ним:
ставимо перешкоду на кожну ячейку та симулюємо ходьбу охоронця, поки він не попаде в цикл (зберігаючи його ходи), або поки він не вийде із мапи.
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
Day 6
https://adventofcode.com/2024/day/6
Part 1
Записуємо інпут в матрицю і створюємо окрему матрицю "візитерів"
Симулюємо "кроки" в циклі, під час яких записуємо візити та дивимось, чи охоронець вийшов за межі поля або підійшов до перешкоди. Напрямок охоронця конвертуємо в dx, dy координат і так симулюємо його хід.
В кінці рахуємо суму всіх булеан-візитів.
Part 2
Треба знайти шляхи, по яким ходить охоронець без доданих перешкод і ітерувати по ним:
ставимо перешкоду на кожну ячейку та симулюємо ходьбу охоронця, поки він не попаде в цикл (зберігаючи його ходи), або поки він не вийде із мапи.
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
GitHub
GitHub - Pyroarsonist/advent-of-code-2024: https://adventofcode.com/2024
https://adventofcode.com/2024. Contribute to Pyroarsonist/advent-of-code-2024 development by creating an account on GitHub.
#advent_of_code_2024
Day 7
https://adventofcode.com/2024/day/7
Part 1
Тут треба трошки читів з рушія 3 квейку.
Репрезентуємо кожен стан рівняння як бінарний вираз, наприклад: у трьох додатків a,b,c буде бінарний вираз у вигляді "10", тобто від "00" до "11" (всього 2^n різних виразів або позицій, де n - кількість додатків). Ітеруємося бінарно на +1, де 0 буде операцією суми, а 1 - операцією множення. Також додамо обмеження, що якщо в конкретному готовому виразі результат буде більше, ніж очікуваний - то такий результат не підходить, це трохи зекономить час. Проходимось по всім виразам і отримуємо результат для конкретного рівняння.
Part 2
Підхід з першої частини був потужним.
Замість того, щоб працювати з бінарною системою числення, вводимо ще один оператор і працюємо з тернарною системою числення (тобто там де цифри 0, 1 і 2).
Тепер максимальна кількість ітеруємих чисел до 3^n, а стан кожної операції - це тернарне відображення ітерації (тобто приводимо номер ітерації не до бінарного виду 0101, а до тернарного 0012)
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
Day 7
https://adventofcode.com/2024/day/7
Part 1
Тут треба трошки читів з рушія 3 квейку.
Репрезентуємо кожен стан рівняння як бінарний вираз, наприклад: у трьох додатків a,b,c буде бінарний вираз у вигляді "10", тобто від "00" до "11" (всього 2^n різних виразів або позицій, де n - кількість додатків). Ітеруємося бінарно на +1, де 0 буде операцією суми, а 1 - операцією множення. Також додамо обмеження, що якщо в конкретному готовому виразі результат буде більше, ніж очікуваний - то такий результат не підходить, це трохи зекономить час. Проходимось по всім виразам і отримуємо результат для конкретного рівняння.
Part 2
Підхід з першої частини був потужним.
Замість того, щоб працювати з бінарною системою числення, вводимо ще один оператор і працюємо з тернарною системою числення (тобто там де цифри 0, 1 і 2).
Тепер максимальна кількість ітеруємих чисел до 3^n, а стан кожної операції - це тернарне відображення ітерації (тобто приводимо номер ітерації не до бінарного виду 0101, а до тернарного 0012)
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
GitHub
GitHub - Pyroarsonist/advent-of-code-2024: https://adventofcode.com/2024
https://adventofcode.com/2024. Contribute to Pyroarsonist/advent-of-code-2024 development by creating an account on GitHub.
#advent_of_code_2024
Day 8
https://adventofcode.com/2024/day/8
Part 1
Проходимо по матриці та збираємо координати всіх різних антен.
Проходимось по координатам антен однієї групи попарно: для кожної пари антен виявляємо антиноду базовим геометричним обчисленням, беремо тільки ті антиноди, які знаходяться в межах матриці (оскільки пара буде проходитись двічі в такому циклі, то можемо за раз оброблювати тільки 1 антиноду).
Маємо масив антинод на кожну групу антен: збираємо їх до купи, фільтруємо унікальні і рахуємо кількість.
Part 2
Тепер кожна антинода спавниться на лінії будь-яких двох антен. Це означає, що треба проходитись по матриці і виявляти, чи є точка на такій лінії. Для кожної з пари антент однієї групи зробимо функцію-рівняння прямої (по 2 точкам можна визначити пряму), результат якої буде 0, якщо точка лежить на прямій.
Для кожної точки в матриці перевіряємо в окремо створеній матриці для антинод, чи є вона там (тобто кешуємо) і обраховуємо цей результат, опісля рахуємо кількість антинод.
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
Day 8
https://adventofcode.com/2024/day/8
Part 1
Проходимо по матриці та збираємо координати всіх різних антен.
Проходимось по координатам антен однієї групи попарно: для кожної пари антен виявляємо антиноду базовим геометричним обчисленням, беремо тільки ті антиноди, які знаходяться в межах матриці (оскільки пара буде проходитись двічі в такому циклі, то можемо за раз оброблювати тільки 1 антиноду).
Маємо масив антинод на кожну групу антен: збираємо їх до купи, фільтруємо унікальні і рахуємо кількість.
Part 2
Тепер кожна антинода спавниться на лінії будь-яких двох антен. Це означає, що треба проходитись по матриці і виявляти, чи є точка на такій лінії. Для кожної з пари антент однієї групи зробимо функцію-рівняння прямої (по 2 точкам можна визначити пряму), результат якої буде 0, якщо точка лежить на прямій.
(y1 - y2) * x + (x2 - x1) * y + (x2 * y1 - x1 * y2) = 0
Для кожної точки в матриці перевіряємо в окремо створеній матриці для антинод, чи є вона там (тобто кешуємо) і обраховуємо цей результат, опісля рахуємо кількість антинод.
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
GitHub
GitHub - Pyroarsonist/advent-of-code-2024: https://adventofcode.com/2024
https://adventofcode.com/2024. Contribute to Pyroarsonist/advent-of-code-2024 development by creating an account on GitHub.
#advent_of_code_2024
Day 9
https://adventofcode.com/2024/day/9
Part 1
Наївним солюшном буде переставлення крайнього правого чесла на перший індекс точки, але в великому інпуті 240к символів і такий солюшн виповнюється дуже довго.
Далі, я переробив солюшн: замість того, щоб процессити строку з точками, я зразу шукаю на ній суму: маючи один поінтер спочатку, який проходиться по масиву і сумує елементи і поінтер с кінця, який видає першому поінтеру поточне число замість точки.
Відповідь не сходилась, виявилось, що при генерації строки з точкою я в тупу додав в строку айді поточного файлу, що не працювало на двухзначних числах.
Після фікса відповідь виявилась правильною і обраховувалась за декілька мс.
Part 2
Повертаємося до наївного солюшна з 1 частини, але дещо змінимо. Замість того, щоб колупатися в готовій строці з точками, будемо міняти основну строку, а точніше її репрезентацію: представимо її у вигляді масиву, в якому чергуються елементи айдішок та пустого простору. Будемо манюпулювати цими елементами: для кожного елемента айдішки справа знаходимо підходящий простий простір і переносимо елемент туди: при цьому треба врахувати, що якщо різниця кількостей елементів не нульова (тобто пустий простір більше за айдішку), то треба залишити залишок пустого простору, а також не забути поміняти тип айдішки справа на пустий простір.
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
Day 9
https://adventofcode.com/2024/day/9
Part 1
Наївним солюшном буде переставлення крайнього правого чесла на перший індекс точки, але в великому інпуті 240к символів і такий солюшн виповнюється дуже довго.
Далі, я переробив солюшн: замість того, щоб процессити строку з точками, я зразу шукаю на ній суму: маючи один поінтер спочатку, який проходиться по масиву і сумує елементи і поінтер с кінця, який видає першому поінтеру поточне число замість точки.
Відповідь не сходилась, виявилось, що при генерації строки з точкою я в тупу додав в строку айді поточного файлу, що не працювало на двухзначних числах.
Після фікса відповідь виявилась правильною і обраховувалась за декілька мс.
Part 2
Повертаємося до наївного солюшна з 1 частини, але дещо змінимо. Замість того, щоб колупатися в готовій строці з точками, будемо міняти основну строку, а точніше її репрезентацію: представимо її у вигляді масиву, в якому чергуються елементи айдішок та пустого простору. Будемо манюпулювати цими елементами: для кожного елемента айдішки справа знаходимо підходящий простий простір і переносимо елемент туди: при цьому треба врахувати, що якщо різниця кількостей елементів не нульова (тобто пустий простір більше за айдішку), то треба залишити залишок пустого простору, а також не забути поміняти тип айдішки справа на пустий простір.
солюшн тут: https://github.com/Pyroarsonist/advent-of-code-2024
GitHub
GitHub - Pyroarsonist/advent-of-code-2024: https://adventofcode.com/2024
https://adventofcode.com/2024. Contribute to Pyroarsonist/advent-of-code-2024 development by creating an account on GitHub.