AOC Solutions

For a description of this problem, please check the Advent of Code website.

Example Input:

##################################################
#O........OO.##O.OO......O.O.OO#O....O.......#...#
#...#O...O.O.O....OO..O..#.....O.....O..O.O.OOO..#
##..O...O.OO.O.#O.......O...OO........OO#.......##
#OO........OOO.....#..O...OO....O.OO#..O.OOO.....#
#O.O..OO..O#...##O..#..##.O#..O......O.O.O...OO.O#
#.....O#.........O#O..#...#.#.O...OOO.O#...O.....#
#OO..O.........OO.OO..#O......OO.O.OO..O.O#.O..O.#
#..#......O......O..O..O#O....O......O....#O.#.#.#
#O...#..O.......O.O...#.O.O.OOO.#..O..OO...#O#...#
#OOO..#..#OO....O.O...O.O..........OOO.O.#O......#
#O..O...#....OO.OO.....#.....#...O...OO....O...O.#
#...O....O#..#.O....O.......O........O....#....OO#
##O......O.......O...O##.O.....#O.O..O..........O#
#.O#OO.OO....O..O...O...O.O.O..O..O.....#...O...O#
#...#..O...#....O...O##..O..#.........O.....OO...#
#.O..O.....O...#..O#..OO#...O.O.....O.O#.........#
#.#...#..O.OO..O#.......O#.......#...OO..O...O...#
#.#...OO.#O..#.......##.......##OO..O.O..O..OO...#
#....#...OO.OO....#O.....#..OO..O..O.O.O.#..O....#
#....OO....#.#.O.O#........O...O.#..#OO.OO#OO.O.O#
##O....O.O.#O..O....##......O..OO.O.....O...O#.#.#
#..O..#..O....OO........O.#O..O.O.O#OO..#.OO..O..#
#.......OO..#O#.OO..#.#........O#O...O..OOO..O..O#
##O..O#.O.##O...O##OO#.#@...#..#O...O...##.....OO#
#...O....O.O...#OO..OO##...O#OO...O...O...#.....O#
#.O.OO.....#..#OO.....OO....O..OO#.OO...O.#.O....#
#..O..OO#O.......OO...O#.OO...OO.#.......#....O.O#
#......#OO.O.....O.....O.....#..O....#.#OO...#...#
#.#OOOO.O.O......O....O#..O...O.#...OOO...O.OOO..#
#.#.O..OO...O##.O.O..O...#.#.O..#..OO#......#OO..#
#....O.#.#..O..#OO...#..###.O....OO...O..OO.O.O..#
#.O.O........#.OO.#O.O...#O..O...O.OO#...O.......#
#OO.O.....O.....#...O..O....O.OO.O.O....O..OO....#
#O..OO...#O.O#.OO.O........O.#OO....OO.......#.O.#
#...OO...OO.OO......O.O.O...OO..O.O...O.O......O.#
#.O....##.O....#O.#O....O..#O......#O.O.O.##O#...#
#..O.....OOO........#...O...O.....O.O...O.OO.....#
#......OOOO.....O..OO...O#.O.O.O..#.OO..OOOO...OO#
#OOO.O.....OOO...O.O.O...OO....O.#.#.#..O.....#.##
#.#O.....O....#O.OOO..O..#..OOO.....O.....O..#..O#
#......O........O...O....O...#....#..O...O.O...O.#
#OO...#.O#O.O....O#.#..O#..O...O......O.O....O...#
#O....#OO#.....OO.OO.....O.......OO...#..OO.O#...#
#...O#.OO...OO.O..O..OOO.OO.....O.O.....O.O..#.OO#
#O.O..O..O##..........O#O..O.#.....#O...O.##.#O..#
#O.O................O.O.....#.OO.O##....#O.O...O.#
#.OO#O.O..O.#..O#..O...O#.............#..O....OO.#
#...OO....OOOOOOOO#.....OOO.O............O..O..O.#
##################################################
>><v<^<^><v<<>^>^v^><<<^<^><^v^^vv>^v<vv^<<>^v>^<<v><>>>>>^^v^>v^>><^>>v>>^<^>>>>>^v<>^v^<<<>>><>>^v^^^^^>^<^<>v<>v>>v<v<>>>v>>>^>v>>v>v^v><<v^<^><>>vvv>>^>^<v^<>^v^><>^<^<^>>v<v<v>>v^<^><^>>vv^<>>v<<vv<>^^^^vvv<^^<>>><vv>>>><v<>^vv^<v>v<>v^><>>v^<^^<<><<v^><>>>v>^>^<>^><<<vv>^<^v<><v<<^<vv<<v^^><<^<>vvv<<><>vvv>>^^^^vv<v><<<v>vv<<<v><v>^v>v^>>>>^<<<<v>v^v^<v<vv<>v<<v>>><^><v>v<>^^>^<vvv^>^^<<<v<<<<<^<^<><>v>^>^<^^<v<<>><v>v>>^<^>>>^<vv^v^^v^^^><^<v<^^^vv^<^>><vv<<<^^v>^v^^><<<^<v^<<^<^>^>>>^>>^<^>^<<<vvv<^^>>>vv<>v><><v>v>v><^^<<^vv^>><<v<>vv>><<vvv^<<<^<^^<>>^>^^^<v>v<<^>>>v<^^><<>>v>v^>vv^<vv^<v^<^v<^>>><<v^v<<v<<vv^<^v^^^^^>>>^v><^v<<><^<<>>>vvv<^^<>^v<v><>>><<^vv^>>^><^>>^vvv^^^^<v^<>^vvv^>^^vv>^><^v<>>vv><v><<<<^v<^^><v^>v<>>^><v^>v^<>v^<>^<^>><^^<^^<^<v^vv>^<<<><<<v<v>>>v<vv>^<v>^<v<><^v^<<>vvv>^^^>v<^>>>v>^>v<>v>^^><>vv>vv<^v<<v^^>>vvv<v<><<<>^v^vv<v^<^vv^^v><<>>v><^^<^vv>>^<<vv^v<>vv>>^><<v>>>><<>^<>>><>><>>^<><v>^^v^<<><^<<v<^v>^^v^^<<>>^>^^vv>>^<^>^<<^v>>^><<v^^>^>>vv^^v>v<<
>vv>^^>>v>^>>v<<<^v>^><<>v^><>^<<><v^v^^vvv<<<<^^^><v^>^<v>>^<<^<^>>v>^^vvv>v<<>>v<<^<v<<<vv<^v<v^>^^^>^<^<v><>>^><>>v^^vvv<vv><<vv^>^^<<>^^v>^^>^<v>v<^<^^^v<>^^vv>vv^v^^v^vvvvv<<>^<^^<^^>^<>>>>><<><<>>^^<>>>>^<<^<<v<>^vvv<v<<>v>v^>^^v>>^<v>^<>vv><v<vv^v>>^^<^<<>^v^^^>^>v^v^>^^>>>v^><>^>v^vv^^>^<^^>^<<vv^>v><>^<v^>v^<<<>>v^^<^<v^v^vv^^<>^><>><v>^^>vv<<v<v>><<><>v>v^^<<^^vv^vv^>><<>>v^v>>>>^v^^>>^<v><^^v>>^><><>>^>v<v^>v<^>v<v>^^^v<^v>>vvv<>>^vv<<>>^^vvv^^<><v<>^>^<>>^v<><vv<><><<<<>>>^<vv^v<v^<vv<v>><><v>>>v^<<v^v^>>v<v<v<>v><<>v>v<^^^><v>^v>^>>v>^>^v<^vv^>>^>>>^<>>v<><v><<>>><<<v^<^<vv>><^>v>v>^vv>^<<<^><^^v>v^><v<<^>vv<<^^^^>^><<>^^>>>v<>v^^>vv^v<><v^^v<<>v^><<<v<<^<^<^^v<><>^^^>v><^><v^<>>v><v^v>^>>v>vvv<v^<<>><v^>>>v^v>^>>^^v<<<><^<^>>v<vvv<^<^><<v>>^<v^^>^v>><>><<^^^^^>^v<v^^>^<<>vvvv^><<v^^>><^v^vv>v^^v<^<<^v><>^<^^>v^>^<v<<^<^^<v<v><<<v^<>^v^^v<><<^^v^><<><>v<<v<<>><vvv^^<vvv<vv><>vv><^>>^^<^<>><<>><>>^<<v>vvv><^^vv^vvv>>><>^^>>v>><><<><><^^^<>>>>>vv^^v>^<>v^>^><v>vv<v<<>^>>>^>>
^v><<^><<v>v^^^>^>>><^^^>v^^v>^v^^<>^^^>>^>><<><<v^>vv<v<<^>^^v^><><>vv<v>><vvv^^><<<^<>vv<<^v^>vvv^v<v^v><>>^v>^^>vv^<>v^<v><v^><><^^<>^^>v><v>>^vvv<>><<^>^>vv<>>^<v^vvv<<<><<v>v<>>>v>vv^>^>vv>v<>^v<><^v>v<<^>^>vv>^<<>^^<<v<v><>^vv<>vv<>>v^^><><^<^<v^>v>>>v^><<v>^<^>^>>><^>>^>^^v>vvv^<>><><v<<>v>v<><>v^>><v>>>vv>^^^v>v^v<>^<<<^v<<<>>><^v<^v>v<^<>><<vv<^^v^<v^>>^^<<>^^>v>vv^<><><<^<>>>vv^^>v>v^<v<^^vv^vv><v^>^^<^>^^<>v>v>>^><<<v>^><<>><v<<>><<<v>^^<>v^<>^>v<<<<<v<^<>v^v^^<<^<vvv<^<>vvv^v><v^>^v^^^>v>vv<^>><<v<><>>>^v<v>v>vv><v>^v><<<<^<^<>>vv^>vv^v>v^v>v>^v><<^v><>^>vvv^v<^vv>v>v^v^^><>v^^vv<^<v><<v<^<^^>>^v^<<^vvvv<^>^^^^v^^^^>^^v<<vv<v>>^>^<>^^<<^<^<^vv><^>^^vvv^>><>>^v>v^^^v><^<v<^<^v^>^^<>>vvv<>><<<<<>^<vv<<<^>^^><><<><^^>v><^>>^<^v<^^v<><^>>v^<>^<<^v><<^<v<^v^^<v<<^vv<>>^v<>vvv<>v>>^<vv<v^^v^>v<><v<^vv^>><v^^<^>>v<>vv>>v^<>^v><><^^^^vvv>>^<^v^^<^^><<v<^>>><^>^v<^><<>v>v>>vv^vv<vv^^vv<>vv^>^v^>>^<>><<v<><<^<v^>^<<<vv^^^^^^^>v^>>v<^>^v^^v>^v>^<>vv^^vvv^><v>>v>>v>vv<v>^<>v<>>>v>>>>^<
<><>^v^<v^^<<>v>>^v><<v<><<v^^<vv>>^v<^v<<^<>v<>v^>>>>^v>>><v^v^<v^>^^^v>^>^^>^<<^^>v>v>>^^<>>>v<<v<<>v>>><^^^>vvv<<v^<v<<v>v^^v^><<>^v>^^>><>v<>^v^>>^v^<vv<^<<^^<v^v^>v^<<<v<>^><<<>^v<>>^>>^<<v^v>^vv>>>v^>vvv<<<v<<vvvv<>v^>v^v^<v<<<v<v><vv^^^>^>><>^^<<v<^v<^<>^^<>v<^v^^^<>vv^<<^^<<<v>v>v^<>^^^^<v><^v<^><v^>><<vv<v^>v<<<<^^^>^^v>v^v^^>><^^^><v<><v<<v^^>>>^^<<v>vvv^><^v^^>>vv^v^>^^vv<><>><<<><>^><v<v>>>^<v>^>v^>v>>>^><>^v<>^<v<<vvv>>>>>>^v<<v^<<<^<<^<^<vv^<v<<^v^<vvv>^^v><vv<^><^v<><^<>^<>^>>>>^>>v>>^^v><>v^<<v<<^>vvv^>^v<^<>^v>^^><v>>vv>^^^<v><><^>><^<<<v>><v<^^^vv^v^>^><v<^>^^><^>>>v<^><v^<<><vv>^^^v<>><^v<^<<<^>v<v><vv<vv^v<<^<<<>^<v>^v<<<^<^>^v^v>v<>v^v>^<^^v<v<><><^<<>^<<vv>v>v^v<v^><>><v^^>>>v<^vv>^><^^<v<>>v^^^<^^<<^<>>v<^>^><<<v>><vvv<>^^^^vv>v>vv^>v>><v^>vv>vv^^^<^^vv>><>^^>>vv<^><v<<v^>^^<vvvvv><v><v<>^>><><<<<v^>>>v><^^v^v^>^vvv<<>>^<v>v^^^>v^>v>v<v^^<><<><<^>><v><v<<v^>vv<v<>>><<>^v>^^<v>v^v<<>v^<^^>v<vv><^<>^>v^^v>>v^<>><^>^v<v^^<>v>>><<<v<^<>><>><<v<^>><<^>>>><<vv^^^v><^^>
v<<<vv>^<>>^^v<v>^^^<<vvv^><<^>><<>>>><v>v^<>^^^^<vv^^><v<><>><^^>^<v<>>>>v<>>><v>vv^>v>>>^<^vvv^^v<<vv>v^>^v<><^>^<v><v><v<<^<<^><v<<v>>^<>^<v^<^<<v>^<<^>v>><<>>v^v>vvvv^vvv>^^>^^v^><vv^>v<>^<>>>v<vv<<v<^>v<v><<<v^^>v<^<^><^<<v>^^>^>>^>vv<<<v^>^vv>>><v^>^v<<v>^<vv>^vvvv^>>><vv<v>v^^v<vv>v<>v>>>>v^^><<><^<><v^>^v^>^^>^^<<^v^v>>vv>vvv>v<^>^^<<><<<<^>^>^><>^>vv>>^v^^<<<^v>>><<<<vv^<<<vv<^<v^^<v<<>^v^<^^>v^><v<v^<<><>v<^<<<<>^^v>^vv><<<^v<<^>^v><>v^^v<^v<<^<^<<>^^^<v>>v<^<^>>^^^v>vv^><<>^v^vvv><^>^v<>vv^^^<vvvv^<v>^>vv<>^^^^v>^<^<<^^>v>v><v<^vv<<<<>^^><><>v^^>>>>vv^^v^^^><v^^<<v^<>^>v>><>>>>^v<>^vv>v<^>^^^>^>v>^^^^v<v><>v^^<^^^v<vvv>^<<v^>>><<v>>v>^vv<><<<vv^vv^^<>><v<^<<vv^^<v><^<<<^>><v^^<^^><><><^^^<^^><^<^v>>vv<v<<>>vv<<vv>>>><>^>^<v>>^<v^><vv>^v^v<^vvv^<>><>^^<>^>vvv^<<>>><vv>^>v>>>>>v><>^><<<v>^^v<<^v<v<^^^vv^>vv>v^<>>><^<<v>v<v<v^v><^v^>v>^^v<^^^<><>v^<>^<<^^<<v<^^v<<<^>^v^v>^^^v<^vv><v>vv>^v<<<v^v^^^v^<><^v<<v^<<<^<^vv<v^^>^<^<<v^>>v>^v<<v>v<v<vv>vv^^v>>>v^^v^<<>>^^<<>v>^^vvv><^<>
>v^v<v><<^^>^<<v<>v^v<<<<<^<v<v^<^<>v<<^v<>v>vv^>>><^vv^v>vv^<<vvvv^^v<vv^v<<^vv^v<v>>v<^v<v<<^<<^<^v^>>v>^<<v^^<^^><v>>^><^><>^>>>^v^^vv^v^<<^><^^v><<vv<><v>^^>^^<v<v>v>^<<vv>^><^^<<<<v><><v>>v^^^^>^>>^^v<v^<v<^^^>>^v>>vv^<v<<<<>v^<>v>v><<^>^<^v<vvv>^<vv<<<<vv>^v<v>v><v>>>><>vvv^>v^v>^^v<v>>>^v>^^<vv><^>v<<^>v>>^>><>^vv>^v^v<^v>^>v<><v><v<^vv>^<><>^v^>^^<<<^>^^v<<v^v^>>^^<v<v<<<><<>>v<^v>>><^vv<><<^v>v^<^v^<<><v>>^v><^v^<>><^vv<v>>>v^<v>^>^<v<^v<^^<^^>>^<>>v^<<^>v<^>^<^>^>>^^v>^vv>^>><^<vv^v>>v<>v^v<>^^^v^<^><<>^^<^<^>v<^vv^><v<v<<><>vv^^<>>>>^v>^>^^vv<<<^<>>>v>^<v^<^vv>^^v>>>vv^>><>><<<<^<vvv<>^^<>^<v<v>v<<><v>><<>v<<^v>vv>>><^v<vv^>>>><<<v>v^vv>><v><>^>^^><v<>v^<^^vvvvvvv>v>v^v>v^<><>v>v<<<>>v^vvv^>v<vv<<^<^^^<v<><^>><v<v<<<vvv><>vv^^v^<v^><<v>^<<>^<>>^vv^<^<v<>v^>^^>^<v>>>^v>v^^<<<><vvv<^>v<v^>>^<^v^^<<vv^^v<>v^v^>v^><>v>v<^<v^^v>vv<<^v^>^v^^v<v<^<<v^>^vv<><v^<vv^>^>>>v^>vv^v<^^v>>^<v>^v<^^<>><>^>>^^v<v^>v>v<>>v^^vv><v^<>vv<^>v>^^>>>v<^v^v<v^<^v>^<v<<>v<<><<<<^>>>^^>^<<^vvv^<>vvv><
<^>>^><^v<>^^>v<^<>v^>^>>>v><^v>v^>vv^>^<v>^<^v^>v^^>v<>><^^^v^<>^v>><v<>^<^vvv<<>^v>v<<vv^<^v^<^><^<><v><^<<<><vv<>>^v<>^><<>vv^v<^>v>>^<>>>>>^<<<>^v^^<^<v>vv^<v^v^^<>^<v>vv><v>^>^^^v^vv<<^^<<><<^>>>v>^<>^>^<>v<^<>v^>v^vv^<v<^^>>^v<<><>^v<<>v^><<^><vv<<v<<v>>^<v^>^<v>^v^>vv<v^^vv>^<<>^<^>^>>^^<>v>^<^<^vv<>vv>v><v^>v^<^^><^v<^^<><<v^<v<v>v<^v>^<>>^^v^>^^v^<v^^^^><<^<<v^><><>v^^v^<>>v>^<<<^vv>^v^>v><>^v<vv<^<>vv^v>v>>v><^<><>^v^<v^^<vv><^vv<vv>>>v<^^v<v^vvv<^v^<^>^><^^<v>v<^vv<>><<v^<>^<v^<vvvv>>><vv^<<^^>>>^v<<v<^^<^^^<>v^v<<^v^>>><>vv^v^^^^v<^^<<>v><>>vv>vv^<^v>v^<^^<>^^>^v<<v>>^vvv>v>vv><^<v<<vv<><<v<v<^^^<>v<^v<>vv>><^v<>>v<<^^<v<<>^v>v^>^<<^<<<<<v<^>vv>v<<<<<^>v>^<>>>v<><<>v>>vv>^^<v><v>^v>><vvv<v>>v<<^vv>^v>vv>v>>v^v<<>^<v>v^^<<v>v^^<<<^v<<<<^^^vv>>>>>v<^v<><v<v^vv^<vv<<<<v>^<vv^>v^<^^^^>^vv<v^>^>><>^<v>^<<^v>>>>vv<^^v><<vvvv><v<>>^<<<>^^^v>v>^^>vv<v>>^>^>>v<<<^v^v^vv<<>^<<>v>vvv>vv<<v^^<^^>^^v><vvv<<^^<v^>vv<^vv<>vvv^vv^^>>^>>^v>^v>>v<><>v^<<^^^v<<<>v>v><<^v>v^^vv>v>^^<>vvvv<>>^v
^vv<^<>vv^<>>>><<v^^^^>v^<v^^v>^v^v<v^v>>^<><<v<<^>>^^v><^^>^v<><^v>vv^>>><<>v>^^v>>><vv^>>^^<<>^<^^<v>>v<<^^^vv<<><^^<<^^<^>><^<>v<>v<>>v<>v^^<<v>>v>^^vv^^<>^>><^v>^^<^<^^>>>^<v>vv^<>^vvv^v><v<v>^^^v^>^>><^<v^<><>^^>>^><v^^^v^>^<>^>>v><v>^<>^^v>>v><><v^>>^^^>v^><>>vv<<^><v>><<^v>>v<v^<>v^v<<v<vv^v<^v>>^<v><vvv^^<v^vv>^v<>v>^v<v<^v<>^<<<<^^>>v><vv^<<><>>>^<^v>vvvv<>^v>^<^^<<vv^<v>vvvv>^vv^<^>v>v<<<<v^<<<vv^<<v>>v>v^<^v^^v<<vv><v>^^^<<<<v^>vv><vvvv<>>>v<^^<><^>>^^>v^v><<<>>>vv<<<v<>><v^<<^>><v^><v<vv<vv><^<v<v<>>^^<v><^^v<^>>>vv>v^^v^v>v>>><>vv>^vv<^^<v>v<<v><><>^v><><<^><v>v>v>>vv^>>vv^>v<v<<<^<<vv>^^v>>>^><^>>>>>>^^>^>^>v^vv>><v^v^<>><<<v<<>^<>^^>>v<^<><^<v^v><^<><><<>><vvv^v>^v><<v<><^<<^<vv<<^^^>>>v<^<^^v^^><v<v>^<^^v^<>^v<^v<><<^^^^^^^<>v<v^^^^v^<<^>^><<^^v>v>v<>^>>^>>^^^<>>^^>v^v<v^^^>^<^<^<>^v^>v<vv<<v>v<v<<<^>>v^><>>v<>^<<v<><>^^^v<^v^^<<vv<>^>><<>^>v<^>v>vv>^<^<>^v>vv^^<<^>v<v^<v>^<v^><>^v<>^^^>v<<v><<<>>>v>>v^<^<vv<^>vv<vvv<>^^^^<vv^^<v^vv<>^v>^^>>v><^>^<v^v^>^>^<^^>><^<v<v<>^
^^vv>>v>v<v<><<<>^<<v<<^<>>^>>>^^>>vvvvv<<v^<<>v>><<><^^>^^<v<>><<>v<v^>^<^<<vvv^<>vv<v<^^<^^v<^v<v>>>^v>^^^>^><<v^<v><<^<<<^>^>><^<^>v<v<>vv^>>^^>>^>^v>v<v><v>v<v<>>^>^^>^^v^^^<v>><^vv^vvv<>vv>vv^<<v>><>>^<v^>^v^^^vvv>v^<<^<<v>>v^^<><<^v><><^^>^<>>^^vv<^<^v<><vv<v^>^>^>>><^^>^vv<v>vv^<^^^v^<^<v<>^^^v>>>>v^v>>v>v>v<<<<>^vvv<>^^v>^v>>v><<v^>^>><v<>^v>><<v<>><><<^>^^vv<>^>^v><v<vv<<>v^v>v>^^^vv>>>v><<^<>><<^<<^v<^v>>v<<v<v>v<^<^<^<>^<^v<^v^v^<v<<v^^v^><^>>>><^<>v<v^><>v>>v<>vv><><^>>>v><^<<v>v<>v>>>v<<v>>><<>v>v^<^<^>>^<>>v>^v><>vv<><<v>>^<v^<<v<^><><^vv^><v>>^v<>^v^v^>v><<v><<>>^>v^><>>^vv>^^^^<<<<^^><v<<v<^>v^>>><v<v>^>>v>^v<^v>v><^v^>v<vv>v<^vv><^^<>>>>^v<>^v^><v>^>^^^^>^>>^v^^<<v>>^v^<<^>>>vvvv>^><vv><vvvv^><<><v^<v>^^>v<vvv^^^v<<v<>>v^<^>^^><<vvv^v^^v>>>v><<<<^^vv^v^<<^<<><>v^^>>>^>><^^v^^<>v>^<<>v^<^<v>^^<<^v<v<^<v>^><<v<v<<vv<>>v>^<v>^vv^v><^^>^<vv<v<^vv<^<>v^>v<^v<^<>^<^<<^^>vv><^<v^v^v^^>^><<v<v^vv>^v><^v^<>^vv^<v^^v>vvv^v><v^^<<^v<^>v<><><^<<^v><<^v>^^^^^>><<>^><><<v^><^>v>>>v<
>>v^>^^<v>^vvv>^^<<^^>>v^<<v<^v>^v<v^>^><^><<v<>v<vv<><>>^>^^>^>><^^>v<<<><>><<<v>>><^^><>^>v>v^v<<^<^^><^><^<>v><<v>^<v><v><^>vv<v>>vvv>v^vv><<v^^vv^v<>vv^><<<v<>^<^<<<^^v^<><^vv><v^^<v<<^v<>v^<>^^<^<<>v^^><^>^>vv>><v<^^>^<v^<<><<v<<<^^vv<<>><^<<v<v>><<>>>v^>^>^^<>^>v^<^<^vvvv>^<<>v<>><^<^^<<^><^^<vv<<^<<^v<v>v<<^^^<>^<^>v<>^v^>^<v<^<^v<vv>>><<^^v>><v^<^^>>v>>v^v<v<v^>v<v<<<><^>^^^^<<<vv>>vv><<<^v^<<v><^>^^vvvv>><>>v<>>^^^>><<vv^v<>>v<v^^v><^<^>>>v>>>>v^><vvvvv^<^<^<v><^<<><<v>v^>v>v<v><>^><^v^>v>><<<v^>vv>^^<<vv>v^>v<^vvv<<>><v^vv<v>^<v<v^^><v<^v^>vv^v^><>>>><>^vvv^^v>^<^^<<<><>^<<vvv^<v>v><^<v^^^v^>><vv^><vv><^v^<v>v^^v<>><<>^^>v^^v<<vv<>>v^^><<vv<^<^><^<v<v<<v<^v><^^v>>vv^>v>vv^v^<>><<><>vv^<<>^>v>>>>^>>vvv<<>^>^<v^<<v^v>>><<v>>v^^v<v>v>^<v^<<^^^v>^>^vv>v^^<><v^v><<<v^v^<v>>><>v^><v>v>vv<><^<^v>^<^vv><^<^^>vvvv>v<<^v>v<v<>vv^>v>v^v^vv^^<^><v^<<^>^>><<^v<^v^^>^><<>^v><^>v>>><^vv^^v^^v<^>v<^<<^<^<><^><v<v>^<<^^^v<^v^vv><><^<>><>^<>v^v<v<^<<^^<<>>^><<vv^<><<<vv><v^<^v^^<><^><vv<>>v>>v
>>v<<><v^>>>^<v<v<^v>^^>v^vv<^^v^<>^vv>vv><>vv>vv^^v<>^vv<v^<v^><>><v>^^v<<^<>v^^>v<>v<v>>v<^v^<>v><^<<<^<<<v>v<^><>vvv^>^^^<^v^^<v><<v<<>v>v^<><<^v<<<<>><>^v>^^v^^<<v^<><^v<^<<<><^>^^>>>^^><<<>^^v<v>>^^>>^<>v>vvvv><<v^>><^>^>^^<>>>>>^>v>^v^<>v<>>v>^v<^^<<vv<^>v<<v^<^>^<v^vvv^^<<vv><vv^><<^vvv<v>^v^vvv<<<^<>^<><<^<><<>^<^<>vv^><<v^<>>^^^><^^v^><v^>v<<>v>^v<^v^<^^<vv><>^vvv<v>>v<<^<<v<^^v>^>^v^v>><>>^>v^<<v<<>vv<v<<^^<<^>>>>>v<vvvv>^^<>vv>v^>^^vv<<v<^v^<>>><^^^v<^^^v^><v>v>>^vv<<>v>vvv>v<>>vv>^><v<>vvv<v<>^v<^^^^<<v>>v>><vvvv^>v<vv>>><<>v<>^>v<<^<><^><v>>^^^^<vv<>^^>><vv<>^^v<>^^>^v<v<<>>v^>v^<><vv>^<v^<^<v><<>><<v>vv<^^v<<<^^v<^v><<<<><^^vv>vv><>>vv^v<v<<><<v^>^v^^<v^^v<<<^v>v<^v><^^^v>v><>vv<>^>^^>^<^>vvv>v<>v^><>>>^^><>^<><^^v^^<<^v>v<><>^^<>>v^>^>>vvv<>^<^^^vv<^><^^v<<>>^<>^v>>^>^><>^<^^v>>v><^^><<^vv^v^^^v<<vvv^>vvvvv^v<<<vv^<<v^v^v^^<^vv^^v^>^<<^^v^^v>vvvv<^^<<<^^^<^v>>v>^^vvv^v<^^>v<><vvvvv^vv^>>>>v^><^vv^<vv>^vvv>><^<^<<^^<>><<><^^^<v^v>>vv><^><^<<v<^vv<><vv^>>v^><<v^v^v^^>>>>v<
^>>v>v><vv<v^v^>>>>v>^v><<v<><>>>v><><>vv<^v^^>>v^v>>vvvv<<v<^^>^vv^^>vv^<><vv>v<>v>^v>>v<>^><v^^>^<^^^^v^^^><>^>^v<>>>vvv^^<<>vv^><v<^v^^><^v^^><^v^^<<^^^^v^^<<v<>><v^>>v>>>v<v>^v^v<vv^v<>><<v^^<^v<>>>v>>>^><^v<<>v><>>><v<<^^^>>>^<<v^vvv<>^v^vv<><v<>><vv>^v>>><><^^>^<>vv>><<><vvv>>><>><<v<^<v^>vv^<v^^^v^v^vv^<>v^v^v<>>>^>^>^vv>>^v<<><<>vv<>vvv>^<^>v>^vv>>^<v<<<^>v>v^^<v^>vvvv<^vv>^^<>^^>^^>v<^>^>>^^^><^vv>v>^>^^<>^v<v<^vv^>><<^<>vv^<v<^v>vvv^v<v>^vv^<vv^<<<v>^<<^v<v^^<^v<^>vv^^^>vv><><v^^^>^<<>^<^>>v><^>v>>^^<^<vv^>^<^<<>^v>><><<^<<>v<><^<v<<><^>>>vvvvv^v<>v><<v^><^^>>v^^vvvv^^v<<>^^<v^<<>>v><<^>v>v<<<>vv<>vv><<<v<<vv>v^^<<v><<v<><^>vv^>^^><<^^v><v<<<<><><^v>^>^^>^><^^>>^<^<>^^^<<<>><>>v^v>v>><vv>>><^><v^^^v<>^<>>>^v^<<<>^^<<^v^^^>^<<^>v><^>vv>^<>><<<>vvv<<v><v><vvvv><^^>vvv^^vv<>^<^^>vv>>^<<<<>v^v<^<^><v<^vvvv<<<>><><<>v^><>>v<v<vv>^<<vv<vv<^<<<^>>^v><<vv<<^v^>>^v<>v>>>v^v>>v><<^>><<<>>v>^>vv>^<^<>v<^^>><>>><<>^<vv>>v>v^<^vv^><^^v<vv^<<<^<^^><<v><vv^^>v<^^^>v<v<>>vvv>^vvv<>>>>><^vv<^
vvvv<<vvv<^^<<^>v^<>><v<>>^>>v^vvv<<vv>^>><<>^<>><<^^vv^^v><v>>vv^>v<>><vvvvv>^><<^^^^<<>v><<<^v^v^<<^vv^^^^<<>v^>v<^>^><vv<>>^<>^<^<^vv^^^<^<><^><>v^<<<<v^<<vv<v^<v^><v><<<^^>v^<v<^v<>v>^<<>v>vv<^^v<<^v<<>^>^><^^<^^^<><><><v>>v<v<>v>v^v><<^v^v<^v>>><v>>^<><<<^v>>^v>>v>>^^<^>vv<^<<<>vvvv^<><<^^v<<<^v^^v^^<^><^>^><v^>v<v<vv^v<<>v^^<v>>vv^vv^^>^^>v^^<^>^^>^<v<>v<>v^>v<>^^v<>>^^^v>>><vv^v<>v<<><^v^><v<^^>v<<^<<vvv><<<<>vv<<^><^<<^^^^>>^>>v><^^v^^^>v^><v>vv^v>^>^>vv<>>vvv<v>>>v<^vv^^v^vv><v>v<<^v^>vv<v^>^v><>>^<^<^>^<>^vv<>^>v<<>^^^^^^<v^<^vv>><^>><<^<^^v<>><^<<^<v<v<v>vv^^>>>^><>>vv^vv^^>^vvv<>>><>vv^v^^vvv>v>><^>v^>^v^<<^^^^v^^^<><^^^^v>>>^<><vv<<v>v>>>^>^>>^^v<^^v^<^^^^><<^^><v>^>v>^^><v^^>^v<^>><><>^v>v>>^^<<>^^<^<<v>^>v>^v^<>^>^^><>v^><><>^>>>vv<^>v^>^^><v<<<>^<>>^><vvv<>vv^><<^<v<^v<^^<>><>^vv>><^<>>^^vvv<>>vv^^<<^><>^<>^^<v<<vv>>>>^^v^^v^<v>^><>^v<>v^v^<^<>>^>v^v><><<<^vvv><><>>^>vv^^^^^v<<vv^>^^>><^^><^v^vv^v<^<v<^v<>^>v>^>>^^>v>>v<^>v><>><v><>v<^^<><><<v>^>v<v><v^>v<^>v>v<<vvv><>v
<v<><^v<^v>^<<>>^^^>^<>^^><^v><>><<^vv^><^>>^<><<<>><<>^v^^<<v><><><>>vvv^>v>^>v<<<^v>v<<>^^<>v>><>>v^>^v<^^>^^v>vv^vvv<v<<^>><<<>^<v^<>^<vv<<v^^^><^<v^v^^v^v<>v<^v<v<^<v<v^vv>^v^^<<<>^v<v^^^v<>><v<v<<v^v<<>><^^<v^v<vv<<>vv>>v<^>^vvvv^^^>^<<>vv><v>^<>>>^<^>^>^vv^><><^>^><^>^v><>v^<v^<>vvv^>^v^<v^>vv^>>v<<<><v^v<v>vv>v><<v^<^<^v>v^<<<v^v>^<<^>v>^<v<^>>>^vvv>vv^<v^^^^<v<v><<^<<v>^><><v<v<^<<>>^v^v><vv<<><v>v>vv<<^^>>^<^>^<<<v<><>v^><<vv><^^<>v<<<v><<v^><^<v^><^v^^^<vv<^>^>>vvv>v<^>>vv<><^^<>vvv>v>v>>>>^<^vv>^>>^^^^vv<v^^vvv>>>>^>^<<<>^<<v><^^^^<vv<v>v>^^>vv><v><v>^vv<^<>>>^v>^<^<^>^<><v^vv<vvvv^>v^vvv<^<<^vv^^>><<^^v<^^<v<^<^^><<<vv>>^<v>>v>v><<^<vv^v<<^<v^>v><>^>^v<>^<^^v<vv^>>vv><>v>>^>^v<v^<<^v<v^>v><<v<>^>^<<v><>><v>>^>^>>^>>v<v>^<^vv<^^><>^>>^vv^>v<<^>>><<>>vv^v><>vvv<>^v^^^><vv^v^v^<<<>^^^>>^<><^^>v<^>v>v^^>>>>><^^v<^>>><v>v^><<><<vv<<<vv><^v>^><^<<<^<><<<>>^v>^><v^<<^^<^^><<<>^>^^^>>^<^^<<^^<^>><<^^v<v<^vv>^<v^<v<vv^>>^^>v<^vv><^<^^^<^^><<v>v<v^v^v^v>v^><^<<>v<<^v<^v>^^^v<vvv<vv>v
v^<^<vv>v<>v^<^>vvv>^^^v^^v<^<vv>><^>><><<<v^^>>^v>v<<>vv>vvvv^<v<^^><<^^^vv>>vv<^^^v>^^>^><>^^v<v<^v>v>vvv^v>>v>>><<v<^>^^>^^<<^<v<>><^<>^>v^>>^<><^<v^v<>>v^^<v<v<>^v^vv>v>^<v<^>><><<^<v^^^><vvvv>^>><v>^>>>^^vvv^^^^^v^^v>^>>>>>^><<^><>>^>v^<v<vv<>><^<><v>vv<<v^>vv^>>v<<<vvvvv>v^<>v><<^^v><<v^>^<^><v<vv^>v<><<^^^v<>^^><>v^<vv<<<>^^><v<vv<vv>^^<<^<^v^v>^^><v><v>>^v><><v^<^v<>>v^<>vv^vv>v>^^<^>^>>><<^><><v^^v>>v<^vv>v<<>vvv<>^>^>>><><<vvv^v^v^v><><>vvv<><<v>>v^^v>^<>^><^>>>v^>^<v^<vv<<<>>v>v<^v^vv^>v<v>^<<>^v><<v><^v>v>><>^>>>vv>>vvv>>^v>v^>><^<<<<^^<>>>^<<vvv>><<<^<^v^^<^^^v^v^><vvv>v<v^<><<<^<>^v<v<vvv<>>v<^^^v>><<>>^^>^<<>>^<><<^>><vvv<<>^^^><^><<<^<<v<<^<<vvvv>^v<>>^v<<v^v>>>^>>^>^^v^vv^<vv>v^>^><^<v^^^>>^vvv^<<v><v<<<vv^v^v><^>^>vv>v>><<^>^^vv>^>vv>v><>^<<vvv><^v^><<^>v>>v^v>><<vv>^v^v<v>^<vv<vv>^<<<^^v^>^><<>^vvvv^v^^<v^>v<^<><>vv<vv^v>v>^v>><vv<><v^<><^><>^<v>v<>>v>v^>^v^vv>v<>^^<vv>^^v^>vv><<^<^^<v<vvv^v^^<>><<>>>v<v>^><><v<>^v<><<^^vvv>^^<>><^v^>vvv^^<^>^>><<^>vvv<>v><^v><<v>v>>
^^<<<>^<vvvvv><><^^^>v<^vv^^><^vv<<^^<v>^><><>^^^v>^v><vv^<>^^^>vvv^><><>^^>^<v>>><<<>v^>v>^v^^^v^v<>>>>><<v<>>>^>>><^v<v^<v^v^<v<<v<<^^vv>^v^<<v<^v^<>v<^<>^v^<v<<<vv<<v<<^>v^^>>v^<>v^^^v^^<<v^>^v><>>^^><<^>><v>^<^vv^^v^>><^^v<>^v^^<<^^><vv<v>v<v><>>v<<>vv<^^^v<>>^v^v><>^>><^^vv>^vvv^v<vv>v^<v<>>v^>^v<<>v^<>vv<v>v^^^v>^v^vv<v^<^^<^^><vv<^^>>>^^^vvvv<^<^<>^<^^v><>^^v><>^<v^>v<>v^v<>>v<><^^^^>^<<>><^^>vv^<<^><v>v><>>^<<^<<^>vv><v^<<<>^<^<vvv<>^<<v^v^>v<>v<v<v>^><^>vvv>><v^<v>^v>v<^<>v^vv>vv<v<^<^<<<><>vv>v^>>>vvv<v><vv<v><^<vv><^^^<vv<><v<><v^><vv<v<>>><v^<<v>v^v^^v^^^>>^><^v^^><v^v^^><><vv<^>>v^^<v<^>^^<vv>v>><<v^>>v><<<>vv<<>>><><v^vvv<<^>^vv>^^<><v>^>v^^>v^^v<v^>vv^<<^vv<>v<v<>^<><v>v<v>><v^<v<<<vv^<^>>v>v<^^>^v>^vv<>v<v<>>><<v^<<>^^<^^>>v>>>v<<<>>>v>>>^>>v<v^>v>^v^^<v>><v>v<<<^>v^>^>v<v><>>>^>>^vvv>v^vv><^^v^^^^<>^>^>>^>vv<<^^>^<v<^>v>>^<>v>^v^^^v<v><v<^><<v><<^<<^^>vv>^<>^^^<v^<v<><^<<>^^><>>><<>vvvv>v<v>vvv>^<><<<<v>v^<><^v^<^<vv>>>v>^<^<^v<^<^>v<^<v>><<vv>^^^^^v^>^^><>><><>v><<^v<
>>><v><>^^<^vv><<v^vvv<^v>v^<>^v^^v<<>v^v><<<^^<<^<^>><<v<>v>^><>^^v^^v^>v>v^^^><^v>>v>vv<>>^^<<^><^^v><vv>^vv>v^>v^v<v>><^vv<^>><<v<<^<>vvv>><<v><>>^<^>^^^^v><><><><v<<>^>vv^v>vv<v^<<>v<>^<^>^<<^^vv^<v<v<<>^vv><^^<^v>^vv^v><^^><<vv<v^^>vv><<^<<>v^>><v>v>^vvv><^>><>^>>vv^v>vv^<>v<<v<>^<<<><<v<><v^<^v<<vvv^^>><><^vvvv<>><><v^v<><>>>><<>v<vv^>vv>>^^>^<^>^<^><v<>vv<^v>v^<^v>>v<v>^^>>>vv><v>v^<vv<><vv>^>><>>v>vv<<<^<<<>v^<>><v<^>vv>^<<>^>^^>>^v>^><>^<^^v<vv<>v<<^^<><^<<<v>^^^^^v>^^^vv^v<<v^^^>>><<<>>v>>v<v>v>>v^<^^vv^<v^<v^<^vv<^>^>>vv^<<vv>v<><^v^>^><>><v^<<^<<<<>^>>^vv^<<><v<^><^>^>v>><v<v>^v^<vv>><vv><>v<v><^^v<^><<^^><^^><v><<>>v>><v>>><<^v^^^vv>^>v><^<^>>><<<>v<^>v<^<<<>^^><^v^<v^vv^>^>^^<^>><<v>vv>^>><v^<^vv^vvv^><v>vv>^<^vv<v>>v<^>>>>^^^>vv^^<^vv<vvv>v^>^>>^><>><v<>v<>vv>^^v><v><v^<v^<<><^<^v<<>><<<^vv><^^vv^>v<^v>^<><^>^><><^<>vv>vv^<vv<^>^<vv><>>>v<<v^v>v^^>vvv>vvvv^<<>>v><<>v><><v><<>^^<<>><>^^>v<<v<<>>><^^vv<vv^<vvv>v<^<<v<<^^^^v^vvvv>v^<<^vvv^vv^v^>>>v^v^v<v><<vv><^<vv^vvv^v^^v
v>v^<v>>^v^vv^<<v^<^vv^vvv<>>^<><v^<<^<v^<<v<^><>^<<^><>^^^^><>>vv<^v><^^<^<v<>vv>v^^>vv^>^<v>>^>>v>^<<^^<<^>>^>v>v<<>^^^v^^>^^>vvv^><<v<v<<^>><>^><>>^^<>>><^^>><^<vv>>v<v^<<v<^<>^<^>>v^^<v^>^<v^vvv>>><^>^<^^v<<^^v><v<>vv>^^^>><>v<<>v><>^>vv>>>v<^><>v>v>^v<^><^><v<vv><v^<^>v>^^vv^^>>v<><>>>>^v^^v>^><>vv<<vv^vvvv><vv>^><v<v><v^>^^v>>v^<<^^v^>^^v^v>><<>v<^^^^><<<>^<>>v>vv^^^>^v^v^>><>>v>^v>vvv>^>v<<^^>v><<^^>v>^<^<vv>v>^><><><>>><vv<<<<>^>><v><v^v>>>v^^^^<v<^><v<^^><v>v>vvv^^<vv<v^v^v>v^><v^^^v>v>><<v^>>^v<^^<<<v>><<v^^v^<^<>^>v<><>vvv>v<>>vv<^vv>vv^^<v>>>^<^<<>vv<<vv<><>^^v<v>vv<v<>v^<<v><v^><<>^^^<^^<<<<v^^<vv>>v^vvvvv<vvv><>v^<v<vv<<^>><^^v^<<<v^>v>vv>>v<v>^>^^v^v^v^vv^<>^>>vv>^>v^^^>v^<<><vv^><<^vvv>^v><v<<^>>>^v^>>>vv^<v^>vv><^^>v>>^>><v><^<>^><^>><^v<^<<<^^>v>v>v<v^v<^v>v<^^<<v<v<^^<<v>^v>vv>>>vv^<>^vv^<<^v^>^>><<v^^<><<^<vv<^<v><v^>><><><v>>v>>>v>^^^^<v>vv><v<vv^>vv^>><v<vv<^vv^>v<^><v>>>>v<^<^^^vv>v>>>^^^<>><v^>v^v^<<>><>>^^>>^<<><^>^<^^<><<^v>^>>^>>^>>^^^>><<v<v<>v^<>>vv>vv^<>^^
^<><vvv><<<><>^vv<^^>^>^^^^<v^^>^<>>v^<>v^<<^<v>>>^><^><>^^<^<^^v^>v<^v<><<vv^>^<^><<^<<><<>v^v^v><>>>v><>^><>><v<<v<v<v^^<<v>vv>v^v<>>^<><v^><^<<<<^^>^^<<^v>><^v^^^<v^^><>^^>^>^^><<^>^^^^<v<<^^><^<^v^>^v^v<>^>v^vv>^v<^<><><<<<v<v^^>>>^^^v<^v^<>v^^>^<v>v<^^^v>vv^<>vv<v^>v<^<<^>^<>^^<>^^<><v>v<>vv^>vv<<<>><v><<<v^><<^>>>v>v>vv^^>>v^><v<v^vvv>><vv>>><<^><vvvvv<<>>vv^><>^<<^^<v>^v<<^v^^<<v<v<>^<^<v<^<>v<v<<>>^^>><v>v^vv^<^>>>^>v><>v<^>>v<^>v>v>>^^<^>^v^>v^v<v^v<>>vv^^<^vv<><<v<^<^^>^><<>^<v^><^v^<>>^>v>^^>>>^^><>v<vv^v>vv<v><^vv^v>v^<<><<<v^<^<>><^^<^>^^><<<^v<^^vv^^>>v<v>^v>^^<<<v>^^<v<^^v><^>><^^<<^v^^>^^^^<^v>v<><<<vv>v<v<vv>^^^<<^><v^v^^<^^<<>v>v>v<>v^v>vv^<>v^<>v>v>^<><v^>><vv<>vv><vv^><<^^<^^vvv>>>><vv<>>^>v<v<<<>>^v<>^>>><vv^<^vv<v^^v>>v^v<^>v>v^<v<^v^>>>><<^<v^^<^v<>><<>^<^<<^>><>>>^v<<>v^^>v^<vvv^v<<v<v^v>^vv^>^<v><^^v><<<^^vv<v><vv><^>>^><<^vv<>>vv^<>v^><>vv>^<vv<v^<^><>>v>^><<>v<^^<^v>v>>^^^<^>><>^<^v^><<^v<^^v^v<v>v>>>v><^>v<v<v^<^^vvv^^v>><vvv<^v><>v^^<<<>^^>>^v^^<^v>>>^vvv^>
<<^>^<<>^^><>^v>vv<>vv<v>^v^^>>^v^>v^<<^v^>v^<v>>vv>v^<^<><^^v<>>>^<<<^<v>v^vvv<<v><v<<><<^>vv^v><>>>v><^v>v<vv<><<>^^^v<^v>>v^v>^^vvv>>vv><^v>^<^v<>>><^<<><v>v^><<<v^<>v>^v>^<<^vv<v^<^<v^^<>^<^v<^^^^^vv^v<>>v^v<><v^^v<v<^<<><^vv><^^^v<v^<<><>>>^<<^>^v^<>v^vv^^<<v<>><v><<<><v<<^><<^>><^><^v<v<vv<^<>vv^^>>v>v>^<>>v^>v<>v<<<>vv<<>>>v><><><<v<>>^^^<>^<^^vv><v^^^>v<>^^^v>v^^<^v^v<v><^>^v^^>>^^v>>^>>v^vv^v^<v<v^v^<>><>^>>v^<^^><<<^<<<vv><v><>>^>>^v>^v>v>^<>>>^v<<^^<^v^^><^>>v^><<v<>>>v<<<><vv<^^>>>v><<^^^<^><>v>^<^>>v<^^<^<<v<>>v><>vv^v><<<vv^>^><^>>vvv^>>>vv>v<>^<>v>^>>v<>>v<<<<v>v<v^v<>v^>>^>><^^^vv<v^>^>^>><<><v^^<><<vv^<<^^vv^v^v>^<><<<><<^><<>><v^^<v>><^<<><v^<><v>vvv^v><<v^v>^^v><^>^>vv<>^<v><v<>^><><^>>^>>v^<>v^^^<>^>^><<^^<>>v<<^^>v^><<v>^<<^><<^>^<<<><<>>^<<<><>^><<<^>v<^<<^vvv^>vv^v><v><v>vv^>^>vv<vvvv^v<>v><<vv<<<>^vv^^v<^>v>^^>v^^^^^v<<<<^^^>^^^>^^<^>^^<<^<<<><v>^>v><<v^v^<<vv>v<<^vv^v^<>^<^^><<^<>>^^vvv^<<^<<><<v<vv^<^v<><>v^>>>v^v<>>^>>>vvv<v><<v^v^v>^v><^v>^v^><<^^v>v>^<<^>^v

