Это дневник впечатлений, переживаний, уроков, извлеченных из Advent of Code 2019. Дни отсортированы по завершению. Решения с кодом можно найти на https://github.com/okomarov/aoc.

Что такое пришествие кода?

Со страницы О нас:

Advent of Code - это предрождественский календарь небольших программных головоломок для различных наборов навыков и уровней навыков, которые можно решить на любом языке программирования, который вам нравится. Люди используют их как соревнование на скорость, собеседование, подготовку, обучение в компании, университетскую, курсовую, практику, задачи или бросить вызов друг другу.

Каждый день с декабря до 25-го вы получаете задание по кодированию. Первые 100 участников, представившие правильный ответ, получают баллы. Подробнее на странице лидеров.

Зачем я это делаю

Когда я начал испытание, я просто хотел проверить себя.

Я считаю себя довольно средним… но насколько средним?

Но сейчас, когда я пишу это на четвертый день, я не хочу быть просто средним. Я хочу попасть в сотню лучших, чтобы хоть раз решить задачу.

Я также надеялся, что мне будет чем показать, если я когда-нибудь найду работу в области разработки программного обеспечения. В любом случае это немного кропотливая подготовка.

Мой фон

Раньше я читал о появлении кода в Hacker News, но никогда не участвовал и не пробовал решать простые задачи до выпуска 2019 года.

Несколько лет назад я попробовал с десяток задач из Project Euler, так что я не совсем новичок в проблемах программирования. Я использовал их, чтобы проверить себя, повеселиться и немного изучить C ++.

У меня есть докторская степень по финансовой экономике и предыдущий опыт программирования с Matlab и SQL. Можно сказать, что мои финансовые познания не на среднем уровне.

Тем не менее, я в значительной степени самоучка в области компьютерных наук, с множеством пробелов здесь и там. Иногда это неловко 😳.

Я работал специалистом по анализу данных в Carv, классном лыжном снаряжении, около двух лет после завершения учебы. За это время я полностью перешел на Python и C ++.

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

Я также много играл в Dota 2, так что вперед, тысячи часов в мусорное ведро. И Counter-Strike, когда я учился в колледже.

Если бы я только использовал эти часы, чтобы ‹вставить сюда вашу мечту…›

Я тоже читаю медленно. Проверял это на нескольких людях. Обычно я в среднем в два раза медленнее других.

Проблемы

Хватит бла-бла.

Вот набор мыслей по каждой проблеме. Я добавлю дни, так как продолжаю соревноваться в Пришествии Кода.

1 день

  • Увидел сообщение в Hacker News где-то в полдень. Решил повременить и заняться проблемой.
  • Взглянул очень непринужденно, скопировал ввод в таблицу Google и ответил на первую часть проблемы за несколько минут, размышляя, следует ли мне создать специальную папку со средой Python.
  • Я уделил время второй части. Написал другу, спрашивая, можно ли переписать рекурсивный математический ряд в закрытом виде. Искал в сети информацию о рекурсивных последовательностях. Остановился через некоторое время, так как не мог придумать, как избавиться от функций floor() или max().
  • Прежде чем завершить вторую часть, я настроил среду.
  • Я вставил ввод прямо в файл .py и добавил запятые с помощью мульти-курсора VSCode. Решил проблему с петлей.

День 2

  • Позиция изменилась, проснулась в 4:50. Вызов выпущен в 5 утра. Я в Лондоне.
  • Решил проблему в постели. Первая часть за 17 минут и вторая за 8 минут заняли 1214 и 978 очков соответственно.
  • Не так уж плохо, но все же слишком медленно. Это первый тест, так как День 1 был поздним и очень причинным.
  • Я считаю, что в целом Топ-100 выполним.
  • Я определенно медленно читал текст проблемы, поэтому мог улучшить его и пропустить немного шума.
  • Начал искать проблемы с прошлого года. Возможно, я смогу лучше понять, как оптимизировать среду / настройку и сократить все ненужные трения во времени.
  • Снова вставил ввод в файл .py и вручную добавил запятые.

