From 7ea9fa5a6b10f93f0aca09ac8eb90543a781e67b Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sun, 15 Dec 2024 22:09:12 +0100 Subject: Day 15 --- day15/data_map.txt | 50 +++++++++ day15/data_moves.txt | 20 ++++ day15/example_map.txt | 10 ++ day15/example_moves.txt | 10 ++ day15/go.mod | 3 + day15/main.go | 271 ++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 364 insertions(+) create mode 100644 day15/data_map.txt create mode 100644 day15/data_moves.txt create mode 100644 day15/example_map.txt create mode 100644 day15/example_moves.txt create mode 100644 day15/go.mod create mode 100644 day15/main.go (limited to 'day15') diff --git a/day15/data_map.txt b/day15/data_map.txt new file mode 100644 index 0000000..0c64032 --- /dev/null +++ b/day15/data_map.txt @@ -0,0 +1,50 @@ +################################################## +##...OO.O.#.O..........OO..#.#..O.O.O.....O......# +#O.O#.OO.O#..O.....O..#..O........OO...O...#.....# +#O#..O........O.O.O.O......O.O##...#.O....O.O#.O.# +#...O.O...O..O..O..O.O..OO.O....O....OO.......##.# +#O...O......#O.#...O.O.....#O.....O....#.........# +#..OOO.....#.O.O#.........O#.OO.O.OO......OO...#.# +#OO.O...#.O.....O#O....O#.........O........O#OO#.# +#.#OO......O...O.O.#...........OO......O.#.OO....# +#.#O..O.O..O...O.O......OO.......OO#..O.OO#OO....# +#.O......#..OO.O...........O........O.O#.OO......# +#O..#..#...#...............O.#......OOO.OO.....OO# +##..OO.....#O##...O.O...##......#OOO..OO...O..O..# +#..OO..O..#O...O.O..O.#.O#O##.O..O..O..OO.#O.#.O.# +#...O..........OO........#...OO..O...O....O.OOO.O# +#...O.......O...OO.#O....O....O.O.O.O.#.O#..OO...# +##..O...O.O.......#O.OO.OO.OOO...O.OO....O..#....# +#O..#...O.......O#OO.O...OO...O...#....O.OO.OO..## +#...O..OO.#O.....O.OO..OOO.O........OO.O...#OOO.## +#.#......#..OO..OO.O.O.........O..#...O........O.# +#O...O..O.......O.O..#.OO.OO....#O....O....O...#.# +#.##O.#...O.#.......#O.O..O.OOO.......O..O..O..O## +#...OO.O..O......##...#.#.....O#O...O..O......#O.# +#..O#OO.O.OO..#O........OO..##..O...O......OO.O..# +#O..O.O.......OO.OO.....@O#.....#.O..#O........O.# +#...........O#.....O....OO..OO...O..OO...O..OO..O# +#O#...OOO................O.###.O...O.......O.....# +#.OO.O...OO#O..O#..OO.OO...O.......OO.O.....O...O# +#.O..#.O......OO..O.......#.OO.##OOOO..O....#.#O.# +#.............O...O..O.OO#OO.O#..OO.OO#O.##.....## +#..#O.OO.O.#..O#......O#.O....O.OO.O..O...O....### +#O.O.O.O...OOO..O..O..........O#.OO..#...#O.###..# +#..O#.#O.OO.....#OO.O....O..#......O.#O##..#...O## +###.O.....O.....O.#OO.....O........O.OO#....O....# +#O..#O.O.O.....O#.O..O.O#O...#.............O...#.# +#..............#O.#.#....O.OO...O...O......#...#.# +#OOOO...O.#..O..O#.#O....OOO........O.....O...#..# +#OOO.O.#.OO..O.#.O..O.O........#..O...#O.....O.O.# +#.....##.O.#OO.OO#.OO..OO.OO...OO...O....O#.#O..## +#O.O.O.O..O.....O......OOO...O..O...O#OO...O..O..# +#OO..OO..O......#....OO..#.O...OO..O....#O..#....# +#OO....OO..OOOO....O.OO.....O.O#.....#O....O.OOOO# +#........O.....#O..#O......O....O.#.O#..##..O..OO# +#.#....#...O.O.O....O.......OO#.OOO#.#....#..#...# +##O.O.#.....#O.......O.OO.#O...#OOO.O.#....OOO...# +#..O.O#.O..OO..O.........O......O..OO.OO.OO......# +#.O.....#.#O.O...OO................O.O.#O..#...O.# +#...O......O.OO..OO..OO....#O.O..#O..O#....O...#O# +#OO.O....O#..O.#.OOO.#............O.O.OO.O#.O.#O## +################################################## diff --git a/day15/data_moves.txt b/day15/data_moves.txt new file mode 100644 index 0000000..61fb448 --- /dev/null +++ b/day15/data_moves.txt @@ -0,0 +1,20 @@ +v>>^vv>>>^v>v^^>vv^><^vv^^^<^^<^>>^<>><^^>v>vvv<>v><>>v^>>><><^>^>^^^>>^^^<^^<>^v<^v<<>^^vv<^>v>v<<>v^<<>^><<>>vv>^<>vv>v>>><<^>^^>v<>>v^<^<^>vvv<>^v<^<<<^>^^v>^<^^v<^<<^<^^>vv^<>^<>>><^<<^vvvvv<^<^v<>>v<>^^>^^v^vv<<^^v>v<^vv>^vv>v>v<>vv<<<>vv<^<><^><<<>^><<<<^>v^v<>vv^^>>v>^>v^^v>><^^<>>v<>v>>^<^^^>>v^^^<<^<<>^^<>>^>>^>>^>>vv>v^vv<><<>><<<>v>>vv^^>v>><<><>^v<^<>v<<^><><^^>^>^^vv<^vv><<<<<<<<>v>^^^<><^v>v<^v><<<<<><^vv>^v>v^<<>v^>v<^>^<>^v^v^<^<><>>^<<^vv<>>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^v^v<<><><^v<><<>><>^^^>^vv^<^^>><^^^vv^>v^<^^v^v>>v><<<>vv^><>v<>>>v^^^vv>>>v<><^ +v>v>>^v^<<<>>><>><<<^v^v>^^>^v<^<<>>^^^^v^><^^^v>v^vv^v<>>v>>>>^vv<>vvv^<>vvvv^>><<>^^<<^><><^<>v<^<<>^>^<<^^>>>^^v^vv>^>><><>>^>^v<>>><>v^vv<>^v>>^^>^v^>^v^^>vv<^<^<^<^>v<<<>>>v^v<^v<<<>^<>>v><>>v<>>^><^>>v<^>v>v<><^^vvvvv^>^^>^>>>vv>vv>v<^>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>><>>>>vvv^<^>^<^>v<^>^v>^<^^<<>v^<>^vv>^<>v>vv>v^^^<^v^^^vv>vv>v^>^<<^vvv>vv^>v><>v^^^^<^v^v^<>v>v^>>^v>^>v<><^^<>><^<>v<^>vvv<<>v>^>>^^><>vvv^^^v>^^>><>v>^<^^^>vv<<<^>vv<^<^<>vvv<>^v^^>^^<^^^v^<>v<^^>^^>>v^v<><^v<>><>^<<<v>>v>>>^>^v>^^^vvvvvv>^vv>v>v<>^^><><^>^<>>^^^v^<v^<^<<<^<>><<<<<^^<<><<><>^<><^v^^v><^v>>vv +^<<<>>v>>^^v<>><^><^^>v>>^^^<>^>>^>v>>^>><^><^>vv^v>v^v>vvv<<^>>vv>^v>v<>^<>^>^^v>>v<^<^>><^v^v><<>v>>><<>v^<^>vv^v^v^v>^>v<^><><^>>><^>v>^><<v>^>>v^^<<<>>v^^v>v<^>>>v^^^<<^<^v><^><^>vv>>^>>>v>^<^vv><^^>>^<<^>><<v<^^^v<<>v>vv^^v<>v^v>>^>^^><>v>v^>>>>>vv^><^>v<^^vv^^>>><<<><^^><>>>v>>^<<<<>^v^v><^v^^^<>^<^<<v^<>^v>v^>^<>^>^<^^<<><>^<^<^>^v^v><<>>>v>^vv^v<>>>>v^>v>vv><>><^<>v^<<>>v^^v^vv>>^v>><>>v^>>><>^^>v><><>^^v^vv<^v>^^v>>v>^vv<v<^^^^^v<>>vv^^v<^>vv^v<>><>>v<^<^^<>>v><v<^>^^v^v>>v>vv>^^v^<<>>v>>>^^<>>vvv^v<^>vv<^>>v><^^>^><>>vv<><<^<^^^v^v>^vv><>>>>^>^<<^^^^>v^^vv^^<^<^<>>^^>v><^>v>><^<^<^><<>v^v^>>^><<>>vv^>v<>>v<^v><>>^<>>>><^v><^>^v^><<>^^><><^^ +>^>vv^v<>>><^^^^^^^^^<>^><><^v><>v>^v<<><^^v^v^v^v^v><^>>>^v>vvv^^>v^<^^>>v>vvv>^^v^^<^>>v>^<<<>v^^^^<^<>^^>>v<^^^>vv>>>>>v>^<<>vv^<>>v^>vv^vvvv><^^<>v>vv>vv<>v><>^^vv^v><<^vvv<>>^v<><>>^<<^v^<><v><>^vvvv^^v<<^^^<><<<>^^^>v^^<<>^<>^<>v>>^<<<^^<>^v>^><<<^v<>^^>>^><<>^^v^><^v>^^<>>v<<<<><^v<>>v^v<>^^vv>^^<>>^^v<><>>^^>v^v>v^>v<<^>>><^<<>^<^v^>v>>v>^>^>^<^<><<^^<<^><><><^vv^>vv<><<^^<<>^^>v>v^v<^>v>>>>><^^>>^v<^>v>v<><><<^>vv^<^^>>>><<<<>>v>v<<<^^<^>vv<^>>>><>vvv^^^><<>>>>^vv><^v^<<>vv^v<<>v<^vv><^^^^^<><^<>^>^<>^v^<^<^><<><>vvv>vv>vvv><^^>^>v^^^><^><>^><>^>>^vv<><^v^^<^>^v<^^^<>><>>^^vv^<>^v^>><<^^v<>^v^v^^v>^vv<^v^><^>^^>>><^<<>><>v>^vv^^vv<><>>v><<^v>vv<>^vv<^vv>^v>>vvvv^><<<^^<>>v>v>^>v^v>>><>vv +^v>v<^^vv^>>^>>v<<<<^v^<<<>>^^><<>>v>>><^^>>^<^>vv<^v^>^^<>^<><>vv<v<^^<<<><<><>^>>v<>><^^v>v>>><>vv>^>>>>>^vv^v^v><^^<<<>^<^^>><>vvv^>v^^>^^<>>v^^<>v<>^>>^<>><^^v<<>^vv^^^>><<<<>vvv><>^v^<^^<>>><>v>^>v<>^><>^>^>><^^<>v>v<>v><>v<^v><<>^>v>^vv><^>>^<^v^<^v><<^v<<<^><<<<<^v^<^>>>>>>v>vv>v<^^<^>>^^^vvv^v^^vv>^<>v>><><<<>>v^^>^<^>^v><^<<^><<vv>^>>v<><^v^vvv^<^>^<>^^v>v>vv<><<^<<^<<^>vv^>^>v>>^<>^^^^vv^v><<^>^v^>>^><<^vvvv<^v>^>^^>>><^^><><^^vv<^<>^^><^vv^>^>><<>><<><><>v^<^^^^vv>>^^^>^^^^^^v>^^<<<>v>^<^v>^^^^>>v><^v>>>^<<<>>v<>vv>><<><vv^><^<><>>^>vv^>v^v^>><>vv>^<>^>v^<>v<<<><>>>^>v<<^<^<><<>>>^v<^>>^^v<<<>>>^^v^><>>v<<<<>v>^^>v>>>v<<<<^^^<^>>^^v>^>v^<>^^^<^<^v<>^^^>^^<>vv^^>vv>^<<><><^^^<>^>>v>v<^^vvv<^>><<<<^>^^v<v>v>^v><^^< +^>>>^^^v^v^vvv<^><>^>><^^vv>^^>v^v>>vv<^^<^<^v^<>v>vv^v^^>v^^^^^^<>^^vv<<^vv^vv^^vv<>^^^^^><>vvv><^^<>v<>>v<^vvvv>^v>v<^vv<^^v>>><<<>v^^>>^<><>>><^>vv^v>^>v<<<>^v^^><<<^>vv<>vvv><><>>>^<>^v>><>v^^<<<^vv><^^>^vv><<<^>>^>^>>^<^^>><><><^^^^v^<^^vv<<>v^^v>>v^<<^^v^v^^<>v^<<>^><><^v^^vvv^>^><<^vv>^^^>><>vv^^>v^^^>^><^>>v><^<<^>>>>^v<<<>^>^<>v^>^^>>^^^^>vv^<<>v^v><<>vv>^<<<<<^>v^<>v<>^<^^>>v^vvv>^<<>^vv>^>>><>vv^^>vv>^>><^>v^>^><<^^^v<><<<^^^>><><^vvv<^v^^v<><<>>v^v>><^^v>^^>>>v^^v<^<^>v>>^^v><><<^^^><^>>v^>v^^<>>><>><<^^v^>v>^>^^vv>>^>vv<^v>^^v<>v><>vv^>v^>^<>>>v><^^^>v^v>vv<>^><>^v^>^>v^^<<><>>><><^>>^^^>vv^<>v><<^^>v^vv^v>v><>^vv<>v<^>^>>v^><>^<>^>>^^>><^>v><^^^vv^>^>^>^vv>v<>>><^vv^v^ +^v>^vv<^<^<^><>^^>v^v>v^><^v^>v>^vv^vv><><>^^v<>v<<>>^^^v^<^^><>^<^>^>>^v<>v^^^v>^>>>^vv^^<^><^^<^>^>v>v<^<>><>v<>^>v>>>v^<^^<>^v^^<<^>v<>v<><^v^<^>v>><^^>>v>vv<>vv^^<>v^v>^v<<<>^>>^<>^<^>><^>v>^vv^^<>>v>^^v<^v>^^>^<v>>>v>>v^v<^>^v^^>^^<>><><>><<^<^>^v^<>>^vvv><^v><<>><>^vvv<>v>^v^v>>v^<vv<^v<^^<>>>><^v>v>vvvv^>v<^^><>><>>>>^v^^^<>v>^v^^><>^^v>^<<>v>>vv>^>>v<^>>>><<^>v<^v^<v^<^^^v>^^^^<<>^^^vv<>>vv^v>vv<<<<^v>vv>><<^<<>^^>v><<>v<<^^><^vv^>v^v^>^>>>v<>^^^vv<^v>^v<><v<<>^>^>>>v^<^>>v>v<<^v^>^>^<^vv<^>^<<<<<^^^v><<>>^v^v<^>vv^v<^<<<^<^<^><>^^v><>>>>v^>^^^^^^^^<^>v>^^<<^^>v>>^>>v<^^>^^<<>^<>^><^^<<<<^>^>>^<<^>>v^>>^vv^>^<>v<<>^<^^v^>v<>^v^vv>^>v>v>>>^>>^<<>^>>^v^><^^^v>>>>v^<^<^>>^^v^^>>^<^<^v< +>^vvv^><><v>v^>^<><<^^^><>>>vv^v<^<>>>><<^vv<^^>v<^^v<>>^^v^^><^^^<>vv^v>>>>^^^>v^v>^^^<<^^^>^v>>v<^vv>^>>vvv>v^<<^v>^>>^<>><>v^v^v>>^>v^^^^<<>v><^<<<^>^v>>v<>v^>>>>^vv><>><^^^><^>>v<^^><^>>vvv>vv^^^<^><>v>^v^^<<^<>>^^>v^vv^>^>v>^<^>v>^><>^<^<^^^vv^^>><^>><<^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^<^<<<^vvv>^^<<>vvvv^^^<^>^^v<^^^>^v<>vvv>^>><v>vv<><^^^>>><>^^>>vv<><><<^^<v>^>v>^^>^vvvv>v^>v<<>><>v><^^<^^v<>^<>><>>^<^<><>>v>vvv^<<>vv<^><^<vv^v>>^vvv<^^<^v<<><<>^^v^<^v^<<^<^>vv>vv^^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^>^vv^v^v><^vv^>v>v<<<^^vvv>v<^v>^<<<^>^<>v<^^<^v<<>^v^v^^^^>>>><<<<<^^<^<^>v^>>v^v<^<>v^v^>^>>>^<^<><^^^vv^v<^^^<^^>vv^v<^<<^^v^vv><<^<>>^>^>^>><^vv<^v^^>v^v<^^^>v^v^<^>><<>v<<<>>vvvv>v>v^vv^<<<^v<^vv^v>v^^>><^v>v><^>vvv>vvv^<>v^><>^<<^v>>><<<<^^^^><^v^<^<<><^>^^v>>vv^<^v^vvv<^<^<<<>^^v>^>>v^^^v<<^<>vv>><<>>^<>v>^><<<<^v^^v^^<<<>vvvv<<^v^>>>^v<^v<^<<^>v^^<><^<>vv>>>>>^<<^v<>^v>^<<>v^<>vv>^v^>><<>v<^vv^v>^v><^vvv>v^>>v<<^^^<^v>^^><^^vv<^<^v<^^^^>>v>v<^>>>>><>vvv^<^vvv^vvv>^>^<^v^<<^>^v<<>vv>v^^<<>>v<>^^^^<>^>vvv><<^v>^vv>v<<<>vv<^>v<>>^vvv^vv^^>v>>v^^>vv><>^^v>>^vv<><^><<><^vv>^>vvv<^<>>^^<<^>>>^>v<><><^^><>>>^^vvvv<>^>>>><^^<>vv><<>>^^vvvvv<^<<<<><^vv^^>^<>^<^<^^>><>v>>vv<^^>vvv<<>>v^<>^<<>v^vvv>vv^^>^><>><>>>^v^>v<<v<^>v>>^<<^^>>v^v^^v^vv<^^<>><<<>^v<^vv<^v^^^<^v<<^^v<<>^<<^v>><^<^^><>^>v^v^^v>>>v^^><><>^v<^v^>>^vv>v^v<^<^<^^<^><>vvvvv<>>^<<>>^<<><>>^v>vvv>v^v<^^v^>^v>>>>>>>>>^<<>^vv^v>^>v<>^<^v^><<>v>^>>^^v^v^>v<><>^^<>^<>><><^<^<^v^<<^vvv^v><^^>>v^^vvvv><^v>>>^>^vv>^>^>>v><><>>^vv^v<>^v<^<>>>>v^^>^^><<^<><>^<v^v^vvv^>v^>>>^v><<>^^v<<>>>>^>>vv>>>^<>><>^v^^^>vvv<<>v>^>^>^>v>^v>>v>^>v<>v^>^>>>v>>^><>^>>><^^><>^^v^v^>v^v>>v<>v><>^<>^>^>>v>v>^<<<^^^>^<<^<<<<^><^vv>>>^><^<<>^>v<>^vv^<^v^<<>^^v<<^v>^v^<<><<>^<<>v^^vv>>^><<^<^^^<^^v>^>>^><>v^^>vv>v^v>^><^>^>^^<^v^vv>>^^^^>^<<^<^vv<^v^>^>>vv>^<<<<^v^^vv>v^^>^<>>v><<^>v>^^v^vv<<>vvv><v<>>^>v<><<>v<>vv>v^v<>^>^>vv<^^^^^^<<^^v>>>>^<^<>^>>>^^<>>^>><<^<<<<<>>^>>>^v^<><^^^v>vv><<>><^v<^^vvv>v^v^v<>><><<<<<<>><>v^<>v^^^>>vv^<>><^><^^v^v^^^^>^^><v^v^v>v<^<><^><>>v><>v^vv<<<><>>vvv^^vv^v>>>>v<^vv>>vv<>>v^<>v^^^^<<^>^^>^>^^v<<^^<^^v>^^^v<^^<>vv>vv>v^v>v<>^v>^<>^<<>v^^>>>^>^^<>>><^vv><v<>>v^v>^vv^>^^vv><^<>>v^^<>v>>^<<<^>^<^>^^^vv^v>><^<><^vvv>>>^^>vv>>^<^v><>^>>^>><^<^^>><^<^^<>>v<<^^>>>>><<^vv<^v><^^><^v<^<>>>v><<<^><^<^<><>^>^>>v^v^^v^<^^v^>v^<^><>>^>^<>>>v^>^>>vvvv^>^>>v<^>vv<<>^v<><^<>>><>^<^>>^v>v<<^^vv<^v<v<^<><>v>v<<<<<^^vvv^^><>>vvv<^^v^>vvvv>^vvv^>v<^><<<^vv>>>vv>>>^^v^vvv^<<^>^<^v<^^>^^v>^^v^vv><^<>^^^v><^v^v>^vv<^>><>^^^>^<^v>vvv><<^<^<^^v>>v^vvv>v^v>>>>v^>v<<>^^>><>>^^v^>^><^^<^vvvv^>v<^>>>v^<^>>><^<^^^^>^<>>>v>^v<^<^v<<^<<^v>v^ +^>^><<<>><<<<>>vvvv^vv^^^v>><>^^>v<^^v<^>^v^<<^><^v<>v>>^>>>v<^<>>>^vv><>vv>v^>>^vvv>^<><>vvv<<<>^v>v>^^v<<^vvvv^<>>>><>^^>^v^^>^<>v^>^<>v^>v>>vv<<><^v<^vv>vv>^<>vvvv>>>>^^>v^v<^^<^^^^v<>><^^><^><>v^>^<>v^v^<<^>>>^vv>>><>v<>>^v>^^<^v<<^>v^<<>v>>^<^^v>vvv<v><^>^>^>v>>^<>^^<>><>^vv>vv^v<^>^^>^^^vv^<^>^v><^<^<v><<^<><<^^<>><^><<<v^><<^^^<<<><>>v<>^><<^^v>v>>>vv>v^^v^>^<^^<<>v>>^>>vv<^<<<^<^>>^v>^<>^>vv><>><<^<>^v>^>^vv^<<^>^^<<>>>v><v>v^^<<<<<<^^v^<>><>>^>vv>^<>>v<>v^^<>>^v>v><<>^^>vv^^v^^vvv><^v<>v^>vv^^^^<^>^^^>>>>><>>vv><>^>v^<^^^>^>vv>>v^^^^^v><<^v^<<<<^>>><^<^^^<>^<>^^v>v^<^^vvv^^^>vv^>^v<^vv<>><<<^vvvv^>>v^^>^>><<>^v>vv>^^v<<<>^><<<^^v<^^>v>v<<>>>vv<<^v>>>^^><<<>><^<<>^v<^<<^vv<< +^v>v^^vv^^<<<><^<>v>vv<<>>v>^^v<^>>v<^^^^^v>><<>v<>v<<^<^vv^^<^<>v<>^^>><^v>>^v<^^^^<^<><^<^>><>><<<<^^vv<<^><^v^<<<^^v>>v>v^<<>v^<<^^^>>>vv^v^><^^>>><^v>>>^^><<>v<^vvv^<^^<<^^^v^^^<><<>v^vv>^v<v^<>v>vv^>><><^^^^v^v>^<^>^^^<<>><<>^v>v<><^vvv>v^^^vv^<<^>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>>>^><<^>^v<<<<^v^<<^^>v^v^><^v^^v>v>>^vvv<>vvv^^^>v^^>^v<^<<^<>>>><^<^><>^>^<<v>^v^>>>v^vv>^vvv<>vv>^>^^>v^^^<^>>^vv><<><^>v>^<^>><>><^v<<vv>><^^^^v>^<>>>>vv<>v>>v^><>v^vv^vv^>><^^^<>v<>vv<^<^^^<>^vv><<<>>v<><<^>>vv<>^>>>^v^>v<>v><<^^v^<<>v^v<>^>v<^>^>^vvvv^>^<<<>>>><^>>^>^^v>^vvv< +>>v><^>>>v<>><^>><>vv<>^>^<<>v>><>v<<^^>vv^>v^v><>^>^v>v<<^^^>>>vv>>v<^v^^^<^<>>^>^<<^^>v<><^>>>>>>>>^>v>^><^><>>>^v<<<>><>vv^<<^>><^v>vv>>^v<<><>>v>>>>^>^vv^<<><<>^>v>><^^v^^v><>^<>^^v>^>vv>><>^<^>^>^><>^^^<><<<^v^v^>>>>^v>>>^>^^>^><>v<>v>^v^^^>v<<<>^<<vvv^<><^vv^v<^^>^<^<>><<<>v><^^^v^^>^<>>^<>v>^v>^v<^^v<>v><^^^<v<^v>v>v^vv>^^vv><^>vv>v>>v^>^v<<>v><><>vv^>v>^vvvv>^v^>v>>v^>vv>v^^^>v>>>v>v^vv<<>^>><^<^v>v^^v<^v<>^><^>^v>>>v^<>^>vv^^vv>v>^>>^>^<^^><^v^<^vv^v<><>vvv<>^^^>v><^<>v>><<^vvv><<^<^^vvv<<>^<<>^<^><><>>>>^>^>^^><<<^<^v^<<<>><>>><<^v>>v^<<>^v<>^^<>v<>>^<<>^<<<>vv<^^v<^^<<>^v^><^^vv^<<<^><>>vv><^<>>vvvvv^<^<<^>>v<<^^v>><>^><<>v<^<^>><^>>v>^>>vv^>^<^>^^>> +vv^^v^<^>>v><^^>^v>v^>v^v<>>>><^<^v>v>>><>vvvv<<<><>^^v^^>v>>^>^>^^>>v^v<^v>^^v^^v<^v^>v><><>>^>vv^^<>v<>vv>^<>^v>>v^><<^^v<^><>^^<<^>^^v^^>>^^>^^^><><<<<<>^^<^v^^><^<>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^v><><>v>v<><v>v<>>>^^<<^v>v^v>v<>v><>vv^>vv>>>vvv<>^^><<><<^<^^<>v<>^<<<<><<>vv>vv^v>v^>^>v>>^<^^^<^^v<^vv<^<<>>^>>>v><^v^v>^^^^<^v>><^<><^>^<^vvvv><>v^vv>vv^v^<>v^>^^^^<^<<>^v<<>^^>>v<^><>^<<<^^^>>vv^^^><^v<<>v^v^<>v>^<<^^^<^^v^>v^v<>v^^>><^v<^>^v^>>^>v^vv^^v^>>v^^<^v^^^<<>^vvvv<>v>^><>>>v<>^<^>^^>^vv^<<<<> +vv<^vv<^^^v>^>><>><^v><>^^v^><>v>^v>^^v<>>>^^^>>^v^v>^^^<>^<>>^><^^v<>^>^^^vv<^^v<<^vvv^<^vv<<<^v^vvv>v<<^v^vv>^^^^<^v^<><<><<>>>><^><<^^>v>^^^>vvv^>v>>>^vv>>^<<^><<^^<^^><>^^vv>>>v^^>>><>^<<^<><>^^^v<^^^<>v<<^^^^>^<^^^v>^<<><>>>^v^>vvv<<^>><^^<<<><<<><>>^<v>>^^v>^>^^v<^<<v><^>^^^^>^^<>^<<<<>^^^vv<^<^^v^<>>>>^^vv^v>^vvvv>v>^<^<>^<>v^>v^>v<^><^<<^>v><>v>v<><>v^^^vv<>v>v^^<^<<^>>^>^<^>v^^^<>>^v>>^vv>^^v>><><<<>^vvv^v^vv>v>v<<>>><<>>^v^>^v>v<^v><^<<<<^<<>^>vv^v^>^>v>>><^v^^vvv^^<<^vvv<^v>>>vvvv^>>^v>^^>>>^v>v^^vv^v^^>><>^<vvvv<^<^vvv>v^<<><>^><^vv<^^^><>v<^>vv>^<<>v>vv<>^^v>>>>^>>vv>v<<^^^<<>>vv><<^<^><>^v>>^^>v<^><^<<><<^v^>^<^<^>v^vvv^v<><^>vvv>^v<^^>>v<< +v^v<^^>>>^>>>>v^>>^>vv><>^vv^v>vv^v>v<^^<<^<^<<>>^>^<^^<>vv>vv<<<>v^<^v>^^v>>>>v^^v>^^v^v<<<<^v<^^^>^^v<><^v<<^v<^v<><^><^>><^>>>^><^>>^^v><>v^vv<<^<>><^^><>>>>v><><>^^<<^^^v<><<>^>v>>><^^<<<<<>v^^vv>v<<<>v^>vv<>>v<^v^>>>v<>^^><^^vvv^^<^<>><<vvvv^<<>^>>>>><<^<^v^<<^v^>^>vv><^^><<vvv<^>^<^^<<^<^vv<><>><^>^>^<^vvv^<<v^<<<^>>^v^^<<<^v^^v<>v>>v<>><>v<>^v<^>vvv<^v^><<<><^v^^>>v<^<>^^>><^vv^^^^vv><^>v^<^v<>vvv<<>^v^v^v<>>^^vvv>v<<^>>><<^v^vv^>v>><>>^v<>>^^v<<>^^^<<^^^<^>^<<>>>^vv>><>vvvvv^<^>>^v><>>^^<>^v<^v<<><<>v><<^^vv<<>vvvvv^>>>>v^^<><^<>^>v^v<<>>vvv<^v^v^<>>v<^>v^^^vvv>>^>v>v><<<>^^vv^^v^>vvv^<^>>v>vv>^^<^^^v^<^<<<>>^<><<<>>>>>v<^v<>vvv<<><<^<^^<><^<^>^^^<^v>vvv<^v>v>v^<>v>>>v^^><>>><>>>^><><<<>^<><>v^>>^><><<<<>^><>vvvv>^v< +<^vv<><<>v<<^^>^>>>>^<^>><>vvv><vv^v><^>><^vvv>vv^^>^<^>v<^^vv^<<^vvv<>>^>>vv<>^vv>^^<>^>>^^v^^>><<<>><<^<^^^<>^><>^v<^<^>>^v>v^<^<>v^v>vv<^vv^v>^^^v><><<^<>v>><^vvv^<><>^>>><>v><>^>vv>^<>v<>>>v<^vv^^v<^v<^>vvv><^>><^^>>>v>v^><<>v^>vv<>v^v^^<^v>>v>>^^<^v^>><^^v<<v>^<><>vv^^<^^>v^>>^<<>^vv<><^>^^^v^>v>>v<^^^<^>v^^v>v^v^<>v<^>^^^vvv<^>v>vv><v^<>>^><><^>vvvv>^vvvv^<>vv^<<^><^^v^v^v><^>vv><^>v>><>^v^>^<>>v^vv>v^^^<^vv^><<>v^^>vv><<><^v^>>v>^>^<<^v<^<>v^>vv^<^^>^^vv>><^^<^<<><>^v<v^<^<>vv>vvv>^vv^>^<><<^^^^>v>>^<>v>v^^<^>>v<<<^v>>>>>^<><<vv<^^>>^v^<<>v^<><<^vv<<<<^<^^^<^^>>vv>^^>^vvv>v^>^<<>vv>v<^^vv^v><^^vv><^v^v>v^<^vv^v^vv +v<><<^^^v>^v^><^<><><>>^>^>v^<<>v<><^<>>v^^v<<^^>>v>^>^<^<^^^^<>vv<>^>^vv^^>^>v>^v>^<^>^vv<><>>v<<<^v<>vvvv^>>vvv^<><^>>^^>>^>vvv>v><^><<^v<^>>v^^vvv^^<^v>v^vvv^>v>>>vv>v><^><><<^>><^v<<^>v<>^vv>>^^^^v<>v>><<<<^^^v^v>^v>vvv>>><^>^<>vv^^<>v^>^^<>>^vv><^^>vv^v<>^>>^v^<^<>^vv>^v^>>><^<>v<>^v<^>><<>><>v>>>^v^^^<^^<>>^^^^v>^^vv>>>vvv>vv>>>v<^v^v^^><^<>>vv<>v^v<><<<^vv^^^<^><<^^^^v>>^<><<>v<><><>v^<<>v^>>>^>^^^<><>^>>>v^>v>>v<^v^^>^^^^>>v^>>><<<>>><>>>^>v^v^v>v^v^<>>>vvv^vv^<>^v<>v^^<<^>^<>^<^>>v^v>>v^<^>^^<^^^>^v>^^>vv>vv^v>v^v^<>v^>vv^^^v<<^vv<>>^>^<>vv<^>>>><>^>^v<<^v>v<<^>^<^^^>>v>v>v<^v><<>v<<^><><>>^^vv<^v<><<>^^v>^^^v^v^<<^v^<>^<^<^vv^^v><<^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^vv<^^^>v^v<>^vvv^^v<><^v<^v>>^^^<^vv>>><^>>>v>^<><><<<>>^^^>vv<>>^><>><v<><^>v>>v><>>>v^^>^><<<^<>^^^<<<<>vv<^vv<>>^><^><>v^>^<v>>^>^^>vv<>^v<^^<><<>^^<>^>^^^^^^<^^<<<<>^^>^v^^^>vvvv<^v^<^<^^<^v>^^^^>^<>v>><<^<><^^>v>v^<<>^>><^<^><<^v^^>>>^><>><<<>^<<><^>^>>v^^><^<^v^<>^vv<^<^<^^v>vv>^>>v^<^<^<>^<>^vv^^vv>v>><^>>><<^^^vv^<^^<^>^v>^<>^v><>^v^><>>^<vv<>vv<<<<^^vv<^>^^>v^vv>^<<^v<^vv>v^^^^v^^v^vvvv>^><<^^>v^<^v<>>^^<>^v^<<<^>><>^vv^v><<>v<v>>>v^^v^<^>v<^vvv<^<<<><>>^<<<>v^vv^<^^^^>>>v^v<^vvvv>^^^^^>vv^^v>vvvvv^<<^v^v^<<<>^>^><^>>v^v^<><^<^vv>vv>v<<<<<<>>>v^>^^>>^v<>vv^<><>^^^>v>v><<<<^<<><>>^v>>>v^v^^v<>><><> diff --git a/day15/example_map.txt b/day15/example_map.txt new file mode 100644 index 0000000..7415696 --- /dev/null +++ b/day15/example_map.txt @@ -0,0 +1,10 @@ +########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## diff --git a/day15/example_moves.txt b/day15/example_moves.txt new file mode 100644 index 0000000..8eaca6a --- /dev/null +++ b/day15/example_moves.txt @@ -0,0 +1,10 @@ +^v>^vv^v>v<>v^v<<><>>v^v^>^<<<><^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<^<^^>>>^<>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^v^^<^^vv< +<>^^^^>>>v^<>vvv^>^^^vv^^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^^>v>>>^v><>^v><<<>vvvv>^<><<>^>< +^>><>^v<><^vvv<^^<><^v<<<><<<^^<^>>^<<<^>>^v^>>^v>vv>^<<^v<>><<><<>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<>^vv<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v^<>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<>< +v^^>>><<^^<>>^v^v^<<>^<^v^v><^<<<><<^vv>>v>v^<<^ diff --git a/day15/go.mod b/day15/go.mod new file mode 100644 index 0000000..6f25ce0 --- /dev/null +++ b/day15/go.mod @@ -0,0 +1,3 @@ +module stevenlr.com/aoc2024/day15 + +go 1.23.3 diff --git a/day15/main.go b/day15/main.go new file mode 100644 index 0000000..377b961 --- /dev/null +++ b/day15/main.go @@ -0,0 +1,271 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strings" +) + +func main() { + { + exampleFloor := readFloor("example_map.txt") + exampleMoves, _ := os.ReadFile("example_moves.txt") + fmt.Println(part1(exampleFloor, exampleMoves), 10092) + } + + { + dataFloor := readFloor("data_map.txt") + dataMoves, _ := os.ReadFile("data_moves.txt") + fmt.Println(part1(dataFloor, dataMoves), 1492518) + } + + // { + // var simpleFloor1 [][]byte + // simpleFloor1 = append(simpleFloor1, []byte("##########")) + // simpleFloor1 = append(simpleFloor1, []byte("#........#")) + // simpleFloor1 = append(simpleFloor1, []byte("#........#")) + // simpleFloor1 = append(simpleFloor1, []byte("#.....O..#")) + // simpleFloor1 = append(simpleFloor1, []byte("#.....O..#")) + // simpleFloor1 = append(simpleFloor1, []byte("#.....O..#")) + // simpleFloor1 = append(simpleFloor1, []byte("#.....@..#")) + // simpleFloor1 = append(simpleFloor1, []byte("#........#")) + // simpleFloor1 = append(simpleFloor1, []byte("#........#")) + // simpleFloor1 = append(simpleFloor1, []byte("##########")) + + // simpleFloor := makeWide(simpleFloor1) + // simpleMoves := []byte("^^") + // part2(simpleFloor, simpleMoves) + // } + + { + exampleFloor := makeWide(readFloor("example_map.txt")) + exampleMoves, _ := os.ReadFile("example_moves.txt") + fmt.Println(part2(exampleFloor, exampleMoves), 9021) + } + + { + dataFloor := makeWide(readFloor("data_map.txt")) + dataMoves, _ := os.ReadFile("data_moves.txt") + fmt.Println(part2(dataFloor, dataMoves)) + } +} + +func part1(floor [][]byte, moves []byte) (result int) { + botx, boty := findInitialPosition(floor) + + doMoves(moves, botx, boty, floor, doMovePart1) + + for y, line := range floor { + for x, c := range line { + if c == 'O' { + result += y*100 + x + } + } + } + + return +} + +func doMovePart1(floor [][]byte, startx, starty int, dx, dy int) (endx, endy int) { + x := startx + y := starty + moved := 0 + for { + moved += 1 + x += dx + y += dy + + if floor[y][x] == '#' { + return startx, starty + } + + if floor[y][x] == '.' { + if moved > 1 { + floor[y][x] = 'O' + } + floor[starty+dy][startx+dx] = '@' + floor[starty][startx] = '.' + return startx + dx, starty + dy + } + } +} + +func doMoves(moves []byte, botx int, boty int, floor [][]byte, doMoveFn func([][]byte, int, int, int, int) (int, int)) { + for _, move := range moves { + switch move { + case '^': + botx, boty = doMoveFn(floor, botx, boty, 0, -1) + case 'v': + botx, boty = doMoveFn(floor, botx, boty, 0, 1) + case '<': + botx, boty = doMoveFn(floor, botx, boty, -1, 0) + case '>': + botx, boty = doMoveFn(floor, botx, boty, 1, 0) + } + } +} + +func findInitialPosition(floor [][]byte) (int, int) { + var botx, boty int + for y, line := range floor { + idx := strings.IndexByte(string(line), '@') + if idx >= 0 { + botx = idx + boty = y + break + } + } + return botx, boty +} + +type QueuedMove struct { + x, y int + c byte +} + +func part2(floor [][]byte, moves []byte) (result int) { + var botx, boty int + for y, line := range floor { + idx := strings.IndexByte(string(line), '@') + if idx >= 0 { + botx = idx + boty = y + break + } + } + + for _, move := range moves { + var queued []QueuedMove + var dx, dy int + switch move { + case '^': + dx, dy = 0, -1 + case 'v': + dx, dy = 0, 1 + case '<': + dx, dy = -1, 0 + case '>': + dx, dy = 1, 0 + default: + continue + } + + if doMovePart2(floor, botx+dx, boty+dy, dx, dy, &queued) { + hasMadeMove := make(map[QueuedMove]bool) + for i := range queued { + m := queued[len(queued)-1-i] + _, alreadyMade := hasMadeMove[m] + if !alreadyMade { + floor[m.y][m.x] = m.c + floor[m.y-dy][m.x-dx] = '.' + hasMadeMove[m] = true + } + } + + floor[boty][botx] = '.' + botx += dx + boty += dy + floor[boty][botx] = '@' + } + + if !checkIntegrity(floor) { + panic("no") + } + } + + for y, line := range floor { + for x, c := range line { + if c == '[' { + result += y*100 + x + } + } + } + + return +} + +func printMap(floor [][]byte) { + for _, line := range floor { + fmt.Println(string(line)) + } +} + +func checkIntegrity(floor [][]byte) bool { + for _, line := range floor { + for x, c := range line { + if c == '[' && line[x+1] != ']' { + return false + } + } + } + return true +} + +func enqueueMove(x, y int, c byte, queued *[]QueuedMove) { + *queued = append(*queued, QueuedMove{x, y, c}) +} + +func doMovePart2(floor [][]byte, x, y int, dx, dy int, queued *[]QueuedMove) bool { + switch floor[y][x] { + case '.': + return true + case '#': + return false + case '[': + if dx == 0 { + enqueueMove(x, y+dy, '[', queued) + enqueueMove(x+1, y+dy, ']', queued) + return doMovePart2(floor, x, y+dy, dx, dy, queued) && doMovePart2(floor, x+1, y+dy, dx, dy, queued) + } else if dx > 0 { + enqueueMove(x+1, y, '[', queued) + enqueueMove(x+2, y, ']', queued) + return doMovePart2(floor, x+2, y, dx, dy, queued) + } + case ']': + if dx == 0 { + enqueueMove(x-1, y+dy, '[', queued) + enqueueMove(x, y+dy, ']', queued) + return doMovePart2(floor, x-1, y+dy, dx, dy, queued) && doMovePart2(floor, x, y+dy, dx, dy, queued) + } else if dx < 0 { + enqueueMove(x-1, y, ']', queued) + enqueueMove(x-2, y, '[', queued) + return doMovePart2(floor, x-2, y, dx, dy, queued) + } + } + return false +} + +func makeWide(floor [][]byte) (wide [][]byte) { + wide = make([][]byte, len(floor)) + for y, line := range floor { + w := make([]byte, len(line)*2) + for i, c := range line { + switch c { + case '#': + w[i*2+0] = '#' + w[i*2+1] = '#' + case '.': + w[i*2+0] = '.' + w[i*2+1] = '.' + case 'O': + w[i*2+0] = '[' + w[i*2+1] = ']' + case '@': + w[i*2+0] = '@' + w[i*2+1] = '.' + } + } + wide[y] = w + } + return +} + +func readFloor(fileName string) (floor [][]byte) { + fp, _ := os.Open(fileName) + scanner := bufio.NewScanner(fp) + for scanner.Scan() { + floor = append(floor, []byte(strings.TrimSpace(scanner.Text()))) + } + return +} -- cgit