Re: Advent of Code
Rust і очевидно - речі несумісні.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Алгоритми та структури даних, технології → Advent of Code
Сторінки Попередня 1 2 3 4 5 6 7 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
Rust і очевидно - речі несумісні.
Зробив. Відчуваю, що нагородив фігні, але воно значно коротше за те, що було раніше, і працює як слід, а це Rust, тому, мабуть, небагато.
Тут я спершу дещо намутив із ітераторами і отримав майже stack overflow на побудові рекурсивного темплейта. Також я дізнався, що Rust підтримує 128 вкладених шаблонів, але це число можна змінити в налаштуваннях проєкта (сподіваюся, що мені ніколи це не знадобиться).
А ще це, здається, перша задача цього року, де я не відкривав вхідні дані в браузері взагалі, і ніяк на них не дивився. Лише запускав код.
Довелося додавати купу тестів і дебажити. Ну і Rust опирається.
17 поки що пропустив.
Щось зі складністю недороблене, друге завдання - тупо з параметром 50 замість 2.
Так, тепер те, на чому я зламався. Ну добре, не зламався, просто недокрутив. Сподіваюся, що тут розпишу і зрозумію, як розв'язувати.
День 17. Стріляємо з точки (0,0) об'єктом із початковою швидкістю (vx,vy). Кожен крок симуляції vx та vy додаються до координат об'єкта, після чого зменшуються на 1 - vx до 0, vy іде в мінус нескінченість. Яка має бути початкова швидкість, щоб об'єкт піднявся на максимальну висоту, а потім на певному кроці опинився в прямокутній зоні (x1..x2)x(y1..y2)?
Для початку - горизонтальна координата. За vx кроків горизонтальна швидкість падає до 0, положення по x в момент t визначається як vx*t-t*(t-1)/2 до цього моменту і, очевидно, vx*(vx+1)/2 після. Якщо таке значення потрапляє в x1..x2 - беремо саме його, щоб не залежати від часу, інакше у нас лише кілька моментів, поки об'єкт в зоні, і поки не будемо про погане. У прикладі і моїх початкових даних x1 та x2 захоплюють потрібну точку, далі не думаємо.
Вертикальна координата. Тут y=vy*t-t*(t-1)/2 постійно; це - перевернута парабола з вершиною в vy+1/2, що досить логічно: в момент t=vy вертикальна швидкість падає до 0, і в y(t=vy) та y(t=vy+1) буде однаковим. Висота у цей момент буде vy*vy-vy*(vy-1)/2 = vy*(vy+1)/2. Іншими словами, треба максимізувати vy серед прийнятних. А далі іде падіння, і в певний момент має настати y1<=vy*t-t*(t-1)/2<=y2. А от далі я щось гальмую. Треба знати максимальне vy, при якому t буде лишатися цілим. Перша нерівність (з y1) задає для t інтервал між коренями квадратного рівняння t∈ [t1_1;t1_2]; друге - виключає аналогічний інтервал: t ∉ (t2_1;t2_2). Із загальних міркувань це має дати інтервал t2_2<=t<=t1_2. Гм.
t^2-(2*vy+1)*t+2*y1 = 0
D = 4vy^2+4vy+1-8*y1
t1_2 = (2*vy+1+sqrt(4vy^2+4vy+1-8*y1))/2
Аналогічно,
t2_2 = (2*vy+1+sqrt(4vy^2+4vy+1-8*y2))/2
А тепер треба задати умову, щоб між цими двома значеннями має бути ціле число. І тут щось пішло не так. Хтось щось підкаже? Чи тупо перебором vy шукати? А як зупиняти? Де гарантія, що в районі 1000000 не буде такого значення, що воно туди потрапить?
Довелося трохи помучитися з округленням негативних значень. Ну і прогальмував, що деякі пари дають кілька потраплянь у зону, тому все ж таки потрібен HashSet.
Тепер день 19: є множини координат зондів в системах координат різних сканерів. Сканери завжди ведуть відлік від себе в (0,0,0) і можуть бути розвернути по всіх осях як завгодно по 90°, але бачать лише на певну відстань навколо. Скільки там зондів?
Планую шукати унікальні відстані між зондами (для простоти - квадрати відстаней) і суміщати по них.
Щось за день 19 ніяк не візьмуся. Поки зробив
Щось я перемудрив і недооптимізував (треба вектор на якесь дерево замінити, чи що), але в будь-якому разі воно виконується в релізній версії за 1.7 секунди. В дебажній досі чекаю
Dosjê ne zaveršyv jakyjsj rôk, xex. Ale tšas vôd tšasu proxodžu stari propuštšeni. Osj tut np. vôdkryv dlja sebe funktsiju maketrans, štšo korysna pry ssuvê Tsezara.
AoC bude v 2022 roku.
У ельфів чемпіонат з Каменя-Ножиць-Паперу. Очки даються за фігуру (камінь-1, папір-2, ножиці-3) і результат (поразка-0, нічия-3, перемога-6), тобто якщо гравець показав камінь і виграв, то отримує 7 балів. Є інструкція (запис матчу) з рядків, де перша літера A,B,C, а друга (через пробіл) - X,Y,Z. A,B,C позначає відповідно камінь, папір і ножиці опонента. Знайти очки за матч, якщо:
1. X,Y,Z означає ваші камінь, папір і ножиці відповідно;
2. X,Y,Z означає ваші поразку, нічию і перемогу відповідно.
Ліньки було з модулями розбиратися, всього 9 рядків. Мабуть, Спока і Ящірку б теж хардкодив. От якби щось таке було...