День 3

  • Проснулся примерно в 4:10, случайно взглянул на прошлую проблему, день 2 или 3 2018 года.
  • Решил проблему в постели. Первая часть в 01:52:45 ранг 3504 и вторая часть, после отказа от финиша последовательно, в 04:15:02 ранг 4820.
  • Разочарованный. Попасть в ТОП-100 НЕЛЬЗЯ. Первое завершение заняло 5 минут на первую часть и 2 минуты на вторую… о боже.
  • Я надеюсь, что смогу заполнить весь календарь. Прямо сейчас ЭТО кажется проблемой.
  • Я ожидал, что задачи будут больше математическими, как Project Euler, а не столько скоростью. Похоже, преимущество заключается в опыте использования аналогичных решений. Я явно ищу козла отпущения :(.
  • Тем не менее, я выбрал неэффективный подход. Протестировано на входе в целом (Плохо !!! да…). Разочарован инструментами. Код запуска VSCode +, для отладки еще нужно print(). Думаю, я наконец понял, что такое REPL.
  • Не хотел смотреть на то, что делают другие, но сдался и проверил r / adventofcode на Reddit. Надо было сделать это раньше. Понял ошибки в моем подходе. Однако это было не так уж и плохо.
  • Я вставил введенные данные в отдельный файл, готовый к загрузке, но все равно потратил время на предварительную обработку данных в Excel.
  • Также потратил кучу времени на отладку своего первого решения, просто не смог правильно выполнить индексацию.
  • Я создал две доски с нулями. Залил провода, замаскировав их (вот где я ошибся в индексированном заполнении). Затем я перекрыл две доски, чтобы найти пересечения.
  • Как я узнал в ветке Reddit, лучшим выбором здесь был простой цикл с поэтапным подходом Snake-game. Особенно для части 2, но вы знаете это только потом ...

День 4

  • Проснулся в 4:20, немного поборолся, но в 20:30 лег спать. Устал от раннего пробуждения накануне. Правильно встал, позавтракал, послушал музыку, чтобы разбудить свой мозг.
  • На этот раз я подготовил блокнот jupyter, чтобы ускорить итерацию и отладку.
  • Намного лучше, чем в День 3! Финишировал первую часть в 00:08:18 ранге 1016 и вторую часть в 00:26:22 ранге 1653.
  • Я был в восторге, когда закончил первую часть. Особенно по сравнению с предыдущим днем! Усердно надавил на второй бит, но немного застрял.
  • Прерывание для первой части было в 6:25, а я сделал 8:18. Так что теперь я чувствую, что могу хотя бы раз попасть в топ-100.
  • Пришлось гуглить, как число разбить на цифры. Подумав о подходе log10, все оказалось так просто, как [int(d) for d in str(number)] 🤦‍♂. Кроме того, не следовало преобразовывать в читаемые переменные, например has_adjacent_dgts = any(diff == 0), трата времени.
  • Кроме того, я все еще слишком медленно читаю задачу, опасаясь, что что-то неправильно понимаю.
  • Что касается второй части, так как я прогорел своим предпочтительным подходом в День 3, который оказался слишком сложным и отнимающим много времени, я подумал, что буду K.I.S.S. это и использовать тупую петлю.
  • Итак, здесь я пошел с циклом на цифрах с условиями для предыдущей и текущей цифры, но не смог понять это правильно. Вместо этого я мог бы вычислить начальную и конечную позиции полосы нулей в различающихся цифрах ... что у меня было на 90% готово после работы, которую я выполняю с кодированием длин серий ... Я сожалею.
  • Проверял решения на Reddit. Counter(str(num)) можно использовать для проверки двухзначных пар, поскольку цифры монотонно увеличиваются! Ух ты. Итак, понимание проблемы - КЛЮЧ. Нет, черт возьми, Шерлок!

5 день

  • Худший пока. Поставил будильник на 4:20, отложил до 4:40, изо всех сил пытался встать, пил чай с печеньем.
  • До старта одна минута, и я немного тороплюсь. Почему!? Не то чтобы у меня был шанс. Скорее всего, это займет у меня как минимум 10 минут. Что ж, я спешу, может помочь мне проснуться.
  • 5:32 Все еще пытаюсь разобраться во вводимом тексте, скопировал только вводимые данные в файл и решение со дня 2. Arghhhhhhhhh
  • Мне нужна помощь, я начал публиковать сообщения на Reddit, и когда я написал свою интерпретацию опкодов 3 и 4, я понял, что мне нужно сделать ...
  • 5:50: Я думал, что понял, но нет, код 1100 не имеет смысла, что такое код операции 0?
  • Самомодифицирующийся ввод !!!!! 1100 становится 1101, и попытки разобраться в последовательности вручную заставили меня читать 1100 все время… ЭТО 1101 !!!
  • Извлеченный урок: будьте осторожны при тестировании самомодифицирующихся входных данных вручную
  • Прошло больше часа, и я сдался. Проверял решения и использовал одно. Поначалу даже не удалось заставить его работать, так как у меня вход был определен в отдельной ячейке Jupyter, поэтому после запуска первой части вход изменен и не будет работать для второй части. Тупой! 🤦‍♂
  • И какой смысл использовать чье-то решение? Подделка статистики, чтобы не чувствовать себя полным неудачником? Ложь себе. Надо было просто вернуться в постель, подождать и решить позже… черт возьми. Злость. Разочарование.
  • Это заставляет меня думать о том, чтобы отказаться от соревнований и просто работать над проблемой изо дня в день в свое время. Если я когда-нибудь приблизлюсь к отметке 100 лучших по времени, попробуйте снова проснуться пораньше.
  • 10:50 Хорошо, поспал еще. Даем ему второй шанс. Начните с собственного решения дня 2. Мне нужно узнать, как расширить существующие решения.
  • Я понял, что при первом запуске я мысленно застрял на описании дня 2 и не мог осознать, что инструкции могут различаться по длине или что действия могут быть чем-то еще, кроме изменения последовательности. Старею… Ферма Пепперидж помнит…
  • 11:21 удалось продлить решение для Дня 2, но снова застрял ...
  • 12:19 также добирался до моего офиса ... но застрял при разыменовании, особенно для кода 4, я думал, что это всегда было похоже на код операции 3, то есть всегда режим 0, но оказалось, что это не так, как я получил инструкцию 104.
  • 12:37 Забудь! Все должно поддерживать режим параметров. Дошли до 2 части.
  • Снова застрял в бесконечном цикле с кодами операций 5 и 6, вообще не увеличивая указатель. Пробовал увеличивать на 4. Оказалось, что если условие ложно, должно увеличиваться на 3… Почему 3? Сразу догадался, что третьего параметра нет.
  • 12:52 Завершен. Итак, снова 2 часа, застрял на чтении, перечитывании и перечитывании ... не уверен, где я буду без решений.
  • Буду смотреть видео и комментарии. Самая большая проблема здесь для меня - это то, что я не могу сохранить в памяти прочитанный текст и не могу его правильно интерпретировать.
  • В общем, я отказался, использовал существующее решение, затем попробовал еще раз и, в конце концов, оценил позицию 6885 за 3,5 часа, чтобы завершить обе части ... Уффф
  • Пока я что-то узнаю, не имеет значения.
  • Меня смешит. Я подумал, что 10 минут может хватить ... (в свою защиту это было ожиданием ДО выпуска проблемы)

6 день

  • Не плохо, не хорошо. Финишировали первую часть в 00:55:25 ранге 2661 и вторую часть в 01:10:27 ранге 2206.
  • Поставил будильник на 4:25, отложил до 4:32, физически не сопротивлялся, хотя лег спать поздно в 00:40 и днем ​​ходил лазить, так что был изрядно измотан. Может, я готовил какие-нибудь предлоги, чтобы не встать. Борьба была больше на психологической стороне. Я все время думал: «оставьте это старшим», но в то же время «каковы шансы, что после машины IntCode появится что-то проще?»
  • Пил чай и тосты с маслом и медом. Начал слушать Greyhound by Swedish House Mafia, чтобы проснуться, но прекратил, как только проблема была решена.
  • 2 мин., Паника, не знаю, что делать ... текст не сложно, но дерево меня пугает. Почему?? Не в первый раз работаю с ними!
  • Подумал о предварительной сортировке ввода в Excel, чтобы получить представление…? Сделал это и почти сразу прекратил дальнейшие проверки.
  • Погуглил найти узел в древовидном питоне, скопировал решение из StackOverflow и начал итеративно строить дерево с подсчетом предков. Это будет похоже на постройку космического корабля для похода в продуктовый магазин ...
  • 5:34 первое предположение, неверный, проверенный субреддит, решения были разблокированы на 11-й минуте, так что это не очень просто, но и не сложно, перестану чувствовать давление, попробуйте до 6 утра, затем ложитесь спать и вторая попытка позже, пока не проверяя подсказки. Должен быть способ попроще!
  • 5:43 попробовал различие простых наборов между детьми и родителями
  • 5:49 попробовал только нисходящие листовые узлы формы, это кажется достаточно простым и правильным направлением, следует настаивать
  • 5:55 НЕ ТОЛЬКО ЛИСТЬЯ !!!!!!!!!!! Часть 1 сделана. Проблема заключалась в том, что я потерял цель.
  • 6:10 Происходит от SAN и от ВАС. Сначала пробовали распечатать пути и сделать это «быстро» в Excel. Затем просто взял набор различий между путями и подсчитал узлы, добавив 1 для общего пересечения ... что 1 было неверным ... потратил 5 минут впустую. Также потратил еще несколько минут на опечатку 🙄. Часть 2 сделана.
  • Первая часть определенно была выключена. Следует просмотреть деревья. Но вторая часть заняла 15 минут, а разрыв в таблице лидеров составил 5:51. Теперь, хотя он почти в 3 раза медленнее, он не так уж и далек, как часть 1.
  • Я должен прекратить использовать Excel. Только потраченное зря время (или, кто знает, может быть, Excel поможет мне реализовать глупый подход быстрее, чем код). Постараюсь взять за правило не использовать его и посмотрим, что произойдет.
  • Кроме того, нужно быть более осторожным при копировании-вставке, поскольку путь SAN перезаписывался ВАМИ и получались различия в пустых наборах.
  • Мне нужно будет дважды проверить счет и то, почему я ошибся с начальной суммой, заставил меня попробовать разные подходы и напрасно потратить время.
  • Я чувствую, что без возни с Excel и ошибки с опечаткой я мог бы это сделать (с оговоркой, что я правильно подсчитываю; нужно дважды проверить, что было неправильным предположением).
  • Вчера я немного подготовился и смотрел, как Джонатан Полсон решает День 5 на Youtube и читал Советы по попаданию в таблицу лидеров от mcpower.
  • Хотя я не могу печатать так быстро, как Джонатан (но, эй, я не нацелен на позицию 26 ...), я вижу, как лучше всего использовать команду «сделай это и сделай рефакторинг позже».
  • Огромная разница в том, как он бегло просматривал текст, отфильтровывая шум… ему потребовалось 1-2 минуты, а мне 30!
  • Думаю, мой друг прав. Если вы уже работали с IntCode раньше, вы более или менее знаете, чего ожидать, поэтому не нужно знакомиться с концепцией, корректировать свое мышление между 2 и 5 днями и т.д. машина есть, но изо всех сил пытались воплотить эти знания на практике.
  • Советы mcpower предлагают проверить другие сложные прошлые проблемы, подойдут, потому что я не хочу удивляться и мысленно зацикливаться на концепциях. Если вы видели это однажды, вы видели все это (последние известные слова обычного дурака).
  • Кроме того, я вернулся к VSCode. Блокнот Jupyter только замедлит меня с помощью ячеек, все еще нужно print() вещи, так что можно сделать это в VSCode и запустить файл в терминале с помощью ярлыка.

День 7

  • Сдался… на самом деле уже с Дня 6 (пятница), когда кто-то упомянул, что субботние загадки обычно трудны, и у меня были планы на вечер пятницы. Ни за что не встаю рано ...
  • На самом деле встал «поздно» около 6 утра. Давления не почувствовал, наверное, все равно уже вышел из таблицы лидеров.
  • Загадка снова связана с IntCode, а я еще не очистил свой день 5. Не выглядит слишком сложным! Надо было вовремя встать ...
  • Удалось адаптировать код из 5-го дня довольно быстро, за около 7 минут, но возникли проблемы с тестовыми образцами. Думаю, мне нужно вернуться к 5-му дню и привести его в порядок.
  • Слишком устал, уже почти 30 минут я отлаживаю и не могу ясно мыслить, поэтому возвращаюсь в постель и попробую позже.
  • Вечер, смотрю несколько решений на Reddit.
  • OMG… «Входное значение первого усилителя 0», и я продолжил тестирование с 1! ЗАЧЕМ!?? Почему я все время читаю неправильные вещиfffff из текста.
  • Моя машина IntCode все еще ошибочна, не знаю, что именно.
  • Сравнение с решением Бенедиктвернера. Почему такая сложность с планировщиком и т. Д.… Аххх, он автор Компилятора Incode, ассемблера и ВМ, так что, вероятно, это очень очищенная версия. Сделаем перерыв, чтобы разобраться в этом.
  • Вернемся к восьмому дню в 19:37 (по лондонскому времени), смотрим на часть 1 и пытаемся выяснить, где находится ошибка. Хотя все выглядит нормально.
  • Аххххх !!! Используйте явную форму в условных выражениях, Dummy! Это заняло у меня часы / дни, в моем собственном темпе, да, но это могло быть разницей между частью 1, решенной за 7 минут, и не решенной вообще.
  • Я взламывал фазу при первом чтении с этим кодом, думая, что она будет False только на None, но полностью забыл о phase = 0. Какая ошибка новичка 🤦:
if phase:
    seq[write_to] = phase
    phase = None
else:
    seq[write_to] = input
  • Кроме того, мне, вероятно, следует использовать очередь входных данных, из которой будет выполняться функция pop (). Часть 1 Готово. Пытаюсь сделать часть 2.
  • День 9, все еще выполняю День 7, часть 2. Я потерял решимость?
  • Итак, моя программа работала правильно для части 1, но я не могу понять, как заставить работать часть 2. Я потратил, может быть, уже 5 часов. Смотрю на код из решения Бенедиктвернера, решения Матео и потока Джонатана Полсона, но все еще не могу понять его.
  • Давая еще один свиток на Reddit, я прочитал [2019 День 7 (Часть 2)] Запутался с вопросом. Наконец-то ясно ... или последние известные слова?
  • Я совершенно неправильно понял, как работают усилители и контур обратной связи. Я думал, что все усилители разделяют программу, но сбросили положение. Таким образом, когда усилитель выводит сигнал, следующие усилители используют фазу для первого считывания, затем считывают предыдущий вывод как ввод, сбрасывают положение на 0, НО используют ту же программу, что и предыдущий усилитель.
  • Действительно устал от IntCode
  • Действительно устал чувствовать себя глупо
  • Действительно устал изучать концепции CS из текста соревнований.
  • Мне это больше не нравится. Скопирую и вставлю рабочее решение и перейду к 8-му дню. Я уже отстал от 9-го дня и, зная, что снова идет речь об IntCode, совсем не с нетерпением жду.
  • Есть ли какие-либо предложения по поводу слайдов на уроках информатики, которые ясно раскрывают эти концепции?

День 8

  • 21:16 по лондонскому времени, день 9, пытаемся решить задачу во время готовки. Полегче, но давлю себе немного времени… или я сжигаю еду 😂
  • Опять же, читать слишком долго ... Был пример, я должен был сначала проверить это, затем предварительно просмотреть вопрос и начать работу.
  • 11 минут, чтобы получить работающее, но неправильное решение. Начал со списка списков списков вместо простого использования numpy's reshape()
  • Выбираю reshape() numpy, но получаю странный вывод на печать. Например:
>>> np.reshape(range(12), (2, 3, -1))
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]]])
  • Ради любви к Джимми (кто такой Джимми! ??), почему строки печатаются как столбцы! ?? В любом случае попробовали немного битовой маскировки и беглый минимум, чтобы найти интересующий слой и получили ответ ... что, очевидно, было неправильно.
  • Честно говоря, я не понимаю, как numpy отображает многомерные массивы. Недружелюбно.
  • Итак, попробовал третий подход со счетчиком, то есть просто получил кусок 25 * 6 из данных и проверил счетчики. Часть 1 завершена.
  • Начните часть 2, конечно, мне нужны эти слои, а не только счетчики! Вернуться к numpy reshape. Выясните, что мне нужно 'F' упорядочить и поменять местами первые две оси (совет, не доверяйте печатному отображению многомерных массивов numpy! Я знаю, что повторяю себя.)
  • Реализуйте тройную петлю 😳. Черт возьми, меня это смущает больше, чем все мои предыдущие неудачи.
  • После многих лет работы в Matlab я смогу установить прозрачные пиксели на NaN и добавить недостающие значения к первому непропущенному значению (черному или белому).
  • Получил… не могу прочитать. Не было бы большой проблемой, если бы я не потратил несколько попыток на построение графика matplotlib.spy() 🙄. Я решил просто распечатать разделенный запятыми массив нулей и единиц, вставить в Excel, преобразовать текст в данные и использовать условное форматирование.
  • GJYEA… пффф. Про себя: «дыши глубоко, дыши глубоко»
  • Проверим Reddit на предмет эффективных ответов и обычных стримов.
  • Также нужно смириться и набраться терпения (ни у кого нет на это времени).

