[ADD] main: Added day 15 solution
This commit is contained in:
parent
f3ac175033
commit
0d540c19f6
3 changed files with 474 additions and 0 deletions
71
15/input.txt
Normal file
71
15/input.txt
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
##################################################
|
||||
#O.OO..O.#O...OO..#OO.OOO..O..O.O...##.OOO.......#
|
||||
##.......O..O..#OO...O.....OO......OO.OO.O.OOOO.##
|
||||
#OOO.O...#...#..O.O#O..#.O.O...O...O.O..O..#.OO..#
|
||||
#........#O...#O#.O.......O.OO......OOO...O..#.O.#
|
||||
#..#..O.O.O...##.O.O.O..#O..OO....OO......O#.....#
|
||||
#.#.OOO.OO...O..O#O.#.O#..O..O..OO.O.....O.......#
|
||||
##.......O..#O#.OO...#.....O.#......OO.OOOO#..O..#
|
||||
#O.O..OO..O.O..O.OO#O..O....OOO....##.#O...OO..OO#
|
||||
#OO..#..OO.O....O...#.O...OOO.O.#..O..#.O..#O....#
|
||||
#...O.#.O#.OOO.....#O...#...OO..O.O#.OOOO.O#O...##
|
||||
#...OO...O...O..#OO.....#OO.#.O.#...#.O..O..OO...#
|
||||
#O#O....#..O...#.OOO...O.O#..OO..O...OO#..O#.OOOO#
|
||||
#O....O.....O..O.O.O..O#....O..OO..O##O...O#..#.O#
|
||||
#...#.#..#..O...#O..O..#....OO..OO....O........#O#
|
||||
#O##O......OO...#...O....#...OO..O...O.O.O..O....#
|
||||
#.........O...O...O...OO.O......O......O#..O....O#
|
||||
#..OO.#....O.......O.#.O..O#...OO..O.OO.O......#.#
|
||||
#.O.....#O....O......O.....O.OOOOO.##.....OO..O..#
|
||||
#.O..O..............O.....O...O#.....O.O..OO#O.O.#
|
||||
#....O.OOO...O.#O.......#.##OO...#OOO........O.#O#
|
||||
#...#.O.O.....#..O.OOO..OO...O.......O..#O#.O..O.#
|
||||
#.O.O...O.O.#...O.O.O....#.....O#..OO.O..O.....OO#
|
||||
##..O...O...O.#......#OO.OO..O...O.O........O..#.#
|
||||
#O...OO.#...OO...OO..OO#@....#O.#.O...OO.....OO..#
|
||||
#...#OO.#O...OO........O..OO.....OO......O......O#
|
||||
#......O.....OO.O..OOOOO#O#.O..........#....#.##.#
|
||||
#.O#OO.#O.#....O....OOO..#O#O#.O.....OO#..OO.O...#
|
||||
#OO...O.O#.O.#..........O.....O#....O...O.......O#
|
||||
#..#O....O##OO.O#.......O...O.#O...O..O.OOO...##.#
|
||||
#.........#.O.O.....O....O.O..O.....O..OO#.O#..O.#
|
||||
#...O.O.#...O.O..O..O..O..O..O.#O......O.#..O.#O.#
|
||||
##......O..O...##....O.OOO..O........O.OO.OOOOO..#
|
||||
#....O.O....#.....O.#....#..##.O#O..O....O..O#.#.#
|
||||
#......OO.O..#.....O.#....OO...OO.O#..O#...O#O.O.#
|
||||
#O..O.O...O..OOO.O#..OO...#...O....O..O...OO#.O..#
|
||||
#..#O.OO..O......OOOO.....O.O..##.........OO...#.#
|
||||
#O....#.OO.OO.O....#........O..O..#O..OO#.OO....O#
|
||||
#.O.....OOOOO.O....O.#.O.#...O.#..O.O..O...O...OO#
|
||||
#..O..O......O......#..O#.O#..O..#O.O......O#O...#
|
||||
#....O.OO.OO#...O...#.........O#...O..O........#.#
|
||||
##OOO..O.O.O#.O.......OOO.O.#O.OO.O.O...#O.....#O#
|
||||
#...O....#....#......O.......OOO...#.....O..##O..#
|
||||
#O.O...##........O...OO.....O..#..........OO.....#
|
||||
#..........O...O.O..O..........O..OOOOO..OO.OO...#
|
||||
#.O.........OO......O....O.OOO.OO..##...........##
|
||||
#.O.....O..OO.O..##OOOO.O.#...O..#......#O#.O....#
|
||||
#OO.O.O.O.O.#.O....O.......OOO.......O.O.O##OO#O.#
|
||||
#OO#..O.....O.O....O...#.O..O.O#.O#.OO.O.OOOOO..##
|
||||
##################################################
|
||||
|
||||
>><<>v>>^>><vv>>>^^^vv^><>v><^>v<>>><^vv<v><v^><v>^><v<vv<v^^v<vv>vv<<^<<^<vv>><^<v<<^<v^v<<<v^<v^^><^^vv<v^><^>>><>^>v>v><v^v^<<<<<^>^>v^^>^v<>vv<>v>^vvv^><v^v<^^><^><^v>v>v<><><><v<v<>><v>^>^>v^>^v<^><^<><>>vv><^vvvv<><^vvv>^>vvv^<<<>^^<><<^<v<v<vv^>v<v><><<v<<<^>^vv>vv<>>><v>^>v<<>v><^><>>>v<<>v<<v^^v><^vv^>^^>^>v<<^^<>>v^<^vv<^<v<<<>vv><<^vv<<vv^<>v^^>>>^v^v><>v^>>v^>^<v>^vvvvvv<v^<>>^>v^>^v<v^^<v>v<>^vv^<><v<><<><^^<v^>vvv>vvv^^^v<>v^>^<>vv^vv>^>>><>v^^v>^>v<v^v<^v^>>^><<<^^>v<<><<^<vvvv^><vv><v>vv<<<<<<^v>^vv>vvv^^^v<^^>^^^<v>v^^><>v><v>vv><>v^v<<v<<vv<^<>>v><vv<><><>>vv^<<><<><<<>v<>^>^>>^<<^<^^^<>>^>^>^<>^<^v><>^^<^v>v^^^>^^vv<^<^>^<><^<<<<<vv<^^v^^v<<v>^v<^^v^>v>^>>v><<<<v<<^><^>^>v>>>^v<<v><^<>^v^>^>^^<^>v<>v<^<<>^>^<><^^vvv><^<^<^v>^>>vv^>><<<^>v<<^<^^v<>v^>v^vv>v^v<v>^<<>vv<^<>v>^<>^v<<v><v><vv><>^v<^vv^^^<^<^vvv<v^>vvvv^v>^<v^><v<^v>v<>><<><v<v>>>><^<^^v<<v<vv>v>^>^v<^>^>^<v^^v^<^v^v<v^v<^^>v>^<v>^<^>><v<>vv><^^>^v^>^vv^^^<<>^vv>^<>><<<<^v<^<v^<^^<>vv^^^<^>>^<^^>v^><^<<^<>
|
||||
v>^^v>vv<vv>><<^<^<<vv^vv>v>^>vv>>^>v^^>vv><><^<<^<<v>^<^v>v>>>^>v^v<<^^v^^v>v<v><v^<<<>v<>^>^>^<>^<v<>v>>>v^<^^>v>v>v><<>><v>^v<>^><^^^v^^>^vvvv^<^<^v^>v^<vvv^>^v^<^^v^^^^v^>^vv<>><<v^>v^^<v>^<^>>^>v^^^v^<><^^v>^>v^<v^><v<v<>^>v^vv>>>^<<v^v><^<v><^<^><<v><vv>v^>><><<^^^vv>>v^>^v^^v<<^v^^<>v<>vvv>v<^>>>^^v>^v^<^>>>vvv>^v^<v<v<^<<><^>v<^>>v^v<<<^^v^<^<vv^vv^>>^>><>>^v<^v<>vvv>>^>v<<><><^><^^^>vv^><^>v<><^<<vv<><<vvv^^^^><v^^>>^v^<^><vv>^v^v^<<><<>v>>^v<<^^<>v>>^<v^>^<<<<^v><^<v<^^^vv^v<>>vv>^<<<^<vv<><v<>v>>>vvv<<>v<>^v>v><<<<vvvv^v<^v<<v<vv>v>^v<<<<^v^<^<vv<^v<vv<v^v^<v<><<v>^>^vv><><v^^<^<v<>v><^vvv<<<v><^v<v^v>^vv^v>>v<<^v>^v<^><v<v>v^>vvv^>>>v^>^<v<<v>vv<v<v<><>^v>>>^<><^<<<>^<>v^><<^vvv^v<^^<vvv>><<v^<^<^^<v^^>>^>>v>v<v^>vv^v^^v^v<><v<^<><><v<^^^>^<v>v>v>^><^>vv^<>v<^^v>><^^^<v<v<<^vv^^><vv><><v>^<>^^>>v<<^<<^>^><v<^<vv><^<><<>^^<^v<>^>^<<^v<^<<>^vvv>v^><^^v>^v<>^<>>vv<<v<v<><^<<<^^^v><>v<^^>vvv<><>v>v>v>v><><<>>^vv^^^v>^^<>^^^>v^<>vv>^<v>v>>^v<^<vv^^<>^>>^>vv<<^<>v<<v<v><<^<^>vv<^
|
||||
^^v<^>v>^<>^^>^^>>^<<^>^^v^^><>v^><^^^^^v>>v>^^^>>vv^>v^v>^<v<>^>v>>><<<^^v^>><vv^<^<vv^>^<<v^<v^^vv<><vv^>^^>>^vv<<v<v^^^vvvvv^<^^><^<>v<^v>^^v^^^<>v<<v^>>v^>v^<>^<>^>>v>^^><><vv^<^^<>>^<^^<^<><^><v><>^<>^<<v<^<>^>^<>>^<<><<<<>^^^v<<>v^<<<<>>^v<^><<>v<^<<>v^<v<><^^^vv^<<<<v>^<^v^>v^>>^^<<^><vvv>^vvvvv><>><><^>v^v<^v><<<<<<v>><>>v>v>>vv<>v<^vv^v^>v><^^^v<v^>^<^^>><v>>^v^^<v<^>>^^>><v^v>>^<><^>>v>^<>^^v^v>vv>>v^v<v^<vvv^<<^<^<v<^^<v>><^<v<<>^<^<^<^v<^<v<>>v<<v^>>><<v>>><vvv<vv<^>^v^v>v^v<^<<v<<>^vv<<><^^>^^>>^^^v<v><><v<<^^^^<^<v^<>>>^>v>>^^>v<>><^^v<<>>><><vv<^v^>^^^^>vv<v>^>^<v>><><<^>^^vvv<><^>v<vv<<>v^<<v<><v<vv^^<v<^<<>^^>>>^<^v^<v^>vv^^^vv^<<^<<<v<v^<^vv^<<v<<>v^><vvv^>v<<^<<<^><<>>vv>vv^^^v^v^v<<>>v<^><><>v^><<^><>^>>vv>>vv<v<^^vv^>^>^vv>^<<<^<v<^<<>^<^v^>>^<v>><^>v^v<^^vvv^v<vv<<v<<>>v>v^><<v<>>^<^^vv^><^>>vvv>^^<>>v<v<>^>^<v^^v>>vvv^v>>v^^^<>v^<<v^>><v<<v<>>>v>><<>>v^<v>^v^vv>^v>><v<><^>>^>>><^>>v<^v^<>^v<^v^vvv^^><vv<^<^v<^>><>vv<>v<>^<vv^<vv>>>^vv>v<<>v^>v^vvv>^<v^><<<^^^v<v^
|
||||
^>>^v>v<vv<<<><><<><<>^^>^^^v>^<v^v<v>v>v<^^^^v<<>>><<vv<^^<^>>vv<^v>v^>vv^<^<v<^<v>^v<>>vv^^<v><>^<v<^<>^^<<>v>>^<>^>^v<v^^>>v^>>>^>^v<vv>v^><vv^<>><>>v^vv^>v><^^^^^<><^>^<>^<><>><<<>^vv><^v<^v<^^<v^^<^v><<>v^<v<>>>^v<<><^<vv><^v^v<v<>><<^^^<><>v^v<vv>v<v<^<^^<>^vv<v<>>>^<v>>^<v>>vv<<>^v<vv<><^^^<<vv><^<v^>v>v^>v>>^vv^<<>v<><>^v<v<v>><v>^<vv^v^v^vv<vv<v>v<<<v^>^vv^^vv<^>^vvv^><^^<v>^><vv^^<<^<^v^>vv^^<v>>>vv<<v<>^^vv>>>vv<><<v>v>v^<<vvv><^<<vvv<^<v>^>v^<vv^>^>v<^^v^^<>>v<v<<<>>><>^^<^^^vvv^<><^<<v>>>v^^^>^><<<vv><<<><><>>vv<<>>>><>vvvv><<v<^v^<^v>^^><^v>^>vv<v^^>>v>>>^v^<^<<v<^<^<^^v<^v^>v^^><vv><^^v<><v>v^^vv<>^v<>vv<v<>v<v^v<<^v>^<^vv>v<vv>><^v<vv>vv<<><<vv^v>>^>><><>^>^>>^^<v>>>^^>>>>><>><>^>v>><^<^>v<^^^>>^<v<v^^v>vv<^v^>^v^<<<>>^<>v^v>>vv>><>v<<vv^^>^^<><^vvv<^><<v^><<^^^<^>^<<>^v^>^<^^^><v>v>>v>^<>^>^^^<>^v^^^^><>>><v<>>vv^vv><^>v<^v<vv^^^>><>>^><><v<<<<vv^^<v<^>><^v>^^v<<vvv^v>v^^^^vv^^v^<<^^>>v^><<v<<v<v<v<^<<<^^^v<<>vv<^<>^>>>v>vv<^<>v<vv<>><>^^<<>>>^<<<^<>^<>v<>^^<v>^<v<v^vv
|
||||
^^^vv<<>>>>>>v^^<v^^^<vv^^<^<<v<^>^<>v>>v>v^^<v<<>^><v^^<<>^>v^v>>v<^v^>^v>^v<<v>vv<<^v>>^>v><<<<^>vv^<^vv^<<<>>>^<vv<<<<>^><>v>>^>>v<<>>^>>>v<^>^^v<><>^^^v^>v>v><v<v><^v^>v^v>^>v<<<>>^^<>^^><<^^>v>v<<<>^>^><v^v<vvv>^v>v>>^^>>v^^<>^<>><vvvv><v>^><>v^>^>v<v<^<<^>v<<^>><v<><v><v^vv>v<><><<v<>^^vv^^v><<^<v>v><>^v^<>^v^vv>v>vvvv>v<^<^<>^>v<>v>>>>v^^^<>v^vv><v>>^><>^^^v<^<>vv^^<v^<><v<^<^v^>><^^>v><^<vvvv>>v>^^v^>vv<><><v^>>><vv^<>>>^<vv^vv<^>^>vv<v>^><>v^><<<<<>v>>vv^<vv<<v<v>>>>^<<vv<>^><^v^><v><^v<<v^vvvvv<^>^><^>>v<^^v<vv>v<^vv>v><^^^^v<<^>>>^<<^^<<<^^<^^^<>^v^v^^vvvv>vv^>v<^^<vv>v<>>v^v^<^>><>><^^<^<>>^v>>^^>><>^v^<^><^^^<>^v>><^>v<v<<vv>>^v>^v^vv<vvv<^^<<<>>^v<<><><>><<<^v><<v><<><>><><>^vvv><v>^><>^^<<^>vv>^^^>^^v<>vv<v^><><^>vvv<^>>^v<v<>^<v^>v><<v<<<v>vv^^<v^>vvv^<>>>^>^v^<^v^><>v>>>^<<<^<v^>^><>^<<v>^vv>^^v>^^v<<^v>^^^>^<^<<v<<>>^<v>v>><<>^v>v<>>>>>v^v<^>v^^<<vv<^<<^^><^>^><>v><<^vv>v><v>vvv<>vv<>^<>v^v^vv>v<v^v>>>v^<><<^>v<>^v>vv>v<>^<<v<^>v>vvv^v<vv^>v<>>>><v<^^^^>^><<vv<v>^><v<
|
||||
<v>>vv>>>>v<v>v<<vv<<>v^>>v>^<vv<vv<v<><v<<^v^>>>>^v<v>^<^^>^^>^<^<^<<>>v<v<v<^<v^^^>v><vvv>v^>>><><>v<^^^v^<<v<<>^<v<^<<v^><v><>><^><>^<^^v^<v<v>vv>><>v>><v>vv^>^vv<<vv>vv<^>>^<>>v<^>^v^>^<^^^<<>^^v<<^v<<<><<<vv><>vv><^v<vv^v>^^><^<v^>>v<<<<>^<v<<>v^<^<v^<^><><>v^<^v>>v><^<v^^>><^^><>v<<<<vvvv^>v<v^v<v><v^vv^<vvvvvvvv^v^^^v><^^<^><v<<<>>v>^>>^^^<v^<><>vv>^^>>vv^^^>>><v^<v<^^^v<<<<>v<vv^v>>^<<>^<^>><>vvv^v^v^>><^v<^><><>v^>v<<^v^<v>>>v<<<^^<^<<<>>>>><vv><^^^<<<<^^<^v^><^^<vv^>vv<<>v>>><vv>^^vv^>^^>>>vvvv<<<<>v<>v<>v^>v>^v<<v<^<^><>>^<^^v^^vv<><v<<vv<^vvv^>>>>>^<<>^>^<><<>v^>>v><^><^<v^<^>^v>v^v<v^vv>v<^^<v^v<<>v<>v>>^>^<<>^^>v^<v^><<^v^v<<><v<><^v<><v><>v<>v><^v>v><^<^>^>v<<^>v>^>>v<v<v<<v^<<v^^<^<>><^vv<^<v<<><vvv>v<<<^<<>v<^<>><>>v>vv^>v>><v>>><vv^<vv<^<<v^^v^v<>v>^<vv^>vv>^<^^^^vv^^<<>>v>>>vvvv^vv>^><vvv>^<v<>>^<<<^^<<^<^>^>>>>^^vv>^^^><<<^vv^><v^<^<^>><>^^^v^<<<vvvvvvv^<^>>v<^v^v>v^vv>v^^^>vvvv^^>^^^<<<^<^vvvvv<^<^^v^v>>v>>^<^<<^v>^>v^^^<^vv><^><^^<>v<^<v<v^^^vvv>v><^^^<v^<>^<<^^<v
|
||||
>v<><v^>^^>>^v^^>>vvv^^^<<v>^v^vv<><^vv>^v<v>^^v^><v>^^><>>><<v>^>><^^vv^<^^>^vv>>^<v>^<>v>vv<v^<<>>><v<^<^>v>^><vv><vv^^vv>>^>>^^^v^<vv>vv^^^vv>v<vv<^>v>><<v<>>vv^^>v^^>vv^^^vv>>^^v>>^<^<^vv>v^<<v^<<>>^>v<v<^v^<<^^<^<<v^vv<<vvv<<>>>v<<<<^v^>^<<v<<<vv<<>vv>v>^v^>^>>v><>>^v><^^>><<^^<^>>vv^><>^^>>>v^vv>v>v^>>>^<<^^<^<<v<^v<vv^<>v^^v>><^^^>v<<>v^^vv<<v>><<^v^^v>vv>v>>^<^^^>vvv<<v>^v^>vvv>^>>vvvvv^^>>v^><>^v<<v>^><^>><v<<<><^^>v>>v>^<^>>v>^<<<^^v>^<v^^v<vvv>v^v<^>v><v<><<^>>>^<^>^vv<<v^<^><>v^v^>^^>>>v>^>^^^v<^<><^><><^>^vv^^^^v^v<v>v><v^>v<<<<<vv^vv^><<^<>^>>^^^^^^v<>^>v^^>^^<>>><^v^^vv>>><<^v>vvvvv>^><<^>v<><<>^v><v><v^v>>v<^vvv<^v^<>^>^^v<<vvv^vv^>><^^v><^^<><^<v>^>v>^<<^>v^<<v><v<>^v<v<vv<<<v>^v<<vv><>^<v^<<>>>^<v<^<^<vv^^<>>>>v^<>^v<<^v>^>v<vv^<vv<vv^vvv<>^v>>v<^<>^<<^v^<<v<<<^v^vvv<<^><>^>>v><>vv>^v^^>v^<vv>v^v<v<^v>v<v<^<<>v<v^v><^>^^^>^v<<^^<<v<>>>vv>^>vvv^^v<<^<<v^v<v^v><>v>^<v>^^^>>v>vvv>>>>v<<<^^<v<><^^v>v^v<v<<<<<v^^>><vvv^^>>>><v>>>^>v^>v>>vv><>v>v<v<vv<vv<^>><>v<>v^v<><v<>v>
|
||||
v^>>>^<^><v<vvvv^^v>>v>>^^^>>^^^^>v^>>vv<v>^^v>^v<>>^v>^v<><vv>v<v^v><<>><><^<^v^>>>><^<vv<><<v>v<v><^>^^^v<<^^<v<v^>v>v>v<^^^>v^^^v><v>v<<v<^v^>^vv><v<<>>>><<<>v^><v>^v<<^<^<>v^vv^>><>v<<<>v<<>vv<><v>^<<<><<v<v>^^v^>v^>^><>><vv<v>v^^v<>>v^<^vv>^^v^>v>v<<<v^><<>>v<<v^^v<^^<<^><><v<^^<<v^<><<>^>v><<<^vvv^>vv^>v><v^v>^<>v>v<^<<vv<^^^<<<><v^<>vv^><<<^<^^^>>>^<>><vv^>^^<v<^vv<^vv<<>v^><<<<^v^<<^^><<<>vv^v<v^<^^><<<>>><>^v^<>^>vv^>^>><>>^>>v^^v<^><^<<v^^^><v<>^^><<v^<<>^<v>><v>v<<<<>>^><^<<<vv^v^>^>^<v^vv>>v><v^<^<vv^<<<<><>><<<>v^>^<v^^>v>v^<>>v><^<v>><v<^v^^v^<>vvv<<<^><<>v>v^^^^^<v>v^>^>v<<v>>>^<v>v^>v^<<v>^<>>><^<^v^v>^v>v>vvvvvv^vvvvv<>>v^v<<<v>>^v>v>^v<<><<>^<><^^^<^><>v^^^<v<>>^v<v<<^v>>vv>>><<^^>vvv^^^<>^^v><<vv<vv^<v^<v>v^vv>^<<>^>^<<v^>>><>>^^^v^vv^>^<v>^v<vv^^^vv^^>>v^v<^^v<^v><<v<><>^<v^<>vv^><<><<^>><<>>><<<^<<v^v<<>><><<<<<>>v<^<>^<^<vv<><<^>v^^^<<^><^>^v^<^<^v^<>>vv<^>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>v^^v^vvvv>>^^<<<v^>v^^^<>>><<^<^v^^<>v><v^vv<v><>>^<^>><v>>^^v>>>^>^><><^>><<vv^vv<><>>>>^^><<^^v>>^<>^vv<^>>vv>vv<<<>^>^>^^^v>v^v<^vv>^v^v^^>>^^v>><^<^<^>^><>><<^><^>v^<<v>^><^>>v>v^<^^^^^vv<v^<v>vv^>v<^^^<v>v>^v<><^v><v<>v^^<v^^<><vv<<^>>v>vv^v^v>v<^v<>^v^><<>>v>^vv^vvv>^^<>v><<v<^v>><<>>^v<<>vv^<>>><v<>v<><^vv><^>v^>v^<><vvv>^>v^<<v<<^v<^^>v><v>>>^^<^<^><><<^v<^>><vv>>^<^v><>><^>^<^<^><v<>>^<^<>v^>><^^><<^^^><v>^<v<<^v^v<<>^>>v^>^vv^><<^v<>>^v^v>>v>^>><>><v^<<>><^vvv<>>^<^v^v>v<><>^>^v<^^^^>>>>^<>>>v^^<>v<vv<^>^^<v><v<>^>^v^<v<v<<v<<<vv^<<><>^<>v^^^>^<v<v^>v<^>^v<<v>v>vvv<^<v>>^<^<<>>>>^<><vv<<v<<^vv^vvv>><v^^^><^<v<v^<^vv^v><v<vv>v><v^<<>v>>^>^^^v^><v>><^^^vv>vvv<<>vv>v^v^<v<v^<^>^vvvv<<^^^<^<vv<<^<^><^<><>vv^<^>>v>^vvvv><^<^>><<^v<^<v<^><>><^><<<^<<v<^^^<<^<><>v^^v^^<<^<>^^v<^>^^<v<<^v<>v>v<<v<v<vv<^<v><^^^>v^<>^<<><^^v<><v><>v<<<v^<><^^<v<<^v<^vvv>v^>v^^^<<>^<v><^<>^v^>^<v<^^^^v<^><>^v<><v^v<<v^^^>v<<^^v^^^^<^><^<vvv>^<vvv<^>^>><<v<>>^<vv<<v><v<^v<vv<>>><<^v>><>>><<^>vv
|
||||
^vv<^<>v><v>><^<<v^^v^^>v<v<><v<><>v>^v^vv<^<vvv^>^v^><<^^v>vvv><>>^<v^v^<>v<v>>^<>^<<>v<>vv>>>>^^v<v^>^vv><v>vv<v^<^>v^<vvv><v<>vv^<>^vvv^^v^>>^<v><<^^^v^<>^^v^<>^>v^v>v^vvv^<^^^<>vv>vv<^^^^^>>v>>v><>^>^^><^v<^<<<<v>^<>^<v^><<<>>v^>v>^<>v<>vv<>^<v>v<v^^^vv^>>^^<>v^<<^>^^<v>v>v<^^<<<v^<<<^><>^>^<<>v^v>^v^v<>vvv>><v><^<<vv<>><v<^<v<^^<vv^v^<^>>>><<>>vv>v><<v<>v^^^v^>><^>v<v^^>^^><><^v<v^^v^><^>^>^v^^>>v>v<^<>>^<^v^^<<vv^<vv>>vv>vvvvv<vv><<^>^^<>^<<^<<v>^vvv^>v<<v>v>vvv^v^>v^>v^>v>>v>^vv>>>>><><^<v^<^^>vv<<v<v>>>>^><>>>>^v<v<<^>>^<v>^^<^<<^>>>><<>^^>v>^>^<vv^>>v^^v<^<>>^<>v>>>vv>^^<v^<<<^v><v^v^v<<vv<^v<><><^>^<<>vv<>><^^<><<^>v><>v^<<><>>>><<>>^^^vv<^v>><v^><^>v<>>v<^<vv^<^<<^^<<<>^v<<<^^^vv<>vv><v<><vv<v^>>><^v<v^^^^^>>^^<^<v^^<<<>^<v<v<^<>^v<>v<><<v^v^v>^v<v^<<v>^v><v><vv>>>>v>>^v^<^<vv>v^<vv^<>>v<>v><>^>v<<<v^v>><<v<^<><^vv<<^v>^>v<^vv<>>^>^vv><<^vvv>^<<^<v<<v<<<vv>^v>>><<<^>^><^v>v<v<<^vv^>^^^><>vv><<v^>>vv^^<>v^<^vv<>>v><>^^>vv<><v^^^>^^<>v<^<^><<^<<^<<><v^<^<^>>v<vv^^^v^><v^>^>v^^
|
||||
^^<<vvvvv>>v<^<^<^vv^^vv>v>>>^v<^v^<<v>vv<>>^^^<^<>^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<^^<^<>>^vv^^<v^>v<<v>^v^>v>v<^>>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<>><>^vv<v<<>^<>>><<><>>v<v^^^v<><^^v>v^>^^>v^>^^vv^^^^>v<>v<v^<<<^v^^^^^v<>^>^^>><vv<^<<^^>v><><vv<v^>^v>>^vv^>^><^<>v>^><>^v<<^>>v^v<^^v^v<>>v<<<>><><>^^><>>v<<<<^<^^v^>>^^>><<^><>>vv>v^>><>>^^>v^<><<<^^>vv>^>>>v^<^vv<^v^><><>>v<v^>>^<vv<vvv^^^^^v>v^^<^^<>><^^v>>^>^>v^><v>v>>>>^vv^^<v<^<^^v<>>^>v<^><>^^<v<^<v^^v>v^>vvv<><>^<>^v<^<^^<<^<<>>^>><>v>><vvvv<^<><<^><v^<<<>vvvvvv^^v^<>^^><<^>vv>vv>><vvv>v<v^<v>v^^^^><^>v<v<<<^v><v^v<<v^^^>>^<v<v<v^vv>^^<^^>^vv>^>^^^v<v^^^<v^<<<^<v><v>^v<^^^v><<<<>v^<^>^v^>>>>^v^>^^<^^<^>>vvv>^v<>>^>><^vv<>^>^>vvv^v^^>>v>v^><<<><v^<>><>>>>^v>^<v>>>v^><^<<<<<v>>^^v<v><>^v><v>>^><>^<v<v><><>^>^v>^<vv>>>v>^>^vv^vv^<v^v<<<>
|
||||
>^<<vv^>^^^>vv<>>><<v>^>vv^>^><<>>v^<<>>v^>^vv>>v<vv^^>^<<v^v<^><<<>^^><>><>^><><^v^<^>^<^>>><<<<^v<v<><v>^<v^v<>v^>^>^v<v>v^<^>vv<^v<v>^>><v<vv^>><<^^>>>v^v>v<<><^vv<^v<v<^v>v^>v<vv>v<^v^^^>v>v>>v^^<v^vv><<vvv>v^v<>v^v^^>>v<v^v<>vv<><v<>^<<^v><<<<v^<^>v^<<v^><^vv>>v<^>^vvv<^<>v^><^v^v<v<^<^v>vv^v^<<v<^>^<<><>^^>^><><^v>v^v>v^vv<^v>vv<><v<<^v<<^<<<<vv>v>>>v>>v>>v^^><<>^^^<^^<v>>>v<^^^<v>><<v^^v^<v^>>^<v>^^v<>vv^><>^^<>^>^v^<^<v^^<>vv><>^^<vv<<><<>>^vv<^<^<v^vvv>^v^vv^><^>^v>><>vvv>v^v><^v^<v^<^^<<<v^v<^^^v>^v^vv<<<^<<v>^>><v^^^>><<v>^vv^>>>^>>><>^^<<^^v^v>v<>v^v<>vv>><^^^>^^v<>^>^><v>^v>v^^v^^v>v><v<<<v<<<^><<><>^^><v>v>v><v^^<><v><^<>^^vvvv<^>v^^<>vvv><<<^^>>v>>><<<vv^>>>><^<>v>v<vv<>><vv><^^>><v>^v<<>v>><^<<^v<v^^>^<>>^v><><<^^^vv><<<^v<vvv<v<>>^^v<v<>v^<v>v<<v^<vv^^<v^^<>v>v>^^^^v>v>><^v^v^>v>^v<v<>^vv>^<v^<><<^>>vv>^v><v^^^v^<^v><<><^^v<v<v><^^v>>><>v>vv<>^^v^v^>vv>v^<>v^>^vv<<<<^v<<vvv<^>>v^<<><^^<vv<^<^<>^>v^^v^<<v><^<<v>vv^^<<v<v^>^vv^<<^v<<>^v<<v<^<v<^^<v<v<v<v>^v^v>>vv<<v>><v^
|
||||
v^^v<>^v^>>>^<>^>v><^<<<^v<v><>^<><vv>>^><vvv<v<><>>v<v^^^>><>^v<<<>>vv>>v<vvv^v>^>v<>^^>>>>>v>vv<><<^^v>^v>>^<>vv>v>v>>vv>v>v><v^v^<v<<<>>>^>>^^<<><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<<>>>v<^v^vv^>><^><^>>^<<v^<<<^<>v<<<<^vv^<>>>>vv>^<<vv>>>vv<<v>vv<>v^^vv><^>>v>^v<<>v<><^^vvv<<>>^<^><vvv^<<v<<^<<>vvv>^<<v<^vvv>v^>>^<^><v><>><>>v^<^v^^v<^^>>v^v>v^vvv<v>>v>^>v^v<>>>><>v^^<>^vv^^^^<^>^^^><>^><v<>^<^<vvvv<>>^<<<>^v>^<vv>vv>v>^<v>^>v<<v<<^<>vvv^>>^>^<v<>^v^>^><>>^<<>v^>^^v><vv>v<vv>^^v>v<v>>^>^^^>vvv<v^vv<^><v^v<v>vv<<>>^v<<<v<<>^^<v>><vvv>v>^>>vv^<v>v^^<<vv^v^^>^vvv>^<<><v^^^^v^>>vvvv^<^><<v>^v^<^vv>>v><>>^<v^<vvv^>>>^v^><>^vv<^><>>^v^<<<^>v>^<><>v^v^<v>v^^v^^<>v>^<<<>v^v^v^>>v^>v^<>vvvv^^<vv^v>vv><^^>^v<^>>v>v<^^<^>v>^v><>>^^v^v>^^>^>^v^>^<>v^vvv><^v><>^vv>v><<vv<^>^^^>vv<^<><<^<>^v<<^<>^<v>^^><>vv<v<><v>^<v^>>^^>v^v>^^<^>>>vv>>^<>^^v<>>><^^<v<^v>v<^v^>><>vv>><>>>^<>>^>><v<v<<vv<^^^<<><v<><<>v>
|
||||
v><>^>vv^^<^<>^v^v>^^^>>vv><^>>vvv^<v<^>><<^v>^^^^^^vv>>><<>>>^^^^^v<>v^v^><^vv^><^vvv^<v^<v^<^vv^^^>>v^><^^^<^<<<<>vv>>v>v<<>^<v><<^<^vv^^<^><^<>>>>v><<<v<<^>>^>v<<><<vv^><vv^<v^^>>><>v>vv>^v^>v^^<v>><>v<<^^^>>>>><>^^>^v><v^<<v<vv<>>v>^<v<v^v<>^<vv<<<^^><><v<^>^>^v>v^<>vvv<>^<>>^<^vvvv><<^^v<<>^v>>><<>^><^<>>>^>v^<<v^^<<<>>>>^v>^>^^^v>v^v<><v>>>^v^vv><<><<^<^v<>^v^>v>><<>^vv<vv<<^<^<><>^^vvvv>v<>vvv>>^^v<^^>^^><<<><vv^<v^<^vv><<^^^<<^>v><>>v>vv>vvv>^><vv<>>^^<>>vv^>>^>^<^<<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<<^^>^>^^^>vv>v<vvv><<^<v<>^>>^>^vv<>>^>^<>>^^>>^<<^<v>v><<<^v<^v^v<^^<<vv>^>vv<^v<v><<<^v<<<>v>vv>^><^v>^v<^>^<<>v<><>vv^v><<^v<v^^^<v>>v^^>v^v^^>^v>>v>v^<^<<<<><^vvv^<v<v<>vvv>>^v^<^^^>^<vv<v<^^^v>v^<v<<<<v<v>^<v>^vv>^^v<v<<<<<>><<<^v>v<>v^^>>v>><>vv<<>>^<^vv^>>>v>v<>>>><^>>^v><^><<>^^<^<><>>v><<vvv>^><v<v^<>>>>>v<<^<><^^v<<<v^>vv^>>>v<v<<>>v>>v^v^v><<^<^v^<^^^^^^v<>v<>v>>><^>^><>^>^>><^<>^<^<>^^^v><>^<>^^v<^>
|
||||
>v<^^>>^^^<^v>^v^v^vvvv>^^^>^>^^v^<<v<^>v<vv>v>>><>^^>^<<^>>>v<>>^<<^<>^v^>^^v^>>v<<>>>v^^^^vv^vv^^<<v^v<<>vv<<v<v^v<^<><^<<^^><v<>^^^<v^v^>><vvv^^v^^<^^^>vv<<>^><><v^v<v^>>vv>><vv>^v^v>v>^^v>v^<^^>^<^>vvv><>>>>><^v<>vv^<v><><<>><<><vv^><^>vvv<<<^v^>^^vv>>^<>v<^^>>vvv>^^<^^v^^^><<>v><><^^^^vv><vvv<<>^^^<^<^v<>vv>^>vvvvv^>^^v>^>v>^<<^v><>^<^<vv^>><<<<v<^^v>^^v<>v>^<>v>v<^^<>><<<<v<v>v^<<vv^v<<>^<v<<<><<><^^<^^v^^vvv^vv^v^>>^^v^<>^v<v>>^v^>vv^>vv^vvv>v>^<<<^>^<<<>vv^v^<v>vv^vv>>^v<>vv<>><vv^v^<v>^<<v><<v>^>>^^v^v>v<^^>^^>><vv>^^<^<v^><>>v^>v^><v^<>^<^v>v<^><^>v^><>vvv^<^>>><^^><>><>><><^^^v><^vvv<^^<>v^<v<>><>>^v<>^^>vv>vv<<vv>><v<>vv^^v>v>^v<<vvv^^><vv^vvv^<v<><>vvv<v^>^v<^^v^^<v<<<<>^<>v<<<^<>><<^^<<v^v<^v>>^<^<>^^><^>v>><<><>v^>v>^>>^v>>^><^v>>^>^^v^^<><<v>>v^><>v>v<v<v<<>vvv^>>><v>><vvv<<<>>>^<vvv>>^v<^<>^v>><^<>>><v>^<<<vv>^v<v^^v>^^^><^v^v^^<vv<v>^^^^^<v>^>^v^<<<^<<<<>v^><v^^>vv>>vv<^^>>v^<<^<>v^<^>^v<^<>^>^<v^<^>v<v^vv<><v^^<^v>^>vv^^>^v^v<>v>v<>^v>>><<v<v><v>^^vv^vv^<>v<^^^>^<v>^
|
||||
^^<<>v^<^>v>v<^^<<^<<<<>v><^<^^v><^vv^^<^v><<<vv<^<>^^v>>^^<<^^vvv^<>^<<v><^vvv<<^v>^^^<^<^<<v<^<<^v>^>vv<^><<>^>>v>>v^v^><>^>>v^v<<v^>^>vv><^>v>^<^>^^><v<><>v>v<^>vv^^v^<v><^><^v<>>vv<^v>><<v^>>vv><><v^>v<v>^<^<>><^>^^<<^<<<vv^>^>v<^><vv>v^v<v^^<<<vv>v^>>^^<v>^<v>v<^>v<^^v^<<<^v><>v^>^v<>^v^v<vv>v<<>>>^<<>^^>vv><^<^>>>^v^v>v><^>v<<vv>><<vvv<^^><<vv^v^<^v^v<<>><<^v<>>vvv^v^<vvv<>^>^>>>^>^v^<<vv<^^<^^>v^>v<v^^<v>^<>^<^^<v<<^v<<v>><v^>v^v^<^vv<v>>v^v<>v^v><>^<><>v^>v^<<<^v^>vv<^>><^>>>>v><<^<<<v<v^v<<v<vv^v<><^^^v>v^>>^^^^<vv<<<^<^<<^v<v<<<^^><v<<vv^^v^<>v>v<vv>v<>>>><<>^>><>vv>vv<<v<^v^vv^^^v<v<v^<^<^^^<^v<<v>^^>>vvv^^<<^>><<^v^>>^^v^vv>><^^<v>>>^v^v>>^<^><<^>><v<^<<^^v^^^<<><>^<>><>>>^<<<^^<^^vv>v^>>>>v<>>v>>>vv><>vvv>vv<><<<<^v>><<><^<>>v<v>>^^<>^^<v<v>>><>^<<<^^<^^><>^v<v<>v^^<<><v<<vv^v^<>v><<>^v^^<<>v><^<^<v><<^>v>>>v<v>^^v^^<^v<^>v<<^^vv>^>>><><>><vv><<v<<<^<>><v^<<^<^v>>>>vvv^vvv><v>vv>v<^>v<v^<vv>^<^<<><^<>^>>v^v<>>vvv<v^^<>^^v<vvvv<^v^v^v>^^<v>v>v<>^^<^<^<><>><^v>v><>vv<v>^^>^>
|
||||
<<v>vv<<<v<^<^^<v<<>vv^^^<^v>>v^v<<^>v<v>^>v<^^>^^^><^<v<^^^^<vv^<<<v<>^^^<v<<<<<<<>>>><v>^^v^>^>vv<^^<>^<^><>>^<v><^<>^^>v<v^><^v<vv<v><v><>vvv>v<^>>v^^vvvv<^<>>><>^^^<v><v^<vv^>vv>vvvv>^v^><^v^^^vv>^vv><^<v^>^^>v>>^>v>>>^v>>^><v>v<><><<v^v>^<^^>>^^>^^<vv>^<^<v^^v<<<vvvv<vv^><<v>^v<v<v>^^<v<^^>>><><^^v>v>^>>v>v<^v>^<v^^v><<^v^<>v<^v^><^>><^>vv^v<vv>v>vv<^^^^>>vv<v>>v<^^>v^><<^v^v^<<<>v^<v^^><<>><^<^<<>^>vv>v>^>>vvv^^^>vv^^><><^<>v>>>^v<><v<v^>^>><<v<^v^^^<>><v^>v^<><v>v^^<<>^^^<^<^v>v^>v^^^^>^>v>^vv<^v^>v^^^v^^<v^^<v^<^v><v^^>>v>>>^^^^vv>^><^^>^^^><><vvvvv<^>^>^><^^vv^>v>vv^^^^^v^^<^v>>^><<<<><^v^^^v<>v<>v<v^>>^^v^^<^<<^><><<><>>v^<>>>><>v><v><<<<^^^>>^^>>><v>v><v<v^v<>^><<><vvvv<^<<><<<<>v^vv>><<>v^^<>^v^<v^^v<v^<v>^>^<>v<><v<>v>>>v<<^<>^<>>^>><><vv>>v<<^<^<<<><><<<v>>^>^>v^^<^^<v^^>vv>^^>^vv^^v>^>><>^>v<v><<>vv^^^v<v^<<v>v<<^<>^v^v^<^>>^<>v^>>>v^><^^><^vv>><><><^>>>v<>v^^v^^<v>><>^<^v>><^<<vv>^>^v^^^^<<v>>>^><v^^>>>><^^<>v<vv>v^><>^v^vv<>^<^vv>^vv<<^>v<v<>vv^>v<^v<<vv><><<vv<^^<>v^v
|
||||
>vv>v<vv<v^><<^<^^v>v^<v^<>>^><<>^v>>v^vvv>v^>^vv<<v^^>vv^vv><>^^<>>^><<vv><<^v>^<>v<^vv<v<>><^^<<v>>^v>vv<>>v^vv^v^>>vv^^^^<v^<^<vv<<v<><v^^>>>v^<^^<^>^^^^<^vv^>>^vv^vvv<vv^v<>>^<v^v<^><v^<^^<v^<<><^>^vv^>>>vv<vvv^>^<^v>>>^>>v^>v><^v>^>v>vvvv><>^><^^><^^>v<^v^><^^^>>^>^v^^>>^^v^^vv>^<^>^>vv>^>><<v<<<>^^^^v>^^^^v^<^v><<^vv^<<^vv>^><^>v>^<<^<<>v^vv>>>^v<>><^v<<>>>>><vvv^<^><vv>^v<>>>>^v<<^>><^^^v<^^>v<>v^<^<^v^>>^^^><>^<v>^^<^>>v><>^><<<v^v><>^vvvvv^v<vvvv>vv^><><<<^^v>>>vv<^^><<^^><<>^>^^v^v>^>><><<v>><>>><>^<v<>v^v<>>v<><><>v<>><>v>v><v>^><<v<>>^><>><<<>>^><^vv>v^v^>v<v^<v<^v<><v>^vv>^<v><>><<<^v<<>vv<^v^><<<^>v<^<<^<>>>^<>^v>><>v<<v^>>^<<<^vv^>vv<vv^^>v<v>^^<^vv<^^><><<><<vvvv>vvvvv<vv<^^>>><><^v<vv<>^<^v^<><<^^^<<<<^>^vvv^vv^^<><^v<^<vvv>>>>vv<<>^>>^v>><^v<>v<^^v<v<v<^^v<^<<<<^<>><vv>>v>^<v>^<><v^<v^v<v^>^<>>>v>^v>>>^^><^v>v<><v^>^<^<v>><>v^^<^v^^<<v^<^v^<v<v>^^<^<>>^<>^^<v><<><^v^>vvv<<v<vv<<<<><^v>v^^>v>v<^<<<>vv><v^<><<^^><v<<<^<^^<^^<>vv>v>><<v<<v>vv^><v>>>^>^><^^^v^^^v^^^v^^>v>
|
||||
><vv>>^<>^v^><>>^^v><<^^<<>v^<^^^<v<^^vv^v<v><^>>^^^^>v<>^<v^^v><><>^^<<<>^<<>^>v^>v>>^><v<^<^^>v<v<<^<>>>>^^<v>>v>>v^>>>>^<^^<^<^^^<v>^v<<v^^v^^^>v<v^v<><<vv>^>^^<^<^^^<v>>v^^v><><v><v<vv>v^>>><<^>>>>>>>>v<^><>^^v^>^<^<v^v<^v<<v><<^^vv>v^<v>v>v^v<>v>^^<<v>vv^>>^^<>vv<><^<^><vv>>>>^v<^^><<v<v^^<v^<v^v<<<^^v<^>>vvv>^^^^v>vv^vv>>vvv^v^<><<^<<v<<>^v^<v>v^>><^<<^<>>>^vv^<^^^<v>^<v^vvv^>^^v<vv^vv>v^^v>^v<^>^^vvv<<<^>^v^v^^>^>^<><<^>^v>>v>vv^<v^<>^<^<<v>><^^^<>^^<vv><<v<<><><><^<>^v>^^v>^><^^vvv^<v>vvv^vv^v<>>><<<v^<>v<>^<^v^^><<^^^<vv^^>^<<><>^v<>><<<<v^>>^<v^<<<v^vv<^^^<v<<<>>>>v^<v^<>v>>vvv^<<>>^>^<v>vv^vv^<<^>><^<^^>^<<>v>vvvv<^v<^v<v^<<><^^v<^>>v>^v>^^<v^v>><v><v><v>>v<<>^>v>v>v<>^v>v<^><^<>vvvv<v^^<<vvv>><^vv>^<^vv^v><v^><v^>vv<>^>>><>v<>v^>v>v>v<>><<v><vv^<v^^v><>v<>vv>>v^>><^<<^v<^v<^>>^vvv<^<vv>>v<vv>vvv><v^>^>v><^<^^^>^>v^<vv<<<<>v^^^^>v>^>vvvv><^^v^^<<^<vvv^<<<>v><>>vv^><<v><^<><><<v>>^>^>^<^><>><>>>>><vv<v>^^v<v<^<<vv^<v<><>>^<v^v>>^<vv>^^>^v><<<v^>>v<v>>>^v<vvv<>><>^>vv<^<><v>^^
|
||||
^>^<v^<v>><>^>>^v><<<<>>>><^<<>v>^>v^>>^>^<>>v>>^>v^vv^^>>^>vv^<^<v<vv^^<>vv<v>><^^v>^v<vv<v>^>^^<<<^>^<vv^<vv<^>^<>vv>^v<<^v>>v><v<^>>^<<>^>^v>v>><vv^>v>>>v<><<v^^vvv>>^^v<>^^^vv^^<<vv><^<>>v<>>v<<<<^<>>v<v<vv>^<v>^^v<><<^^>vv<<<^<^<^><>^v^><^v<^v><<<<<^^<<>^^v>^>>v>^v>v^<^<><>v^^vv>^v<^<>vv>>v^^>^<<<v<>vv^^><v<v<v><^^><><v^vv<<<v<v>>>^>>v^<^v>^<v^>^^v<<><vv>^<^^^>>>^<<>vvv^><>v>>^><<><>vv>v<><>>>>>>^^vv^>^v^v>v>v^^vvv<<v<vv^<^>><^>^<>v>^<>v>v<<<v^^<^>vv^<^>^^>>^vv><^v^<^<^v^<<<^<vv<<^>><><^^v<^^^<^v^^<^^^vv<>^>vv>><>v<^^v^<^^<^><^v<>v<^^v^^>v>>^>^<>v>>^v^<^<>v^<><<<>>vv^v<<>v<vv>v>v<^>><v<^><<v^^<<>^v<^><<>v>^>v<v<<v^^^>^<v>v^v>v><>>>>v^<^>>>^^^^v>v^^><>v<<v<>v<^<<^>v>v>vv^^>^>>>^>vv^^<^>v^^v<>^<^>v<vv><v>v^v>>^^><<>vv^<>^v^<>vv^>><^>>v^^>>v<>><><^^<^>^><<vv>>v<vv^>v><v>>>v^>>vv^><^v^^^>^^v<>^<>>^>v<>v>^><>><^<<>><^>>^^><>^><<>vv<v^>v><>^^>v<^<<^^>^v>>^<^<vv>^^>^<^^<<<^<v^v<<<<>v<<v<vv>>v^>><>^^v><<v<>^v>>^<<v^vvv>>v>v><^<^<<<<vv><<v^^vvv>^v<<^<vv^<^^<<<vvv<v^><<>v>>>^^^<>><>^v<^<<^v
|
||||
382
15/main.go
Normal file
382
15/main.go
Normal file
|
|
@ -0,0 +1,382 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
)
|
||||
|
||||
const FILE_PATH = "./input.txt"
|
||||
|
||||
//const FILE_PATH = "./sample.txt"
|
||||
|
||||
func LoadInput(filename string) ([]string, error) {
|
||||
file, err := os.Open(filename)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
var lines []string
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
lines = append(lines, scanner.Text())
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return lines, nil
|
||||
}
|
||||
|
||||
type Vector2 struct {
|
||||
x int
|
||||
y int
|
||||
}
|
||||
|
||||
const (
|
||||
EMPTY = iota
|
||||
ROBOT = iota
|
||||
BOX = iota
|
||||
WALL = iota
|
||||
LEFT_BOX = iota
|
||||
RIGHT_BOX = iota
|
||||
)
|
||||
|
||||
const (
|
||||
UP = '^'
|
||||
DOWN = 'v'
|
||||
LEFT = '<'
|
||||
RIGHT = '>'
|
||||
)
|
||||
|
||||
var MOVEMENT = map[byte]Vector2{
|
||||
UP: Vector2{0, -1},
|
||||
DOWN: Vector2{0, 1},
|
||||
LEFT: Vector2{-1, 0},
|
||||
RIGHT: Vector2{1, 0},
|
||||
}
|
||||
|
||||
type Lab struct {
|
||||
field [][]int
|
||||
command string
|
||||
}
|
||||
|
||||
func cloneLab(lab Lab) Lab {
|
||||
var field = make([][]int, len(lab.field))
|
||||
|
||||
for y := 0; y < len(lab.field); y++ {
|
||||
field[y] = make([]int, len(lab.field[y]))
|
||||
for x := 0; x < len(lab.field[y]); x++ {
|
||||
field[y][x] = lab.field[y][x]
|
||||
}
|
||||
}
|
||||
|
||||
return Lab{field, lab.command}
|
||||
}
|
||||
|
||||
func cloneWideLab(lab Lab) Lab {
|
||||
var field = make([][]int, len(lab.field))
|
||||
for y := 0; y < len(lab.field); y++ {
|
||||
field[y] = make([]int, len(lab.field[y])*2)
|
||||
for x := 0; x < len(lab.field[y]); x++ {
|
||||
if lab.field[y][x] == BOX {
|
||||
field[y][x*2] = LEFT_BOX
|
||||
field[y][x*2+1] = RIGHT_BOX
|
||||
} else if lab.field[y][x] == ROBOT {
|
||||
field[y][x*2] = ROBOT
|
||||
field[y][x*2+1] = EMPTY
|
||||
} else {
|
||||
field[y][x*2] = lab.field[y][x]
|
||||
field[y][x*2+1] = lab.field[y][x]
|
||||
}
|
||||
}
|
||||
}
|
||||
return Lab{field, lab.command}
|
||||
}
|
||||
|
||||
type structuredInput = Lab
|
||||
|
||||
func TransformInput(lines []string) structuredInput {
|
||||
var field = make([][]int, 0)
|
||||
var row []int
|
||||
var i = 0
|
||||
var endField = false
|
||||
var command string = ""
|
||||
|
||||
for !endField {
|
||||
if lines[i] == "" {
|
||||
endField = true
|
||||
break
|
||||
}
|
||||
row = make([]int, 0)
|
||||
|
||||
for j := 0; j < len(lines[i]); j++ {
|
||||
if lines[i][j] == '@' {
|
||||
row = append(row, ROBOT)
|
||||
} else if lines[i][j] == 'O' {
|
||||
row = append(row, BOX)
|
||||
} else if lines[i][j] == '#' {
|
||||
row = append(row, WALL)
|
||||
} else {
|
||||
row = append(row, EMPTY)
|
||||
}
|
||||
}
|
||||
field = append(field, row)
|
||||
i += 1
|
||||
}
|
||||
|
||||
for ; i < len(lines); i++ {
|
||||
command += lines[i]
|
||||
}
|
||||
|
||||
return Lab{field, command}
|
||||
}
|
||||
|
||||
func tryPush(lab *Lab, position Vector2, direction Vector2) {
|
||||
if lab.field[position.y+direction.y][position.x+direction.x] == WALL {
|
||||
return
|
||||
}
|
||||
|
||||
if lab.field[position.y+direction.y][position.x+direction.x] == EMPTY {
|
||||
lab.field[position.y+direction.y][position.x+direction.x] = lab.field[position.y][position.x]
|
||||
lab.field[position.y][position.x] = EMPTY
|
||||
return
|
||||
}
|
||||
|
||||
tryPush(lab, Vector2{position.x + direction.x, position.y + direction.y}, direction)
|
||||
|
||||
if lab.field[position.y+direction.y][position.x+direction.x] == EMPTY {
|
||||
lab.field[position.y+direction.y][position.x+direction.x] = lab.field[position.y][position.x]
|
||||
lab.field[position.y][position.x] = EMPTY
|
||||
}
|
||||
}
|
||||
|
||||
func getRobot(lab Lab) Vector2 {
|
||||
for y := 0; y < len(lab.field); y++ {
|
||||
for x := 0; x < len(lab.field[y]); x++ {
|
||||
if lab.field[y][x] == ROBOT {
|
||||
return Vector2{x, y}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Vector2{-1, -1}
|
||||
}
|
||||
|
||||
func printLab(lab Lab, command byte) {
|
||||
for y := 0; y < len(lab.field); y++ {
|
||||
for x := 0; x < len(lab.field[y]); x++ {
|
||||
if lab.field[y][x] == ROBOT {
|
||||
fmt.Printf("%c", command)
|
||||
}
|
||||
if lab.field[y][x] == EMPTY {
|
||||
fmt.Print(".")
|
||||
}
|
||||
if lab.field[y][x] == WALL {
|
||||
fmt.Print("#")
|
||||
}
|
||||
if lab.field[y][x] == LEFT_BOX {
|
||||
fmt.Print("[")
|
||||
}
|
||||
if lab.field[y][x] == RIGHT_BOX {
|
||||
fmt.Print("]")
|
||||
}
|
||||
if lab.field[y][x] == BOX {
|
||||
fmt.Print("O")
|
||||
}
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
|
||||
func calculateLabScore(lab Lab) int {
|
||||
var result = 0
|
||||
for y := 0; y < len(lab.field); y++ {
|
||||
for x := 0; x < len(lab.field[y]); x++ {
|
||||
if lab.field[y][x] == BOX {
|
||||
result += x + y*100
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func calculateWideLabScore(lab Lab) int {
|
||||
var result = 0
|
||||
for y := 0; y < len(lab.field); y++ {
|
||||
for x := 0; x < len(lab.field[y]); x++ {
|
||||
if lab.field[y][x] == LEFT_BOX {
|
||||
result += x + y*100
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func Part1(input structuredInput) int {
|
||||
var lab = cloneLab(input)
|
||||
|
||||
for i := 0; i < len(lab.command); i++ {
|
||||
tryPush(&lab, getRobot(lab), MOVEMENT[lab.command[i]])
|
||||
}
|
||||
|
||||
return calculateLabScore(lab)
|
||||
}
|
||||
|
||||
func clearScreen() {
|
||||
fmt.Print("\033[H\033[2J") // Clear entire screen
|
||||
}
|
||||
|
||||
func moveCursorUp(lines int) {
|
||||
fmt.Printf("\033[%dA", lines) // Move cursor up n lines
|
||||
}
|
||||
|
||||
func canPushRobot(lab *Lab, position Vector2, direction Vector2) bool {
|
||||
if lab.field[position.y+direction.y][position.x+direction.x] == WALL {
|
||||
return false
|
||||
}
|
||||
if lab.field[position.y+direction.y][position.x+direction.x] == EMPTY {
|
||||
return true
|
||||
}
|
||||
return canPushBox(lab, Vector2{position.x + direction.x, position.y + direction.y}, direction)
|
||||
}
|
||||
|
||||
func canPushBox(lab *Lab, position Vector2, direction Vector2) bool {
|
||||
var left_position = position
|
||||
if lab.field[position.y][position.x] == RIGHT_BOX {
|
||||
left_position = Vector2{position.x - 1, position.y}
|
||||
}
|
||||
|
||||
if direction == MOVEMENT[UP] || direction == MOVEMENT[DOWN] {
|
||||
if lab.field[left_position.y+direction.y][left_position.x] == WALL ||
|
||||
lab.field[left_position.y+direction.y][left_position.x+1] == WALL {
|
||||
return false
|
||||
}
|
||||
if lab.field[left_position.y+direction.y][left_position.x] == EMPTY &&
|
||||
lab.field[left_position.y+direction.y][left_position.x+1] == EMPTY {
|
||||
return true
|
||||
}
|
||||
if (lab.field[left_position.y+direction.y][left_position.x] == RIGHT_BOX || lab.field[left_position.y+direction.y][left_position.x] == LEFT_BOX) && !canPushBox(lab, Vector2{left_position.x, left_position.y + direction.y}, direction) {
|
||||
return false
|
||||
}
|
||||
|
||||
if lab.field[left_position.y+direction.y][left_position.x+1] == LEFT_BOX && !canPushBox(lab, Vector2{left_position.x + 1, left_position.y + direction.y}, direction) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
if direction == MOVEMENT[LEFT] {
|
||||
if lab.field[left_position.y][left_position.x-1] == WALL {
|
||||
return false
|
||||
}
|
||||
if lab.field[left_position.y][left_position.x-1] == EMPTY {
|
||||
return true
|
||||
}
|
||||
|
||||
return canPushBox(lab, Vector2{left_position.x - 1, left_position.y}, direction)
|
||||
}
|
||||
|
||||
if lab.field[left_position.y][left_position.x+2] == WALL {
|
||||
return false
|
||||
}
|
||||
|
||||
if lab.field[left_position.y][left_position.x+2] == EMPTY {
|
||||
return true
|
||||
}
|
||||
|
||||
return canPushBox(lab, Vector2{left_position.x + 2, left_position.y}, direction)
|
||||
}
|
||||
|
||||
func pushRobot(lab *Lab, position Vector2, direction Vector2) {
|
||||
if lab.field[position.y+direction.y][position.x+direction.x] != EMPTY {
|
||||
pushBox(lab, Vector2{position.x + direction.x, position.y + direction.y}, direction)
|
||||
}
|
||||
lab.field[position.y+direction.y][position.x+direction.x] = ROBOT
|
||||
lab.field[position.y][position.x] = EMPTY
|
||||
}
|
||||
|
||||
func pushBox(lab *Lab, position Vector2, direction Vector2) {
|
||||
var left_position = position
|
||||
if lab.field[position.y][position.x] == RIGHT_BOX {
|
||||
left_position = Vector2{position.x - 1, position.y}
|
||||
}
|
||||
|
||||
if direction == MOVEMENT[UP] || direction == MOVEMENT[DOWN] {
|
||||
if lab.field[left_position.y+direction.y][left_position.x] == LEFT_BOX || lab.field[left_position.y+direction.y][left_position.x] == RIGHT_BOX {
|
||||
pushBox(lab, Vector2{left_position.x, left_position.y + direction.y}, direction)
|
||||
}
|
||||
|
||||
if lab.field[left_position.y+direction.y][left_position.x+1] == LEFT_BOX {
|
||||
pushBox(lab, Vector2{left_position.x + 1, left_position.y + direction.y}, direction)
|
||||
}
|
||||
|
||||
lab.field[left_position.y+direction.y][left_position.x] = LEFT_BOX
|
||||
lab.field[left_position.y+direction.y][left_position.x+1] = RIGHT_BOX
|
||||
lab.field[left_position.y][left_position.x] = EMPTY
|
||||
lab.field[left_position.y][left_position.x+1] = EMPTY
|
||||
}
|
||||
|
||||
if direction == MOVEMENT[LEFT] {
|
||||
if lab.field[left_position.y][left_position.x-1] == RIGHT_BOX {
|
||||
pushBox(lab, Vector2{position.x - 1, position.y}, direction)
|
||||
}
|
||||
|
||||
lab.field[left_position.y][left_position.x-1] = LEFT_BOX
|
||||
lab.field[left_position.y][left_position.x] = RIGHT_BOX
|
||||
lab.field[left_position.y][left_position.x+1] = EMPTY
|
||||
}
|
||||
|
||||
if direction == MOVEMENT[RIGHT] {
|
||||
if lab.field[left_position.y][left_position.x+2] == LEFT_BOX {
|
||||
pushBox(lab, Vector2{position.x + 2, position.y}, direction)
|
||||
}
|
||||
|
||||
lab.field[left_position.y][left_position.x+1] = LEFT_BOX
|
||||
lab.field[left_position.y][left_position.x+2] = RIGHT_BOX
|
||||
lab.field[left_position.y][left_position.x] = EMPTY
|
||||
}
|
||||
}
|
||||
|
||||
func Part2(input structuredInput) int {
|
||||
var lab = cloneWideLab(input)
|
||||
//clearScreen()
|
||||
//printLab(lab, lab.command[0])
|
||||
//time.Sleep(1000 * time.Millisecond)
|
||||
for i := 0; i < len(lab.command); i++ {
|
||||
//moveCursorUp(len(lab.field))
|
||||
if canPushRobot(&lab, getRobot(lab), MOVEMENT[lab.command[i]]) {
|
||||
pushRobot(&lab, getRobot(lab), MOVEMENT[lab.command[i]])
|
||||
}
|
||||
//printLab(lab, lab.command[i+1])
|
||||
//time.Sleep(100 * time.Millisecond)
|
||||
}
|
||||
|
||||
return calculateWideLabScore(lab)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var start time.Time
|
||||
var elapsed time.Duration = 0
|
||||
input, err := LoadInput(FILE_PATH)
|
||||
if err != nil {
|
||||
fmt.Println("Error loading input:", err)
|
||||
return
|
||||
}
|
||||
|
||||
structuredInput := TransformInput(input)
|
||||
fmt.Println("Structured Input:", structuredInput)
|
||||
|
||||
start = time.Now()
|
||||
fmt.Println("Solution Part 1: ", Part1(structuredInput))
|
||||
elapsed = time.Since(start)
|
||||
fmt.Printf("Part 1 took %s\n", elapsed)
|
||||
|
||||
start = time.Now()
|
||||
fmt.Println("Solution Part 2: ", Part2(structuredInput))
|
||||
elapsed = time.Since(start)
|
||||
fmt.Printf("Part 2 took %s\n", elapsed)
|
||||
}
|
||||
21
15/sample.txt
Normal file
21
15/sample.txt
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
##########
|
||||
#..O..O.O#
|
||||
#......O.#
|
||||
#.OO..O.O#
|
||||
#..O@..O.#
|
||||
#O#..O...#
|
||||
#O..O..O.#
|
||||
#.OO.O.OO#
|
||||
#....O...#
|
||||
##########
|
||||
|
||||
<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^
|
||||
vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v
|
||||
><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv<
|
||||
<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^
|
||||
^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^><
|
||||
^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^
|
||||
>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^
|
||||
<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<>
|
||||
^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v>
|
||||
v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^
|
||||
Loading…
Reference in a new issue