Advent of Code 2017 День 8
Попробуйте симулятор, используя входные данные головоломки!
Часть 1
- Один гигантский
reduce()
…? - С двумя операторами
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
! - Я построил симулятор, чтобы наблюдать за накоплением объекта!