Категория шесть


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

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

Часть 1

X = the Y value of the first packet sent to address 255
Войдите в полноэкранный режим Выход из полноэкранного режима

Не приводится ни одного примера

Предлагается только один пример:

Например, три инструкции вывода, задающие значения 10, 20, 30, отправят пакет с X=20 и Y=30 на компьютер с адресом 10.

Часть 1

  1. Компьютер Intcode: 11 раунд!
  2. Пытаемся понять каждое правило
  3. Запуск программы для поиска подсказок
  4. Просматриваю мегатред решений на Reddit в поисках помощи
  5. Эта головоломка мне не по зубам

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

Эта задача кажется сложной:

Вам нужно перестроить сеть с нуля.

Эта головоломка похожа на День 7, где несколько компьютеров и программ работают одновременно, генерируя выходные данные и передавая входные данные друг другу.

Попытка понять каждое правило

Компьютеры общаются, посылая друг другу пакеты.

Всего их 50, на каждом из них установлена копия одного и того же программного обеспечения контроллера сетевого интерфейса (NIC).

  • Мне нужно будет отслеживать состояние нескольких компьютеров и столько же входов и выходов программ.

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

  • Подождите. Значит, я должен сам выбрать сетевой адрес? Или я должен выбрать числа 0-49?
  • И мне нужно будет поставить этот адрес в очередь как начальное значение некоторой входной переменной для каждой программы?
  • Надеюсь, все это станет понятно… либо в инструкции, либо методом проб и ошибок.

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

  • Пункт 1 остается без ответа
  • Пункт 2 кажется отвеченным: Да, начальным входным значением должен быть назначенный сетевой адрес.

Все пакеты содержат два значения X и Y.

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

Пакеты, отправленные на компьютер, ставятся получателем в очередь и читаются в порядке их получения.

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

Отправка и получение пакетов

Чтобы отправить пакет на другой компьютер, сетевая карта будет использовать три инструкции вывода, в которых указывается адрес назначения пакета, а затем его значения X и Y.

  • В конечном итоге программа будет генерировать три значения в качестве выходных данных.
  • Возможно, ответ на пункт 1 выше: программы будут диктовать адреса.

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

  • Хм. Итак, минимум одно значение может быть использовано любым компьютером. Но не все три.

Если очередь входящих пакетов пуста, укажите -1. В противном случае укажите значение X следующего пакета.

  • Ничего себе. Значит, мне нужно условие для проверки значений в выводе каждой программы.
  • Меня смущает next пакета. Где здесь играет роль порядок?

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

  • Значение X для следующего пакета, но значение Y для того же пакета? А?

Как только оба значения пакета будут считаны таким образом, пакет удаляется из очереди.

  • Вот это да. Мне приходится управлять очередью пакетов, содержащих накапливающиеся значения.

Инструкции вывода не ждут, пока отправленный пакет будет получен — компьютер может отправить несколько пакетов, прежде чем получит хоть один.

  • Таким образом, очередь будет меняться по размеру, причем один компьютер может быть активен в течение некоторого времени.

Входные инструкции не ждут прихода пакета — если пакет не ожидается, входные инструкции должны получить -1

  • Это ссылается на условие, представленное выше
  • На этом этапе я совсем запутался.

Каково значение Y первого пакета, отправленного на адрес 255?

  • Вот задача, снова
  • Это подразумевает, что один компьютер будет иметь адрес 255.
  • Это то же самое, что сетевой адрес?
  • Это не число от 0 до 49.
  • Так зачем вообще упоминать этот диапазон номеров сетевых адресов?

Запуск программы для поиска подсказок

Используя входное значение 0

  • И запускаем одну копию программы.
  • Кажется, что она работает вечно.
  • Так что, когда ограничение на 20 процессов инструкций
  • и отображая только значения, сохраненные в качестве входных данных
  • Она показывает три целых числа: 62, 64, 65.
  • При увеличении ограничения до 200: 62, 64, 65, 64, 65, 64, 65, ...

Используя входное значение -1

  • Программа выдает ошибку, я полагаю, потому что она пытается обработать опкод, равный 10.

Я в полном замешательстве.

Просматриваю мегатред Reddit Solution в поисках помощи.

  • Там упоминаются многопоточные алгоритмы, асинхронные алгоритмы, несколько списков из 50 вещей для отслеживания всех вещей, избежание условий гонки и неблокирующий ввод-вывод.
  • Все это только усиливает мое замешательство и снижает мой интерес к попытке решить эту головоломку.

Эта головоломка недоступна для меня

Очень жаль, потому что это уже вторая компьютерная головоломка Intcode, в которой я не смог решить часть 1.

Я все еще надеюсь, что смогу решить День 25 Часть 1, потому что я решил Дни 9 и 17, и поэтому у меня есть полный компьютер Intcode с поддержкой ASCII.

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

Но сначала, последняя не Intcode-головоломка в этом году… скоро!

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