Part 1 Solution:

const fs = require('fs');
const input = fs.readFileSync('./example-input.txt', 'utf8').trim().split('\n');
// Parse the initial warehouse state and moves
const warehouse = [];
let moves = '';
let robotPosition = null;
const boxPositions = new Set();
for (const line of input) {
if (line.startsWith('#')) {
warehouse.push(line.split(''));
} else {
moves += line.trim();
}
}
for (let y = 0; y < warehouse.length; y++) {
for (let x = 0; x < warehouse[y].length; x++) {
if (warehouse[y][x] === '@') {
robotPosition = { x, y };
} else if (warehouse[y][x] === 'O') {
boxPositions.add(`${x},${y}`);
}
}
}
const height = warehouse.length;
const width = warehouse[0].length;
const printRoom = () => {
const room = warehouse.map(row => row.slice());
for (const box of boxPositions) {
const [x, y] = box.split(',').map(Number);
room[y][x] = 'O';
}
room[robotPosition.y][robotPosition.x] = '@';
console.log(room.map(row => row.join('')).join('\n'));
console.log('\n');
};
const pushBoxes = (x, y, dx, dy) => {
const nextX = x + dx;
const nextY = y + dy;
const boxKey = `${nextX},${nextY}`;
if (warehouse[nextY][nextX] === '#' || boxPositions.has(boxKey)) {
if (boxPositions.has(boxKey)) {
const canPushFurther = pushBoxes(nextX, nextY, dx, dy);
if (!canPushFurther) return false;
} else {
return false;
}
}
boxPositions.delete(`${x},${y}`);
boxPositions.add(`${nextX},${nextY}`);
return true;
};
const moveRobot = (dx, dy) => {
const nextX = robotPosition.x + dx;
const nextY = robotPosition.y + dy;
if (warehouse[nextY][nextX] === '#') {
return;
}
const boxKey = `${nextX},${nextY}`;
if (boxPositions.has(boxKey)) {
const canPush = pushBoxes(nextX, nextY, dx, dy);
if (!canPush) return;
}
warehouse[robotPosition.y][robotPosition.x] = '.'
robotPosition.x = nextX;
robotPosition.y = nextY;
};
for (const move of moves) {
switch (move) {
case '^':
moveRobot(0, -1);
break;
case 'v':
moveRobot(0, 1);
break;
case '<':
moveRobot(-1, 0);
break;
case '>':
moveRobot(1, 0);
break;
}
}
let gpsSum = 0;
for (const box of boxPositions) {
const [x, y] = box.split(',').map(Number);
gpsSum += 100 * y + x;
}
printRoom();
console.log(`Sum of all boxes' GPS coordinates: ${gpsSum}`);