День 10

  • Пропущенный день 9, будет продолжен после просмотра второй части дня 7.
  • Пробую этот день около полудня по лондонскому времени, так что я не соревнуюсь за очки, а рассчитываю сам.
  • Головоломка о геометрии и тригонометрии. Последнее - боль, я никогда не могу вспомнить формулы и что-то перемешать. Все время. С другой стороны, с геометрией я могу выводить формулы на бумаге, но это занимает больше времени, чем я бы хотел потратить здесь.
  • Итак, поиск в Google для smt типа проверить, лежит ли C в сегменте между A и B. Нашел простое решение из этого ТАК вопрос
  • Делаю снова тройную петлю 😳. Для точки A выберите точку B, затем выберите точку C и проверьте, что ни одна из точек C не лежит на сегменте AB. Добавьте B к наблюдаемым астероидам из точки A. Часть 1 готова, 24 минуты. Медленный.
  • Вторая часть довольно быстро пришла к выводу, что мне нужно упорядочить астероиды по углу поворота. Может быть, через 5 минут или около того ...
  • Потом застрял в измерении угла между двумя точками. Не удалось сместить базовую ось на ось x. Также вероятно потому, что y инвертирован.
  • На самом деле я потерял очень много времени, пытаясь отладить точки, нарисованные в каждом квадранте, пытаясь выяснить, какой угол нужно убрать, чтобы сместить базовую ось так, чтобы она указывала вверх (полдень).
  • Как только выяснилось, я печатал координаты y, x вместо x, y. Итак, получил ответ, но он был неправильным
  • Сначала я подумал, что испаряю выровненные астероиды в неправильном порядке, поэтому отладил это. Оказалось, что это не имело значения. Мой 200-й астероид был единственным на своем пути, а вращение к тому времени еще даже не завершилось, так что я мог случайным образом отследить те, которые шли по тому же пути. Это не повлияло бы на мой 200-й астероид.
  • Тогда я подумал, что мой расчет угла все еще неверен, поэтому я перешел к этому SO-вопросу, использовал его и получил точно такой же результат. Именно здесь я понял, что весь сдвиг базовой оси был на 270 градусов, потому что y инвертирован!
  • Наконец, проверил, как я печатаю свои координаты. Опять же, я не мог обернуть голову вокруг верхнего левого начала координат и просто попытался поменять местами (y, x) и получил правильное решение, ура. Часть 2 готова, и осталось 2 часа! Ух ты. Я занимался другими делами, например, болтал тут и там, но все же ...
  • Основная проблема заключалась в том, что я сохранил координаты как (row, col), который фактически равен (y, x), но сам называл переменные как (x, y). Это была моя самая большая ошибка.
  • Я также был слаб в плане геометрии, пытаясь понять, как менять углы поворота. Перевернутая ось Y действительно не помогла, и я до сих пор не усвоил эту концепцию. Вероятно, следует просмотреть формулы в базовом случае и применить их к перевернутому случаю.
  • После этого дня я определенно меняю свою цель с попытки хотя бы один раз попасть в первую сотню на избежание серьезных ошибок.
  • Другими словами, я хочу повысить уверенность, с которой я пишу решения. Я все еще продолжаю тестировать вещи несколько раз, прежде чем на самом деле правильно напишу их за один раз. Это больше связано с тем, как я кодирую. Я пишу частичный код и тестирую его по мере продвижения, вместо того, чтобы писать все разработанное решение и тестировать его в конце.
  • Не знаю почему, но мне кажется, что я на самом деле поправляюсь (хотя я определенно не рассчитываю время).
  • Другие вещи, которые нужно улучшить. Основы! Я часто спрашиваю себя или гуглию, могу ли я извлечь элемент из списка по значению или по индексу. У меня никогда не было хорошей памяти, но это определенно мешает соревнованиям.

