Планета раздора


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

Попробуйте симулятор части 1, используя входные данные головоломки!

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

Часть 1

X = the biodiversity rating for the first layout that appears twice
Войдите в полноэкранный режим Выход из полноэкранного режима

Часть 2

X = the number of bugs present after 200 minutes
Войдите в полноэкранный режим Выход из полноэкранного режима

Пример ввода

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

Представляет:

  • Сканирование области Эрис

Часть 1

  1. Еще одна из этих головоломок, да?
  2. Генерация массива возрастающих степеней двойки
  3. Проверка соседних клеток и постановка клеток в очередь на переключение
  4. Отслеживание состояния каждого шага
  5. Установка, основной цикл и вывод
  6. Устранение неполадок, потому что я неправильно понял инструкции
  7. Построение симулятора жизни жуков

Еще одна из этих головоломок, да?

Вы знаете этот тип:

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

В чем новизна этой игры:

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

Генерация массива возрастающих чисел степени два

Create an array of length 25 (5x5)
  Fill it with values equal to the two to the power of the current index: 2^0, 2^1, 2^2, ...
Вход в полноэкранный режим Выход из полноэкранного режима

Проверка соседних ячеек и постановка ячеек в очередь на переключение

Я буду использовать список относительных координат, как и в других головоломках:

* = originating cell
A: (-1, 0)
B: ( 0, 1)
C: ( 1, 0)
D: ( 0,-1)

Visual:
.A.
D*B
.C.
Войти в полноэкранный режим Выход из полноэкранного режима

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

Using the current cell's coordinates:
  For each relative coordinate
    As long as the coordinate relative to the current cell is a valid location in the grid (not outside its bounds)
      Return true if the value in that cell is a bug
      Return false if the value in that cell is empty
  Calculate the sum of true values
  Queue the cell up as one to switch if:
    The current cell contains a bug, and the sum is 1
    The current cell is empty, and the sum is 1 or 2
Войти в полноэкранный режим Выход из полноэкранного режима

Отслеживание состояния каждого шага

  • К этому моменту я уже понял, что сравнение массивов — даже при всех равных значениях — всегда будет возвращать «false», по крайней мере, в JavaScript.
  • Вместо этого я буду хранить двоичное число, полученное из конкатенации 0s и 1s, принудительно извлеченных из #s и .s из последнего состояния переключаемой области.

Например:

Initial state:
....#
#..#.
#..##
..#..
#....

As a string:
....##..#.#..##..#..#....

As 0s and 1s:
0000110010100110010010000

As binary:
1658000
Вход в полноэкранный режим Выход из полноэкранного режима

Настройка, основной цикл и вывод

Setup:
Replace #s with 1s and .s with 0s in the input
Split the input at each newline character into an array of strings
  Split each string into an array of characters
    Coerce each character into a number: 0 or 1
Create ratings, an array of 25 powers of 2, starting at 1
Create the array of 4 relative coordinates
Create an array, states, and add to it the binary number representing the initial state of my puzzle input

Main loop:
Repeat until manually escaped via a condition:
  Create an empty queue
  For each row in the parsed grid of tiles
    For each column in the row
      Set bugs to the result of the following operations:
        For each of the four relative coordinates
          If there is no cell there, return false
          Else, if there is a cell there
            Return true if the cell has a bug
            Return false if the cell is empty
        Filter the updated list of four booleans to only include true values
        Return the number of true values
      Add the current cell's coordinates to the queue if it matches the criteria for switching a cell's value as described earlier
  For each queued coordinate
    Update the value of the appropriate cell to its opposite state: bug or empty
  Generate a binary number from the new state of the grid as described earlier
  If the tracked list of states includes this binary number
    Add the new binary number as the last item in states
    Escape the main loop
  Else, if this binary number is not in the tracked list of states
    Add the new binary number as the last item in states

Output:
Using the last binary number in states
  Convert it to a stringified decimal
  Pad the beginning with 0s until the string has 25 characters
  Split the string into an array of characters
  For each character
    Accumulate a sum - starting at 0 - according to the following operations
      If the current character is 1
        Increment the sum by the number in ratings at the same location as the current character's location in its array

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

Устранение неполадок из-за неправильного прочтения инструкций

Ранее я ссылался на этот критерий:

  Queue the cell up as one to switch if:
    The current cell contains a bug, and the sum is 1
    The current cell is empty, and the sum is 1 or 2
Вход в полноэкранный режим Выйти из полноэкранного режима

Первый if неверен. Должно быть так:

    The current cell contains a bug, and the sum is NOT 1
Войти в полноэкранный режим Выйти из полноэкранного режима

Поиск и исправление заняли немного больше времени, чем мне хотелось бы.

Но я нашел его. И я исправил его.

И сгенерировал правильный ответ!

Создание симулятора жизни жуков

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

Попробуйте симулятор из части 1, используя входные данные головоломки!

Часть 2

Отлично: значительно более сложная головоломка

  • Так обычно бывает, когда — по крайней мере, для меня — часть 1 кажется относительно легкой.
  • Войдите: Возврат к части 2 дня 20
  • Войти: Рекурсия
  • Войти: Бесконечность
  • Другими словами: запугивание += 10000
  • Другими словами: нет, спасибо

Празднование моих достижений

  • Я решил часть 1!
  • Я создал симулятор для части 1!
  • Я практиковался в преобразовании строк в двоичный код и обратно.
  • Я вспомнил, как важно внимательно читать инструкции.

Облом:

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

Финал Intcode, вот и я!

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