Безопасность ванной комнаты


Адвент кода 2016 День 2

Часть 1

  1. Настройка структур данных
  2. Двойная reduce()r для решения головоломки

Настройка структур данных

Моя карта для обхода массива в зависимости от направления:

{
  'U': [-1,0],
  'R': [0,1],
  'D': [1,0],
  'L': [0,-1]
}
Вход в полноэкранный режим Выход из полноэкранного режима

Моя структура данных для клавиатуры:

[
  [1,2,3],
  [4,5,6],
  [7,8,9]
]
Вход в полноэкранный режим Выход из полноэкранного режима

5 находится в [1,1]

Двойное reduce()r для решения головоломки

Итерационная часть моего алгоритма в псевдокоде:

For each line from the input
  Accumulate a code - starting as an empty string
  For each character in the line
    Accumulate a 2-element array of coordinates
    If the next location is a valid cell
      Return the coordinate of the next location
    Else
      Return the coordinate of the current location
  Add the value at the final cell to the string
Вход в полноэкранный режим Выход из полноэкранного режима

Итерационная часть моего алгоритма в JavaScript:

input.reduce(
  (code, line) => {
    key = line.reduce(
      (coords, path) => 
        keypad[coords[0] + map[path][0]] &&
        keypad[coords[0] + map[path][0]][coords[1] + map[path][1]]
        ? [ coords[0] + map[path][0],
            coords[1] + map[path][1] ]
        : coords,
        key.slice()
    )
    return code += keypad[key[0]][key[1]]
  }, ""
)
Вход в полноэкранный режим Выход из полноэкранного режима

Часть 1: решено!

Часть 2

Три обновления и готово!

Обновление 1: Расширение структуры данных

Моя структура данных для клавиатуры:

[
  [0,  0,  1,  0,  0],
  [0,  2,  3,  4,  0],
  [5,  6,  7,  8,  9],
  [0, 'A','B','C', 0],
  [0,  0, 'D', 0,  0]
]
Вход в полноэкранный режим Выход из полноэкранного режима

Обновление 2: Настройте начальное местоположение

5 находится в [2,0] сейчас

Обновление 3: Добавьте пункт к условию проверки ячеек массива — проверка на значение 0.

Итерационная часть моего алгоритма на JavaScript:

input.reduce(
  (code, line) => {
    key = line.reduce(
      (coords, path) => 
        keypad[coords[0] + map[path][0]] &&
        keypad[coords[0] + map[path][0]][coords[1] + map[path][1]] &&
        keypad[coords[0] + map[path][0]][coords[1] + map[path][1]] !== 0
        ? [ coords[0] + map[path][0],
            coords[1] + map[path][1] ]
        : coords,
        key.slice()
    )
    return code += keypad[key[0]][key[1]]
  }, ""
)
Вход в полноэкранный режим Выход из полноэкранного режима

Часть 2: Решено!

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

  • Я решил обе части!
  • Снова используя вложенные reduce()!
  • И используя мои проверенные и верные методы обхода массивов!

Начнем с первого дня… и, надеюсь, с сильного конца в целом веселого и относительно быстро решенного года!

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