День 7 - Обновление до части 2

  • Сегодня день 11, но я возвращаюсь к дню 7, часть 2. Я хочу выяснить, почему моя машина IntCode, которая отлично работает для любого ввода из части 1, не работает в цикле обратной связи.
  • Я пытался отлаживать это в течение многих часов в 3 отдельных дня (с 9 по 11).
  • Я использовал решение Бенедиктвернера, чтобы сравнить, как программа была изменена моей реализацией и его. Я переписал части своего кода, проверил ВМ только один раз.
  • Все было проверено, но я все еще не мог найти ошибку.
  • Несколько лет спустя… Я наконец нашел 🐞. Я чувствую горькую радость.
  • Оказывается, я смешивал состояние между виртуальными машинами, объявляя входы и выходы для всего класса. Снова всплывает общая тема. Мне нужно быть более основательным в основах языка. Какая ошибка новичка:
class VM:
    input = []
    output = []
    
    def __init__(self, program):
        self.program = program.copy()
        self.pointer = 0
  • При инициализации пяти виртуальных машин все входные данные были общими, поэтому фактически первая виртуальная машина потребляла все свои входные данные и фазы других виртуальных машин, т. Е. [phase0, 0, phase1, phase2, phase3, phase4]
  • Я рад, что это был такой дорогой урок. Теоретически я всегда знал, что атрибуты класса будут совместно использоваться каждым экземпляром этого класса. Теперь и я знаю на практике. Для меня нет лучшего способа усвоить концепцию, чем бороться с ней вот так.
  • В качестве побочного примечания, я отлаживаю с помощью print() операторов. Раньше я использовал отладчик, но пару раз меня поразил C ++. Возможно, мне стоит дать отладчику VSCode для Python еще один шанс. Наверное, я бы гораздо раньше поймал ошибку.

День 12

  • Пробуем день 12 из Москвы, так что релиз в 8 утра, очень приличное время.
  • Я начал нормально и получил первый ответ через 16 минут, неверно. Не могу точно указать, почему так медленно. Я просто старый?
  • Обнаружил ошибку при обновлении позиции со скоростью и дал второй ответ через 27 минут. По-прежнему ошибаюсь…
  • Неправильно рассчитал энергию системы. Я неаккуратно читал текст. Отправлен третий ответ в 34. Снова неверно 😫
  • Хорошо, 1000 шагов… было 100 из тестовой выборки. Часть 1 выполнена за 35 минут 32 секунды, место 1169, мой второй результат в части 1.
  • Мое предыдущее ощущение, что я поправляюсь ... хм, больше не уверен.
  • Пробуем часть 2. Это 51 минута, и я выхожу из таблицы лидеров. Проблема все еще не решена ... займет много времени, и ее нужно будет скоро решить, начал рефакторинг с numpy попыток использовать матричные операции для ускорения работы. На данный момент не могу придумать другого более быстрого способа. Дайте ему поработать во время душа и повторите попытку позже. Не хочу искать решения для каких-либо умных ярлыков, я хочу найти их сам.
  • Подумал о проверке, когда все скорости равны 0, но все же нужно обновить состояние, так что это меня не сильно спасет. Не думаю, что это правильный подход.
  • Вечером возобновил, попробовал час или больше и сдался. Не удалось придумать ничего умного, и когда я увидел подсказку о GCD на Reddit, я понял, что мои попытки никуда не денутся.
  • Посмотрел пару решений и понял логику… было вроде очевидно (или нет, не уверен, что я бы понял это сам).
  • Часть 2 выполнена, рейтинг 4889 🤷