Part 2 Solution:

const fs = require('fs');
const input = fs.readFileSync('./example-input.txt', 'utf8').trim().split('\n');
const warehouse = [];
let moves = '';
for (const line of input) {
if (line.startsWith('#')) {
warehouse.push(line.split(''));
} else {
moves += line.trim();
}
}
const scaledWarehouse = [];
for (const row of warehouse) {
const scaledRow = [];
for (const tile of row) {
switch (tile) {
case '#':
scaledRow.push('#', '#');
break;
case 'O':
scaledRow.push('[', ']');
break;
case '.':
scaledRow.push('.', '.');
break;
case '@':
scaledRow.push('@', '.');
break;
}
}
scaledWarehouse.push(scaledRow);
}
let robotPosition = null;
for (let y = 0; y < scaledWarehouse.length; y++) {
for (let x = 0; x < scaledWarehouse[y].length; x++) {
const tile = scaledWarehouse[y][x];
if (tile === '@') {
robotPosition = { x, y };
}
}
}
const height = scaledWarehouse.length;
const width = scaledWarehouse[0].length;
const printWarehouse = () => {
const room = scaledWarehouse.map(row => row.join('')).join('\n');
console.log(room);
console.log('\n');
};
const canMoveBoxVertical = (boxRow, boxCol, deltaRow) => {
if (scaledWarehouse[boxRow][boxCol] === ']') {
boxCol -= 1;
}
const futureRow = boxRow + deltaRow;
const futureSpotLeft = scaledWarehouse[futureRow][boxCol];
const futureSpotRight = scaledWarehouse[futureRow][boxCol + 1];
if (futureSpotLeft === '#' || futureSpotRight === '#') {
return false;
}
if (scaledWarehouse[futureRow] &&
(scaledWarehouse[futureRow][boxCol] === '[' || scaledWarehouse[futureRow][boxCol] === ']') &&
!canMoveBoxVertical(futureRow, boxCol, deltaRow)) {
console.log('false1')
return false;
}
if (scaledWarehouse[futureRow] &&
(scaledWarehouse[futureRow][boxCol + 1] === '[' || scaledWarehouse[futureRow][boxCol + 1] === ']') &&
!canMoveBoxVertical(futureRow, boxCol + 1, deltaRow)) {
console.log('false2')
return false;
}
console.log('true')
return true;
};
const moveBoxVertical = (boxRow, boxCol, deltaRow) => {
if (scaledWarehouse[boxRow][boxCol] === ']') {
boxCol -= 1;
}
const futureRow = boxRow + deltaRow;
if (scaledWarehouse[futureRow] &&
(scaledWarehouse[futureRow][boxCol] === '[' || scaledWarehouse[futureRow][boxCol] === ']')) {
moveBoxVertical(futureRow, boxCol, deltaRow);
}
if (scaledWarehouse[futureRow] &&
(scaledWarehouse[futureRow][boxCol + 1] === '[' || scaledWarehouse[futureRow][boxCol + 1] === ']')) {
moveBoxVertical(futureRow, boxCol + 1, deltaRow);
}
scaledWarehouse[boxRow][boxCol] = '.';
scaledWarehouse[boxRow][boxCol + 1] = '.';
scaledWarehouse[futureRow][boxCol] = '[';
scaledWarehouse[futureRow][boxCol + 1] = ']';
};
const moveBoxHorizontal = (botRow, botCol, deltaCol) => {
let futureCol = botCol;
while (true) {
futureCol += deltaCol;
const futureSpot = scaledWarehouse[botRow][futureCol];
if (futureSpot === '#') {
return false;
}
if (futureSpot === '.') {
break;
}
}
while (true) {
const previousCol = futureCol - deltaCol;
scaledWarehouse[botRow][futureCol] = scaledWarehouse[botRow][previousCol];
futureCol = previousCol;
if (futureCol === botCol) {
break;
}
}
scaledWarehouse[botRow][botCol] = '.';
return true;
};
const moveRobot = (dx, dy) => {
const nextX = robotPosition.x + dx;
const nextY = robotPosition.y + dy;
if (scaledWarehouse[nextY][nextX] === '#') {
return;
}
if (scaledWarehouse[nextY][nextX] === '[' || scaledWarehouse[nextY][nextX] === ']') {
if (dy !== 0) {
if (!canMoveBoxVertical(nextY, nextX, dy)) return;
moveBoxVertical(nextY, nextX, dy);
} else {
const canPush = moveBoxHorizontal(nextY, nextX, dx);
if (!canPush) return;
}
}
scaledWarehouse[robotPosition.y][robotPosition.x] = '.';
scaledWarehouse[nextY][nextX] = '@';
robotPosition.x = nextX;
robotPosition.y = nextY;
};
for (const move of moves) {
switch (move) {
case '^':
moveRobot(0, -1);
break;
case 'v':
moveRobot(0, 1);
break;
case '<':
moveRobot(-1, 0);
break;
case '>':
moveRobot(1, 0);
break;
}
}
let gpsSum = 0;
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
if (scaledWarehouse[y][x] === '[') {
gpsSum += 100 * y + Math.floor(x);
}
}
}
console.log(gpsSum);