Я слышал, вы любите регистры


Advent of Code 2017 День 8

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

Часть 1

  1. Один гигантский reduce()…?
  2. С двумя операторами switch

Один гигантский reduce()…?

Согласно инструкции, мне нужно:

вычислить результат серии необычных регистровых инструкций.

И после завершения найти:

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

Я интерпретирую все это как алгоритм, который выглядит следующим образом:

Return the largest number from
  The list of values associated with keys in a dictionary
    That has been accumulated from a list of instructions
Войти в полноэкранный режим Выйти из полноэкранного режима

В JavaScript это выглядит следующим образом:

return Math.max(
  ...Object.values(
    input.reduce((accumulator, current) => {
      // Process each instruction
      // Make sure keys exist in the accumulating object
      // And that they start with the value 0
      // Update and return the accumulating object
    }, {})
  )
)
Войти в полноэкранный режим Выйти из полноэкранного режима

С помощью двух операторов switch.

Первый switch будет обрабатывать: >, <, >=, <=, ==, !=.

Второй будет обрабатывать: inc, dec.

Чертеж для шаблона ввода следующий:

xhe       dec        -173   if vhu       >           98
registerA updates-by amount if registerB compares-to number
Войти в полноэкранный режим Выход из полноэкранного режима
  • Регистр для изменения
  • Увеличить или уменьшить значение этого регистра
  • Сумма, на которую его нужно увеличить или уменьшить
  • И условие, которое всегда содержит регистр в левой части и число в правой части

switch один зависит от compares-to:

Set a flag as false
Depending on what compares-to is:
  Update flag to whether the value stored in registerB as compared to number is true or false
Вход в полноэкранный режим Выход из полноэкранного режима

switch two выполняется только если flag равен true, и зависит от updates-by:

Depending on what updates-by is:
  Increment or decrement the value stored in registerA by amount
Вход в полноэкранный режим Выход из полноэкранного режима

Тестируем мой алгоритм:

  • Он сработал на вводе примера!
  • Он сработал на вводе моей головоломки!

Часть 2

reduce() теперь две вещи!

  • В первой части мой reduce() накапливал только объект.
  • Теперь ему нужно накопить массив из двух элементов: первый элемент — тот же объект из первой части, второй элемент — число, которое будет хранить максимальное значение.

После обновления объекта в соответствии с инструкцией, мне теперь нужно:

Determine the maximum value among each of the stored values in the object, stored as max
If max is greater than the value currently stored in the second element of the accumulating array
  Update the second element to equal max
Войти в полноэкранный режим Выйти из полноэкранного режима

На JavaScript это выглядит следующим образом:

return input.reduce((accumulator, current) => {
      // Process each instruction
      // Make sure keys exist in the accumulating object
      // And that they start with the value 0
      // Update and return the accumulating object
      // Update the max value if a new one exists
    }, [{},0])
  )
)
Войти в полноэкранный режим Выйти из полноэкранного режима

К моменту завершения работы программы max должно хранить самое большое значение, хранящееся в любом регистре во время этого процесса.

Тестирование моего алгоритма:

  • Он сработал на входе примера!
  • Он сработал на входе моей головоломки!

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

  • Я решил обе части!
  • С помощью одного reduce(), нескольких операторов switch и Math!
  • Я построил симулятор, чтобы наблюдать за накоплением объекта!

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