14 день

  • Встал в 7:30, готов принять релиз в 8 утра по московскому времени. Пропущен 13-й день (я пропускаю IntCode с 9-го дня, но планирую как-то наверстать упущенное)
  • Пытаюсь решить часть 1 уже некоторое время, сейчас 9:09. Пойдем завтракаем. Не приближаюсь.
  • Итак, я возобновляю работу в 9:35 и, очевидно, пропустил слишком много текста, когда (не) читал. Я взял соотношения между желаемым количеством и произведенной продукцией, чтобы минимизировать ввод ОРЭ ...
  • Добавлены ceils, чтобы убедиться, что я запускаю правильное количество рецептов, и вроде все в порядке, но не могу понять, почему я использую слишком много ORE.
  • Заглянул в некоторые намеки на Reddit и увидел управление излишками. Я думаю, что в глубине души я понял, что мне это нужно, но я отрицал… искал несуществующую и быстро исправляемую ошибку… Ну, ладно.
  • Чувствую себя глупо, больше не хочу этого делать.
  • Боковое рассмотрение. Мне нужно выучить ярлыки в VSCode, чтобы перейти к закрывающей скобке… и тренировать мышечную память.
  • Решил принять душ и снова возобновил в 11:19. Я включил музыку, теперь чувствую себя спокойнее.
  • Чтобы мыслить позитивно, мне кажется, я улучшаюсь в написании решения за один присест, что, как я заметил, мне не удавалось сделать в течение 4–5 дней. Решение все еще неверное, но проблемы также усложняются.
  • 11:51 Успех! Часть 1 завершена. Получите 1527 место примерно за 2,5 часа (без завтрака, душа и других отвлекающих факторов).
  • В общем, сегодня у меня были проблемы с концентрацией, я потерял это и был разбит. Решая, я чувствую, что приближаюсь к получению некоторых очков, но затем я взрываюсь под давлением и застреваю. Мой мозг тоже отключается, и вместо того, чтобы думать о проблеме, я думаю о том, что не успею вовремя.
  • Еще одна вещь, которую следует улучшить, - это синтаксический анализ ввода в соответствующую структуру данных. Мне потребовалось слишком много времени, чтобы систематизировать формулы в словарь, который в итоге оказался излишне сложным.
  • Еще одна вещь: Мне сложно думать о рекурсии. Хотя, надеюсь, практика меня привыкнет. Пытаемся сначала подумать о конечном состоянии, а затем о фиксированной структуре для рекурсивного ввода. Может, это неправильный путь.
  • Часть 2 работает для всех входных выборок, но не для моих входных данных, wot !? 😫
  • Просто попробовал увеличить результат на единицу, сработало… хорошо, спросит на Reddit, что не так, или сравнит с другими ответами.
  • Закончил часть 2 примерно за 20 минут… рейтинг 1280, второй лучший результат для моей части 2.
  • Не уверен, где мои подсчеты пошли не так, но я использовал бинарный поиск, и он всегда возвращает правильный ответ ... нужно еще раз пересмотреть эту проблему

День 16

  • Встала в 7:40 для выпуска в 8. Быстро позавтракала и подготовила свой dayX.py файл шаблона и два входных файла, один для тестов, а другой - для реального ввода.
  • Много текста. Я начинаю записывать несколько входов, как базовый паттерн. Быстро взгляните на последний вопрос, чтобы увидеть, могу ли я пропустить часть текста и сосредоточиться на примерах. Неа. Вернитесь к чтению.
  • Меня смущает «При применении шаблона пропустите самое первое значение ровно один раз. (Другими словами, сместите весь узор влево на один.) и приступайте к созданию этого чудовища:
signal = list(map(int, '12345678'))
base = [0, 1, 0, -1]
n = len(signal)

def get_pattern_monster(i, n):
    match = []
    p = 0
    c = 0 
    while len(match) < n:
        if i == 0 and c == 0:
            p += 1
        to_append = [base[p]] * (i + 1)
        if c == 0 and i > 0:
            match += to_append[1:]
        else:
            match += to_append
        p = (p + 1) % len(base)
        c += 1
    return match[:n]
  • Позже я рассмотрел несколько решений. Один из подходов - это индексирование напрямую без создания расширенного шаблона, например Решение bluepichu, или использовать итерации itertools, т. Е. (Возвращение списка для ясности):
def get_pattern_iterable(i, n):
   match = [itertools.repeat(b, i+1) for b in base]
   match = itertools.cycle(itertools.chain(*match))
   next(match)
   return [next(match) for _ in range(n)]
  • После нескольких ошибок в создании расширенного шаблона я наконец закончил с частью 1 через 47 минут. Довольно медленно. Ранг 1256.
  • В 9:08 проверяю, все ли баллы разданы. Не хочу больше беспокоиться о 100 лучших. У них есть, хорошо.
  • В 9:37 моя реализация работает во всех тестовых примерах, но слишком медленная. Я сдаюсь и проверяю подсказки на Reddit.
  • В 9:56 я пробую подсказку «это всего лишь сумма» и завершите Часть 2. Более низкий рейтинг по сравнению с моими предыдущими попытками, но я полностью чувствовал себя обманом.
  • Сначала я не заметил того, что сейчас выглядит очень очевидным паттерном… и мне могло потребоваться еще 1-2 часа, чтобы разобраться в этом, а может быть, я бы вообще этого не понял.
  • Честно говоря, я думаю, что просто сдался, но у меня также было оправдание, что мне нужно было уйти ...
  • Размышляя над проблемой в течение дня, я заметил, что с 14-го дня, но я пропустил 15-й день, проблемы требуют переключения передач в моей психологической готовности / желании.
  • Я не был готов усерднее искать решение. В ближайшие дни я посмотрю, достигну ли я некоторого предела интеллекта.

9 день

  • Настал день 15, и у меня психический блок. Хотел сегодня заняться разгадыванием головоломок IntCode, так как это тоже день IntCode, но я только открыл страницу задачи и даже не прочитал ее.
  • Повторная попытка в день 17 в 11:12. Скопируйте вставленный раствор с 7-го дня, который я предварительно очистил.
  • В 11:40 все входные образцы кажутся работоспособными, но программа выдает ошибку 203.
  • После небольшой отладки я вспомнил, как кто-то упоминал об этой проблеме на Reddit.
  • В 11:55 я смотрю тестовые примеры, чтобы решить ошибку 203 из этого ответа Reddit.
  • Исправлена ​​ошибка, и я закончил с частью 1 в 12:13. С некоторыми незначительными отвлекающими факторами, это заняло у меня около часа.
  • Ошибка: я не добавлял относительную базу к позиции записи для кода операции 3. Я обрабатывал значения записи как относительные позиции, поскольку немедленный режим к ним никогда не применялся ...
  • Часть 2 сделана сразу за 1 мин. Код уже был работоспособен.
  • Учитывая, что 100 человек закончили это за 14 минут ... Я стал более чем в 4 раза медленнее, не говоря уже о том, что у меня была ошибка, на отладку которой без подсказок, вероятно, у меня ушло бы еще 1-2 часа.
  • В целом это была бы простая задача, если бы машина IntCode была готова и сияла. Я думал, что это так ... но опять же, формулировка с режимами и исключениями для записи ...

День 11

  • Сейчас 17-й день, и я решил задачу на день. У меня есть еще немного времени, поэтому я постараюсь решить несколько проблем с IntCode.
  • Я начал день 11 примерно в 15:10.
  • В 15:22 я как пффф… не хочу этого делать. Я уже предвижу множество ошибок, двойной счет и все такое. Вместо этого возьму перерыв.
  • В 21:49 снова смотрю на проблему. Я не самая свежая, но спать пока не хочу ...
  • Первый ответ в 22:15, слишком высоко.
  • Не могу с этим справиться. НЕ ХОТИТЕ ОТЛАДИТЬ INTCODE. Сейчас 22:25, я проверю несколько подсказок.
  • Хорошо, я сопротивлялся. Подсказки и другие решения не проверял. Рациональная сторона победила. Он говорил мне, что машина с внутренним кодом должна быть правильной, поскольку в День 9 была функция отладки. Я / был прав: D.
  • Я настаивал и полагал, что ошибка была где-то еще в моей программе. Я рисовал ПОСЛЕ переезда!
  • Часть 1 Готово. Сейчас 22:35.
  • Часть 2 завершена в 22:47. Мне потребовалось время, чтобы понять, что я могу разбросать сюжет… Я очень устал или не хватает изобретательности… соотношение осей было неравным, поэтому сначала не мог получить картину… да.
  • Примечание. Утверждение «Перед тем, как развернуть робота, вы, вероятно, должны иметь приблизительную площадь, которую он будет покрывать:…», в этом нет необходимости! Из «Дня 3 - Скрещенные провода» я узнал, что вы можете использовать словарь для хранения координат (x, y) и значения. Рад видеть, что некоторые ранее решенные головоломки приносят свои плоды.

