Сенсорный буст


Адвент кода 2019 День 9

Попробуйте симулятор с вводом головоломки!

Задача: Решите задачу для X, где…

Часть 1

X = the BOOST keycode
Войдите в полноэкранный режим Выход из полноэкранного режима

Часть 2

X = the coordinates of the distress signal
Войдите в полноэкранный режим Выход из полноэкранного режима

Несколько примеров ввода

109,1,204,-1,1001,100,1,100,1008,100,16,101,1006,101,0,99

1102,34915192,34915192,7,4,7,99,0

104,1125899906842624,99
Вход в полноэкранный режим Выход из полноэкранного режима

Каждый из них представляет:

  • Intcode-программу, которая выполняется на Intcode-компьютере.
  • Где каждое целое число представляет собой либо опкод, либо режим параметра, либо параметр внутри более крупной инструкции.

Часть 1

  1. Компьютер Intcode: Раунд 4!
  2. Использование тестового режима для устранения неполадок в моем компьютере

Компьютер Intcode: Раунд 4!

Предыдущие статьи этой серии — за дни 2, 5 и 7 — обобщают правила, изученные до этих моментов.

До сих пор мой компьютер Intcode понимал следующие правила:

  • Опкоды 1,2,3,4,5,6,7,8,99.
  • Режимы параметров 0,1.

Эта головоломка вводит:

  • Один новый бит состояния, которым нужно управлять: относительная база, которая начинается с 0
  • Один новый опкод: 9 — он изменяет относительную базу.
  • Один новый режим параметров: 2 — это поиск нужного значения в памяти по отношению к относительной базе.
  • Значения, хранящиеся в памяти, будут на порядки больше, чем встречались ранее
  • Адреса памяти, на которые ссылается программа и которые существуют за пределами первоначально выделенных максимальных адресов — программа должна быть обновлена, чтобы приспособиться и искать или записывать в эти места без ошибок в середине выполнения программы.

Использование тестового режима для устранения неполадок моего компьютера

Как указано в инструкции:

Программа BOOST запрашивает один входной сигнал; запустите ее в тестовом режиме, предоставив ей значение 1. Она выполнит серию проверок каждого опкода, выведет все опкоды (и связанные с ними режимы параметров), которые, по-видимому, функционируют неправильно, и, наконец, выведет код ключа BOOST.
Когда ваш компьютер Intcode полностью функционирует, программа BOOST не должна сообщать о неисправных опкодах при запуске в тестовом режиме; она должна выводить только одно значение — код клавиши BOOST.

После добавления кода, учитывающего новые правила, я запустил свою программу с вводом 1.

Я увидел следующее сообщение:

[203, 0]
Вход в полноэкранный режим Выход из полноэкранного режима

Я знал, что это означает, что в логике моего компьютера Intcode есть ошибка.

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

Вот что я увидел рядом с этим выводом:

209
209
203
Вход в полноэкранный режим Выход из полноэкранного режима

До первого 209, ни одно зарегистрированное целое число не содержало 2 в любой позиции параметра.

Что это пыталось мне сказать?

  • Скорее всего, я неправильно обрабатывал относительный режим в своих функциях инструкций для опкодов 9 и 3.

Проверяя код этих функций, я заметил то, что упустил из виду в правилах пятого дня:

Параметры, в которые записывается инструкция, никогда не будут находиться в немедленном режиме.

Я не учел этого, жестко закодировав position mode, он же 0 в функциях, которые записывают в значение.

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

Я повторно запустил программу.

Мой вывод включал только одно значение:

  • 10-значное целое число.

Это был правильный ответ!

Часть 2

Самая простая часть 2:

Run the program with input 2
Wait a little while
Return the single output value, a coordinate
Войдите в полноэкранный режим Выход из полноэкранного режима
  • Проверьте
  • Проверьте
  • Проверьте

Это снова был правильный ответ!

Я сделал это!!!

Как отмечалось в начале инструкции части 2:

Теперь у меня есть полноценный компьютер Intcode.

Также:

  • Я решил обе части!
  • Теперь я решил восемь частей четырех головоломок, в которых я успешно собрал компьютер Intcode.
  • Я построил четыре симулятора, которые воспроизводят определенные функции компьютера Intcode.
  • Я решил 4/5 головоломок, упомянутых в Дне 25 — скрестим пальцы, что я смогу решить и головоломку Дня 17!

Оцените статью
Procodings.ru
Добавить комментарий