Адвент кода 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
- Компьютер Intcode: Раунд 4!
- Использование
тестового режима
для устранения неполадок в моем компьютере
Компьютер 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!