13 день

  • Тем не менее, День 17, хочу попробовать День 13. Я подготовил свою установку, ожидая начала в 23:00, чтобы упростить отслеживание времени.
  • Часть 1 сделана за 6 мин. Хороший.
  • 23:47 FIRST FREAKING RUN и Часть 2 завершена !!!!!!!!! ТАК ГОРДО !!
  • Теперь проверяем время в таблице лидеров. Часть 1 варьируется от 1: 33–3: 23 😐. Итак, вдвое медленнее и максимальное время в Части 2 всего за 20 минут и 26 секунд ...
  • Вторая часть заняла у меня 40 минут. Почему?
  • Сначала подумал запустить игру, набрать балл и посмотреть, сколько блоков исчезло. Затем вычислите final_score = (score / destroyed_blocks) * total_blocks. Однако я не мог понять, как получить до и после того, как мяч попадает в блок, поэтому не стал исследовать этот подход дальше.
  • Я старался не думать, что делать с джойстиком. Слишком долго мысленно избегал этого.
  • Также потерял довольно много времени при рисовании мяча и ракетки с matplotlib.pyplot. Надо понять, как это сделать быстрее в терминале.
  • В конце концов, я просто сделал прыжок веры и решил, что игра будет запрашивать ввод джойстика при каждом изменении координат мяча. Вот и все. Я считаю, что это следующая большая вещь, которую нужно улучшить. Это тесно связано с интерпретацией текста и принятием разумных предположений.
  • В целом очень доволен тем, что на этот раз написал решение за один присест и получил его правильно с первой попытки. Хотя мне потребовалось много времени, чтобы решить, что кодировать. Об этом я писал в дни 10 и 14. Итак, хороший личный прогресс.

15 день

  • Сегодня 21-й день, и с 19-го дня я не решал никаких головоломок (кроме недолговечных попыток до 18-го дня, часть 2).
  • Я в аэропорту, 14:11 по местному времени (выход в 8 утра), пробую часть 1.
  • В 14:26 я внедрил BFS, но он либо глючит, либо слишком медленный. Сделаем перерыв.
  • В 14:40 я понял, что данные изменяются при каждом запуске машины IntCode. Итак, с BFS мне нужно будет сохранять состояние на каждом шаге, что звучит довольно неэффективно.
  • Попробовав DFS с возвратом, я потерял счет, сколько времени я на это потратил.
  • Я трижды переписывал DFS. Мне не понравилось, как я сохранял путь, и у меня были проблемы с возвратом.
  • Я эпически застрял в бесконечной последовательности 1, 2, 1,… думая, что это «Вверх», «Вправо», «Вверх»,… поскольку я обычно перечисляю направления по часовой стрелке, то есть U-R-D-L.
  • Вместо этого это было «Вверх», «Вниз», «Вверх»… т.е. цикл застрял в бесконечном возвратно-поступательном движении, потому что я не сохранил координаты посещенных. Новичок и дорогая ошибка 😳. По крайней мере, сейчас эта концепция прочно укоренилась в моем мозгу.
  • Я также чувствую, что мои навыки отладки меня не оправдали. Чтобы помочь мне отладить, я запустил mcpower’s solution, чтобы проверить, правильно ли я возвращаюсь назад… ну, это не так.
  • Мне действительно нужно настроить отладчик VSCode… какая неприятность. Что я могу сделать, чтобы избавиться от этого чувства?
  • Другие действия, которые я делал, были чрезмерными: я двигался во всех 4 направлениях и возвращался назад только для того, чтобы перечислить следующие возможные фильмы, то есть те, которые не упираются в стену. Я также использовал f(x): x + (x mod 2) * 2 — 1, чтобы получить обратное направление x. Жестко запрограммированную карту из 4 полей в 1000 раз легче читать и поддерживать.
  • Часть 1 завершена в день 22. Попробую завтра часть 2, так как мне нужно записать доску, а затем я могу применять BFS, пока не найду последний и самый длинный путь.
  • Это день 23. Успокойся. Потратил время на преобразование кода в класс для личной практики. Это заняло у меня больше времени, чем я хотел, так как я неправильно обновлял позицию… надеюсь, я усвоил урок.
  • Использовал BFS для перемещения по доске, аналогично Дню 18, который я пытался предпринять несколькими днями ранее.
  • Часть 2 завершена. Написал правильное решение за один присест. Начинаю запоминать алгоритм, хорошо :)
  • В целом, я сместил свое внимание с соревнований за очки на обучение / тренировку по нескольким причинам.
  • Во-первых, все равно не попасть в топ-100. Головоломки становятся все сложнее, и мне нужно восполнить пробелы в знаниях.
  • Хотя я заметил улучшения в моих навыках решения проблем и программирования, моей лучшей попыткой на сегодняшний день остается часть 2 из Дня 2, ранг 978.
  • Во-вторых, я не хочу приходить в 5:30, чтобы сделать релиз в 6:00. Попробовав первую неделю и проснувшись перед лондонским релизом в 5 часов утра, я все больше утомлялся / менялся ритм, и в конце концов я заболел.
  • Поэтому вместо этого я просто тренируюсь в своем темпе. Я систематически просматриваю другие решения и переписываю свои, чтобы запомнить общие алгоритмы. Я решаю головоломки подольше, прежде чем проверять подсказки.

День 17

  • Примерка 17-го дня 24-го дня в 14:33. Я не участвую, так что это займет мое время.
  • Первая попытка 1-й части в 14:55, результат завышен. Кроме того, почему у меня две пустые строки на доске?
  • В 14:57 попробовал умножить минус две строки на пересечение… все еще не так !!?
  • Хорошо, обнаружена ошибка. Помимо 4 связанных соседей, перекресток должен иметь # посередине 😐, nc.
  • В 15:05 я угадал 4 раза, и он говорит мне подождать 5 минут… что !!! ??? Никогда раньше такого не было.
  • Чувство разочарования. В 15:12 я проверяю подсказки на Reddit, смотрю Решение Джонатана Полсона… Я открывал доску в обратном порядке, а… 😩
  • Часть 1 завершена в 15:18.
  • Для части 2 в 15:53 ​​я закончил подсчет последовательности L / R вручную в Excel.
  • Не знаю, почему это заняло у меня так много времени и почему я снова использовал Excel вместо кода.
  • Не хочу больше проверять подсказки, поэтому подумаю, как лучше всего это сделать. Приму душ.
  • Я проверил таблицу лидеров, и отсечка составляет 8 минут для первой части и 45 минут для общей. Мое первое решение могло быть на 22 минуте, то есть без обратной доски и ошибок проверки неправильного пересечения 😳.
  • Сегодня день 25, и я программно получаю последовательность L / R в качестве упражнения. Потратил как час на это ... слишком долго. С другой стороны, у меня была опечатка в моей последовательности инструкций…
  • В 18:10 я пишу алгоритм, который определяет 3 функции, так что набор инструкций умещается в 20 символов.
  • В предыдущие дни я читал, что проблема в сжатии, поэтому я стараюсь придумать что-то умное, а не хакерское.
  • Я знаю, что цель состоит в том, чтобы добиться максимального сжатия, поэтому я считаю вхождения подпоследовательностей и общее сохраненное пространство.
  • Идея состоит в том, чтобы перебирать подпоследовательности, выбирая сначала те, которые экономят больше всего места, и постепенно заменять их в исходную последовательность, пока она не будет содержать только функции A, B, C.
  • В 22:17 программа работает, но передача входных данных в виде строк не работает?
  • Хорошо, преобразовано в ord() и Часть 2 завершена. Отправлено и получилось с первого раза, ошибок нет! Счастлив, что мои мысли были правильными.
  • Решение может быть улучшено для короткого замыкания комбинаций последовательностей, которые не могут дать полную замену. Но рассмотрим его после просмотра нескольких других решений. Лучше начать заново, чем пытаться отполировать 💩. Может, я слишком суров с собой.
  • День 26 смотрел видео Джонатана Полсона. Сжатие вручную взломал 🙄, пффф.
  • Однако я узнал пару вещей. Я тоже попытался выбрать подпоследовательности вручную, проверив выделенную подпоследовательность в VSCode, но почти сразу отказался. Вместо этого я должен был напечатать замененную последовательность, как это сделал Джонатан.
  • Я также заметил, что при первоначальном разборе сетки я бессмысленно различал #, . и ^. Просто добавив любой символ в строку и перезапустив строку после новой строки, программа сократилась бы с 14 до 8 строк.
  • Я также использовал более запутанный подход для создания последовательности L / R.
  • Я сохранял координаты «Вверх», «Вправо», «Вниз» и «Влево» в deque и вращал его так, чтобы левый всегда был на -1, а правый - на +1. Вращение координат было излишним, так как я уже использовал mod для перехода. Мне удалось сократить программу с 56 до 30 строк.
  • Хотя длина программы вряд ли является показателем качества, я просто столкнулся с ненужной сложностью, и сокращение строк - простой и несовершенный пример для количественной оценки.

День 19

  • Раньше я боялся проблем с IntCode, но теперь понимаю, что пару раз действительно с нетерпением жду их.
  • Дни 3 и 5 были кошмаром для отладки, но теперь, когда машина IntCode консолидирована, это похоже на волшебство. Я верю абстракции.
  • В любом случае, 27 декабря, 8:43.
  • В 8:51 я отправляю первый ответ, и Часть 1 готова! Почувствовал быстрее других проблем. Я подозреваю, что таблица лидеров намного быстрее.
  • 100-й участник финишировал первой за 3:40 минуты. Что нужно, чтобы быть таким быстрым?
  • Что ж, я не сразу понял, что мне нужно каждый раз перезапускать виртуальную машину с исходным вводом. Или я просто снова стал медленно читать? Возможно, я не чувствовал давления, потому что на самом деле я не участвую в соревнованиях ...
  • Я начинаю часть 2 без реального плана, думая просто напечатать части балки с жестко заданными смещениями, вставить ее в Excel и вручную найти верхний левый угол квадрата, подходящего к балке.
  • После пары итераций я понимаю, что это никуда не денется ... Python слишком медленный для запуска. Рабочий процесс подвержен ошибкам и утомителен!
  • Я действительно изо всех сил пытаюсь удалить Excel из своего набора инструментов. Я чувствую, что это вредит моему прогрессу, но оооочень приятно визуализировать то, что я делаю.
  • С другой стороны, что, если бы я использовал C ++? Похоже, это мог быть самый быстрый подход…
  • Затем я придумываю простой алгоритм. Я в основном двигаюсь вправо или вниз, пока текущая позиция + 100 в обоих направлениях (вправо и вниз) все еще находится в пределах луча.
  • В 9:56 Часть 2 готова.
  • Все равно потребовалось много времени. Во-первых, из-за мануала + Excel трата времени. Затем произошла ошибка, так как на доске не было луча в некоторых начальных рядах, поэтому я шел вправо бесконечно. Начальное смещение строки со 100 исправлено. Потом у меня был баг в условии включения. Я проверял нижний правый угол, а не нижний левый, на предмет наличия нижнего положения.
  • Не особо понравилась эта проблема. Также смотрел видео Джонатана, и он тоже застрял, но все равно был быстрее меня (но не в топ-100). Я не думаю, что из этой головоломки можно чему-то научиться. Хотел бы быть доказанным неправым.

День 20

  • Сегодня 29 декабря, я снова в аэропорту и планирую сделать первую часть в самолете.
  • Часть 1 готова примерно за 1:30 часа, хотя я не могу проверить ответ, так как у меня нет Wi-Fi.
  • Медленный! Хотя я делал это с несколькими перебоями и отвлечениями, проблема в основном заключается в Части 1 Дня 18. Единственная разница в том, как вы организовываете порталы.
  • Я потратил время на синтаксический анализ ввода. Я пробовал общий подход, когда ориентацию портала можно легко определить, проверив, где путь соединяется с буквой.
  • Отправляю ответ на Часть 1 31 числа. Это неправильно 😐. Отладка за 5–10 минут. Я не считал шаг телепортации.
  • Хотя сейчас я попробовал отладчик VSCode (на самом деле настройка занимает меньше минуты), отсутствие клавиш F1–12 на моем ноутбуке заставляет меня ненавидеть его. Угадай марку… print() на победу!
  • В 11:40 я читаю часть 2, и это 🤯 WTF !? момент.
  • Хорошо, прочитал еще пару раз и посмотрел на пример. В конце концов, не так уж и плохо.
  • В основном, взяв внутренние порталы, те, с этикетками внутри центрального пустого пространства, увеличьте количество слоев. Использование внешних порталов уменьшает количество слоев. А из слоя 0 можно взять только портал AA и ZZ.
  • Итак, мне нужно организовать порталы в два набора и добавить уровень слоя к посещенному набору узлов при прохождении с помощью BFS и условие для выхода на уровне 0.
  • В 11:25 бег с pypy, все еще немного медленнее… Спустя 3 минуты и ответ правильный! Часть 2 завершена.
  • Это можно было сделать за 2 минуты, скорость чтения IFF + pypy + без ошибок.
  • Мне потребовалось 10–15 минут, чтобы понять проблему, и около 30 минут, чтобы изменить и отладить.
  • Одним из замедлений было то, что я тестировал входной образец после того, как основной вход слишком долго работал с голым python, но забыл изменить жестко запрограммированные границы для обнаружения внутреннего и внешнего порталов.
  • Я также сначала разрешал отрицательные слои, которые замедляли решение, хотя требование явно положительное или нулевое.
  • Тем не менее я доволен повышением рейтинга с 4296 для Части 1 до 3609 для Части 2.

21 день

  • Очень понравилась эта проблема! По-другому, сложно, но не слишком сложно. Узнал кое-что новое 💃.
  • Сегодня 2 января 2020 года, время 16:00, и я пробую 21 день. С Новым годом 🎉!
  • В 16:07 я закончил читать головоломку и делать заметки. Хотя медленно, но я чувствую, что есть небольшое улучшение по сравнению с тем, как медленно я был в первую неделю AOC.
  • В 16:44 загадка сложнее, чем ожидалось ... регистры и логическая логика ... Я такой плохой.
  • В 16:57 Часть 1 завершена… Медленно.
  • Я никогда раньше этого не делал и запаниковал. Я несколько раз хотел выручить и продолжал думать о том, насколько я медлителен, вместо того, чтобы перефокусироваться и попробовать другой подход.
  • Я немного сожалею, так как мое решение на 30-й минуте было на 1-2 инструкции меньше моего окончательного списка инструкций.
  • Я также потратил время: на преобразование, то есть string в список ord, на оболочки для инструкций AND, OR, NOR и WALK и на создание окончательного списка инструкций.
  • Я все еще чувствую, что не совсем понимаю, как преобразовать условные операторы в логическую логику с ограниченным количеством регистров.
  • В любом случае, я пробую часть 2 и решаю ее в 17:09, то есть за 12 минут. Удача?
  • Я смотрю Видео Джонатана Полсона, чтобы получить представление.
  • Через 6 минут он уже тестировал ввод и писал логику. Это был не очень линейный процесс, то есть сначала считывание, а затем кодирование, но, по моим оценкам, ему потребовалось половину моего времени, чтобы прочитать и понять проблему. Итак, я действительно думаю, что я постепенно улучшаю способность читать / понимать текст.
  • С удовольствием смотрел его объяснения. Хотя для большинства это может быть очевидно, мне особенно понравились предположения, которые он использовал для решения головоломки, и объяснения того, как обрабатывать логическую логику с регистрами T и J.
  • В качестве примечания я думал о Части 1 в терминах следующих условных операторов:
if not A and D:
    jump
elif not B and D:
    jump
elif not C and D:
    jump

и перевел на:

NOT A T 
AND D T 
OR T J 
NOT B T 
AND D T 
OR T J 
NOT C T 
AND D T 
OR T J

Во-первых, мне нужны не if ... else, а простые последовательные if условия. Вот что я на самом деле делаю с логикой. На самом деле я не уверен, как правильно переводить if .. else без GOTO. Наконец, я мог бы записать вышесказанное как:

if not (A or B or C) and D:
    jump

что переводится как:

NOT A T
NOT B J
OR T or J
NOT C T
OR T or J
AND D J

23 день

  • Еще 2 января, пытаюсь ответить на 23-й день в 19:14, это моя вторая загадка сегодня.
  • Я решил пропустить День 22, так как знаю, что он тяжелый. Сделаю это, когда у меня будет больше времени, чтобы не откладывать, как я сделал с Днем 18, Часть 2.
  • В 19:30 Часть 1 готова. Почувствовал себя быстро.
  • Написал часть 2, отправил ответ. Слишком высоко. Попробовал еще один ... снова слишком высоко. Я думаю, что моя реализация неверна, поскольку она не является должным образом асинхронной и параллельной, и был удивлен, что часть 1 сработала.
  • В 20:00 Часть 2 готова. Я догадался, напечатав значения NAT и выбрав последнее, прежде чем система перешла в постоянный режим простоя.
  • В 20:03 выяснил, где была ошибка, хотя до сих пор не уверен, почему она работает. Я проверял, когда повторяющееся значение y получено NAT, вместо проверки повторения в отправленных значениях!
  • Доволен текущей скоростью и общим кодом.
  • Топ-100 был ооочень близок с отсечкой в ​​11:48, в то время как я финишировал за 16 минут (пока что: D).
  • Вторая часть была намного медленнее по сравнению с таблицей лидеров. Отсечка составляет 21 минуту, а мне потребовалось 46. Я думаю, я потерял время из-за неправильного состояния IDLE. Сначала я сбрасывал IDLE на False не в том месте. Затем пришлось изменить условие IDLE, чтобы оно срабатывало только после двух раундов. Наконец, я печатал пакеты, полученные NAT, вместо отправленных.
  • Когда я писал эти заметки, у меня возникла мысль о своей пошаговой реализации. Реализация решения полностью асинхронным и параллельным способом не имеет значения.
  • Запуск виртуальной машины с -1 - это идемпотентная операция, она просто устанавливает для нее значение IDLE. Важно то, что мы потребляем переданные пакеты в том порядке, в котором они помещаются в очередь для каждой виртуальной машины. Следовательно, выход полностью детерминирован.

День 18

  • Заканчиваю эти записи 8 января. Я попробовал разгадывать головоломку 18-го числа, а затем несколько раз возобновил Часть 2.
  • Многие комментарии содержат знания, которые я приобрел позже, но я постараюсь рассказать о некоторых ощущениях, которые у меня были в тот момент, когда я это делал. Вот так.
  • Сегодня 18-й день, и я потерял свои записи, сделанные ранее сегодня, так что это будет неточно ...
  • Я вспоминаю, что примерно через час мне захотелось сдаться и проверить решения.
  • Однако я проверил таблицу лидеров, которая все еще была заблокирована. Итак, проблема сложная. Я продолжаю пытаться.
  • Через 2 часа я снова проверил таблицу лидеров, и она была разблокирована, но я все еще хотел получить меньше 1000, поэтому не проверял подсказки и продолжал пробовать еще несколько.
  • Теперь я потратил 6 часов на запутанное нерабочее решение.
  • Я начал с BFS, но почти сразу переключился на DFS, где узлы были на ключах, а не на каждой плитке.
  • Позже я узнаю, что DFS грубой силы на узлах, представленных ключами, не будет работать, поскольку мне нужен Дейкстра для взвешенного графа.
  • Как бы то ни было, предыдущее заявление было бы полной тарабарщиной по отношению к моему прошлому «я». Я многому научился после решения этой головоломки!
  • В любом случае, моя реализация была слишком медленной даже для двух последних примеров ввода. Очень расстроился.
  • Я взглянул на некоторые подсказки, в которых все упоминалось о BFS, поэтому проверил несколько решений от ведущих пользователей, но не смог их быстро понять, поэтому просмотрел Видео Джонатана до конца части 1.
  • Сделал перерыв, внедрил решение Джонатана, время от времени проверяя дважды. Не копипаст, но чувствовал себя близко.
  • Тем не менее, это стоит того, потому что я чувствую себя более уверенно в написании BFS. Часть 1 готова через 8–9 часов?
  • Посмотрел часть 2. Пробовал просто поставить в очередь все 4 начальные точки, не вышло. Оставим это на другой раз, так как я полностью истощен.
  • Настал день 19 и пробуем 2-ю часть в 19:00. Трудно припомнить, что произошло, но, полагаю, я только что получил удар и снова бросил.
  • День 23, 21:17, снова попытка. Я думаю, что ключи могут быть общими для каждого. Каждый раз, когда я нахожу новый ключ, я обновляю его до общего состояния. Чтобы я мог выполнять поиск параллельно. Я настолько изменил решение, что даже часть 1 теперь не работает.
  • Еще раз переделаю как-нибудь в другой раз. Постараюсь догнать день 17, надоело от этого бреда. Может быть, я потрачу время на Дейкстру со свежим мышлением.
  • Шестое января 2020 года, часть 2 наконец-то готова. Моя идея поделиться состоянием / ключами не всегда работает и не является центральной для решения. Я просто сохранил свой подход BFS, плитка за плиткой, но на этот раз набор VISITED также отслеживал состояние других роботов в то время, когда текущая точка была поставлена ​​в очередь для обработки. Затем, когда я находил ключ, я ставил в очередь и других роботов. Немного медленно, но работает.
  • В целом, мне нужно было бы пересмотреть решения других и потратить время на Дейкстру для части 1 и общий подход для части 2.