From 9b072d26dab0dbface07fb2792239864552b1b56 Mon Sep 17 00:00:00 2001 From: hal8174 Date: Sun, 15 Dec 2024 14:50:37 +0100 Subject: [PATCH] Solve day 15 --- input/15-0a.in | 10 +++ input/15-0b.in | 21 +++++ input/15-0c.in | 9 ++ input/15-1.in | 71 +++++++++++++++ src/bin/15.rs | 240 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 351 insertions(+) create mode 100644 input/15-0a.in create mode 100644 input/15-0b.in create mode 100644 input/15-0c.in create mode 100644 input/15-1.in create mode 100644 src/bin/15.rs diff --git a/input/15-0a.in b/input/15-0a.in new file mode 100644 index 0000000..8163605 --- /dev/null +++ b/input/15-0a.in @@ -0,0 +1,10 @@ +######## +#..O.O.# +##@.O..# +#...O..# +#.#.O..# +#...O..# +#......# +######## + +<^^>>>vv>v<< diff --git a/input/15-0b.in b/input/15-0b.in new file mode 100644 index 0000000..84cf1fb --- /dev/null +++ b/input/15-0b.in @@ -0,0 +1,21 @@ +########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## + +^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/input/15-0c.in b/input/15-0c.in new file mode 100644 index 0000000..6ee6098 --- /dev/null +++ b/input/15-0c.in @@ -0,0 +1,9 @@ +####### +#...#.# +#.....# +#..OO@# +#..O..# +#.....# +####### + +><^v><>^v<vv><<^^>>>>^^><>^<^^vvv>>><><>v^^^^<<^<^><>>>v><>>>^>><>v>v>^v>>v>>>v^<<^>v^>v<^v>vv^><>^<>vv>^>^^^v<^^>v^>v>v<<^>>>^^vvv<>v>><^^<><<>v>>>^vvv^^v>^^v<>^^<^^v^><>>><<v^>v^>^v^><^<>>>>v^<><^^>>>^^v^^^v^v>>v<><<^>^v>>v^v^<^<<><^>>^vv>>vvv^v^<^<<vv>^<^^>v>>^^^<^^^^<<^<<<<<^v>^^v>>>^<>vvvv>>><<><>^v>>vvvvv^<<^<>^>v>>^>>>v<>^v^v><<^v><^v<^>>^>>v<^v>>v>>v^v^v<<>v>><<><^>^vv^vv<>v^^^vv^<<>^>^^vv>^^<>>v^>>><^v<^vvvv>><<><>v<^<^vv<<<>><^<>^<^<>^>>vv<>v^>^<<^<^>^<^vvv>>v^>>>^<^>vv^<<^^<<>>>v><>v>^>^v>><><^<<>v^>>^<<>^v^<^<><^^^v<>^v>v<>^^^^^>>v>^v^v>><>^<<>^>v^><<<>v^<<^^><>v<v<>>v>v<<^v>^<<>vvv<<^>vv<v>^>>^^^^^^^vv^v>>>vvvvv>^>^v<>v>><^v^^v^^v><>vv>>^v>^^^<<^>v^<^v<>><<^v^<^><<^v><><^^v^><<^<<<^v<^>><>^^vv<^<<^^^^^v>>^><^^>^v^v>v^^v>^^><>v^v>vv>^>v^>v>v<<>><^<^<^>><^<>>^>^^<^v^^^>^>v>>v<vv^<<>^v>v<>v<<^^^^<^v^<>v<<>>^>>^<^>><vvv>><>>^<^>v>v<^vv^v<>^>^v^><<<><^v>><<^v<<^<^<>>>>v>>v<>>>v>v^>v<^>^^>v^^vvv>v>v>v<><>><<^^>^^vv>v><>v<>>>>vvvvv<>v><<<<>vv>vv><^v^<^<<^^vv><^>^<>v>><>vv^>v<^v>^>v>^v^v^<>v>>vv>>vv<^>^<>v><<^<>vv><<<>>^<>>^v^><>v^>^<<^>v^^^vv>>^vv^<<>vv^^v>>v<><^<^v><^<<<^^<>>vv>>^^<^<><>^^^<^^>^<<<^>v>^^v<<vvv<^<v^><^^><>^^v><<>v^v<>>^><<^v>>>>>v>^>^<>>v^^<^><^v><^^>v>v^>^>v>>^>>>>^<v>>^^>v><><><<>v>>^>^^^<^><^^^v>v>>^^<<>>>vvv^v>v^v^<>^^<^><^vv^>^^^>>^><^><>>^<^^<<>>>v<<><>vv>^>v>^<^>^^>v<>>vv>^<^^^>v><^<>v<<^>v><>>>><>>><^><^><^<^v>v<<^<>^vvv<>v>>>>^v>v^>v<^>^vv<<^v>vv^^<v^<><<v>vv^^>v<^^v><<>v>^>>^^v>>^>vvv>^ +^^<<>^vvv<^v^>><^<^<>^<>vv^<^^>^<^><^v>^>v^>>>vv>vv<^>^<>^>>^><^>^<>^<>^^v>^vv<^^v>^>v>v>v<><<<>>^vv^<>vv^^^^^<^^^^<v<<<^v^><<^>vvv>>vv>^<<>>vv><<>^v>v^^vv<<^>>>>>>>><>><^><^^^^><><<>^^^<<^>v<^>^^<<><>^<<<>v^<>^v^<>v<^<v><^<^v<><<<>>>v><<<^<^>>^<^^>vv^^>vvv^><^>^^>v><^v>^>>>v^>^>v<<^>^>^vv^^vv>v<^>v^v>>v>vv<<<<<^><^^<^<^^>>^<<v>vv^v^^>>^v<^v^>>>^>>^>>vv^v^<>^<>^><^>>^>^><<><^v^v<<>v<^><>v>^v^<^>v><^>>^v^vv>>^v><><>^v^vvv^^v<<<>^<<>>v>v>><<^>><^<<<<<<<<^^>^>^^>><<>>^v^^>v>>>><^^v^<>vv>^^vv<^<>v^v<<^^vv>>v^>>v>vv<>^>vv<><<>vvv^>>^><>v<>v>v^<<vv<<><<<^^v>^><<^v>vv^><<<^>>v><><<>^^<<^>^v^<>^v>v^>v><>v>>^v>^<^^>>>vv>>v^<>vv^^v>>v<^<>>^<^^>^>vvvv<>vv>>v<>>v<>v><^^^<v>v>>^v<<^<>><>^^<^><^^v<<<^>^>v^<>^><><<^^>>>>^>>>>><<<>^v +>^>v^^<^<^<<^v^^<><^<^>><^v<^^^vvv><^>^><<^^<^^v^>>><vv>><><<<^^>>^^>>^^v<^>v^>><>v^v^>^^<^v>^^<>>>v<v^<>><^>v>v<^>>^>>>v^>v<^>^>^<<^^^^vvvv<>>^^^<<>v>v>vv^<^^^^^>v<^^<^>>v^^<>>v^vv^^v^>^^vvv^<^^<>vv^v<>><^^>v^>^v>>>^^>>>^<^v^>vvv^^<><>><^vv>>^><<<<<^>>>^<>>v><><>>>v^<^>>><^v>vv<<^<>v<><>vv><^^<^v^<<^v>^>v^vv<>^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<^<>^<vv>^v^^^v<<<<>^v^v>^<^^>v>v><>vvvv>^^v^^<>>>v>>>^^>vv^v<<^>v^v<<^<<^vv>^<><<>^>>v^v>^<^v^^<>^^<>^<^>^<<^>v><^<>^<>>vvvv>^vv^vvv^^v><<^v<><<<^vv>><<^>^<^>v>v<>>^<^>^^v<^v<<^v>>>><>vv<^^<<>v^v><>^>^^<^^vv<>>^>v>v>>^^v>^^>><^>>v<><^v<^v<^ +<>vv^>><^<^>v^>v^^><^>^>>^^>^v<^<>v^v^<<>>^^>^v<>^v><^vvv^><^<<^v>^<^v^>v<>>^vv><<^v<>>vv>vv^><>^v>^><<^v<<>>><^>><>vv^<><^<>^v>^>>>>vv>vvv>v<>vvv^v^v<^<^v>><<>><><>vvvv<>vv>v^>><>^v><^vvv^^<><^^^v^<v^>^v<<>^>>^v^>^>^v>^<^^<>^<^^><>>v>^^>^>v^>><>^><>vv>^>><<^vv><<>><^v^^<>v^vv^>vv^<<>^>vvv^v<>v<<>><<^^vv<<<^><<><^>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<>v>v^v<><<>^>><><<^><<><^vvv<><<^^^v^^>>v<<<<>><^v^>v>^v^<^<^^v<<><^^><<^v<>v<<>v<><><>><>vvvvv<>>>vvv<<<^v>^^^>v>>v>vv>^<>>>^<<<^v<<^^^>^v^<>^<><>v>v<^<<^>^v^v^<>v^>^<^^<<^>v<^^<^vv^^v>><^v^<>^^^>^>>vvv<>v^<^vv<>^v<v><^^v^^v^^^^<^^v<<^^vv<<<<>vv>v<^^>>^^^<<>>v><^><^v>^^>v><>^^vvv>^<^^v^<^>^^<>vv<><^><>v<>v><^vvv>>>^>>v^>>>^v><>^^^>^>v><^v>>v>v^<>^v<><>>>^<<<>>>v>^^v>><><^<<>><<<^<<^v^v^>^^><^<<<<>^><<<^v<<>v<>^vv<^v><<<^^^>>vv^<^>vv<><>^v><>v^>v><^^<^v^v<^>vv>v><^>^>vv^<^><^^^<>^>>vv<>vv>vv<^^><<v<>><>><^vv^^<^^><^^<><^>><^>>^vv<^^v^<^v^v^v>^><><<^>v^<>^>><^vvvv^><<>^vvv^vvv<><><>v><>vv>>>^<><^v>>^>v<><><>>>v^v>v>^>><^<^^v^^><>><>><^<>>^v^^v>>>^v>v^vvvvv>^<^^>>>vvv<^v^<^>v<^v^<>><>v^>>v<^^>v>>><^v>^>><<^v^^v>v<><>v><vv<^^v>>^>>^v^<^><^>^vv^v<^^v>v>v><^^^<>v>vv^>v^>>^vv^vv^^>v>>><<>^^>^>>^>^<>vvv^>^^<^^><>^vv><>v>>v^>^<>^^<^^>>v^<>>>>v^>v^^><>><^v^>>vv>>v>^^v^>^<^>>v<>v^>v +>^<<<^>><^<>^^<>>^v<<<^vv<>><<^<><>^<^vv^<^<<>>>^>v><^v>^>><^>^^<^<>^<<>>v^v^<<v^^vv>^^^v><<^>vv^^>v<^>v>v><><>^<<>>v^^<>vvv>v<<<^^<>^^^^>><>v>v>^vv>v><>^^><<^v^^vvvvv^<^^v<><^>vv>>vv>^<>>^v^>v<^v<^vvv>>v^^>>^^vv^<<^>>v<<<>>v^<<<<>^^<^>^<<><^^>vv>v<^><>v<^>>v^<>^^v^><^<>vv^^>>>^>v^<<>v><^>^<>vvv><<><>^vv<^<>v>>^<^^>^>^>v^>><>>v^v^^<^v^^v>v>^v<><>>>^^><<<>v^^^<^v<^^v<>v^^<<>^^v<>>^vvv>><<<<^vv^v>^v<>^>vv^^vvv>vv^><^<<>>v>^vv^v^>><^<>>>vvv>^vv^^<>^vv^>^<><^>>>v><>v>^vv>>vv<^^<^^>^>v><^>vv>>><>>^^>>^v^v<^<>^vv^>v<><<^^v<><<>v^v<>^<>v^^<<^^^^^><>v^v><^^v^<^>^<<^^v><^^>v>>^<^><<<>v>>>>^<>^<^v><>^^<<^<^v^>v<<>^>^^v<>vv>v^vv>v<<<>^v<>^><<<>^^<^^<><<><^^>vv^^<^<^v>v>vv^>^>><^<^><<>>>>^vv>^<<>v^^ +vv>>^<>v^^v<^^v^v^<>><>>vv^>>v<<>v^^<<<>vv>^v^>v<>>^>v<^v><<>>^<>^^<^^>>^v><>^^<>vv>>vv<><^^v^^>>^v^^<<<>^^vv><>v<><>>^^<^<><><<^v>v<^^^>>^v^>^>v>^v>^>v^vvv<>v>><>v<>^<>v^v^^>^^<^<^v>v<>v^^v>v>vvvv^vv^^^>v>vv<>>^^vv^>v^<<>>v^>vv>vv^>^v^>>^<><^>v^^^><<>v<^>^^<>>><^><<>^^>^<^^<<^>v^v>^<^>vv^^<<^^vv>>><^>vv^><^<><^>vvv>>^^^^><^>>>vv<>>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<<<^^v<^v^>><<^^<<^v><>^v>>>v>^^^^v>^<<<><v^>v^^>^v>v^<>v^^v>^>^v><^<^^v>>^<>v^<<^>>><<^>^>v<<^><^v^v^>^>^vv^vv>>vv<<<<^v><^>>^>>>v>>^>^>><<>><>v^><^^v<<^^v<>^><^v<<<^^^<>^^v^<>>v^<>^^^^>v><<<><>^v>v +vv<>^>v^<^^<>^^>vvv<>><>>v><><<<>><^^>^<<v^>^>^>vv>>^v^v^<><><^>><^v^vv><<>><>v^<^<>v^<^vv><>vv><^>^>vv^vv<<^v<vvv><>>v^<^^^v^^<^>^^^>vv>^^<vv^v^<>^<v<<>v^vv>v>^>>v>vv>^v^^<^vv<>v^>>><^<<>^^v^vv^v>>^^v<^<^<>vv><^>>^<<>v<^v<>^<>v^^vv<>><><^^<^v^>^^<<^^v><^^v^^vvv>v<><^>><^<^<>v>>vv^>>^vv<>>vvv^><>^v<><<>><>^^<<>>v<<^<><<^^v<<^^>><<^>vv^^>><>>v><^^>>^v<^><<^^^><>^<<><<><<^>>vv>>^vv<>^^>>v<>>>vv<><<^^v^>^<>^^><^v^>v^v>^<<>>vv<<<^v><^vvv<>>^v<>^^<^^v^<^>v<>>^vv<<>^><>>v^^v>v^^v^v>>><>^>v<>^^<><^><<<>>v^vv^><>>>v<<<>v<<v<^>^v^v<^vv<<<^>v>v^>^^><^>v>v><^^v>^vv>>vv^>^<^v>><>vv^v^v>^<>>v^<^^^><<<^^>>>^^>>^>^^><^^v>v<>vvv><^vv^^^^v^^<^><>>^>>^>^<>^^>>>^<>vv^>^>v>v^>vv<>>^>^>>^>>v><>v^>>v>>>^<>^<<^^>< +><<>^>>^<^^v^^><v>v^>v>>^^<><^^<^vvv<><<^^<^^>^^v^^>^vv>^<<<>^<<>vvv^v^^<><>>><<>><^<>>^>^<^v>v>>v^>^^v^^^>^vv>vv^v<>v^^^v><^<>><>>vv<^>v^>^v<>^^^vv<<>v<^^v><>^<<^>^>>^<<>^^^<<^vv^<<<^^^^>^>v<^<<^^>>^vv^>v>v>^>>^^^v<<^vv^^>>>^>^^^^<>>>>><^>>^^<>^<v^^vv^><>>><>>^v<^><>v^>^>>^>^^^>vv>v>^^^^vv<>>>v<<^^>>>v^v<^<^v<<>>^^^<>^v>>^<>^><^>>^>>v><>>>v>><^<<<>v>><>^>>>v^vv<>vvvv>v>>vvv>>vv^><>^^>v^>v>^>v^vvv^^>>v^>>>^>v>^<><<<>^^>v^v>>vv>^^>^<>>^v<^<<><<^><>^^vv>^<^^v>>^><^<^^><^v>>^vv>>^v>^>^><^vv>^^>>v^>^^<^v^<<^<vvvv^vv>^>><>v^><><>v<<>vv^^^<^vv>v^v><>^>>^v>><^<^^v>v^>vv^^>>^<><><^v<><<^><<><>>^v>v<<><<^<>><^<^<>>^v>><<^><>v>^>^v><>>^>>><v>>>>><<<>v>>v^^vv<^^<<<>vv^>vv<^^>^<>v^^<><^^>v^^>^>>v>vvv<<>>^<^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>^>vv^>^^>v>>v>>^v<<<<<^vv><vv^>>v><>>>vv<>>^^<^v^vv<<><>^v<^<<vv^v<>v>v<>^^^>^^>>v>vvvv><<>v>v>>^<^>><^v<^v>^>v<<<<<>v^<<<^^^^<>vv>vvv^>^v>v>v><><<<^^vv^^^>>v^^>vv>v<>>v><^v>><<><>v<^<>^^vv^^><>v^^^^>^^^<<>^<<<>^<^<>v<>>vvvvvv><^vv>>v>><<><><^^>^>^>^<<^^^v><<<^v<>>^>>^v>^^v^^^^v>^>>v>vvvv<^>v>^>^<>vv^^>><^^>>v^v<^>vv^v^>v>>>>v>v^v^>>v><>v^v^<^>v<^^^^^v<<^>v>>^v>v^v>v^>vvv>vvv^vv^^v>^>v^v^^>v<^vvv><>^v>^vvv>v<><^^>v^^>><^^<^>vv>><<^^<>^<>>^><^^v^<<>>^^v>v^>v>^v^>v>>>>^>>>^>^><>^v^v^>vv^^<^^^>>^vv^^^>v^>>^<<<^^<^>^v^^^>><>><>^<><><<^>vv>vvvv<^v<>>>^>>><^^^><<<>^v>>^><>^v>>^<>>v^>^^vv<<^^><<>v^<>>^<<<<^^^><^<><^vv><>>v<^^>v>^v^^v>^v^>>^<^>vvv>^v<>v<>v>^^^><>^vv^<^<^>v^v^<>>><^v^<>^^^<^><>>v^v<^>v<^>^<<^>^^^^<<<><><^>v>>><^^>v^>v^vvv<<^^^><^><^>>><<<<^<^^v<^<^v^<^><<^>>v<^>v<>><^v><<<>>vv^<>^^^><^<>^^><^<^>v>>>^<>><>v<>vv<^^<^<^^<>v<><v^vvvvv<>v>>v><^^<><<>v^>^v^><^<>>vv<>^^<<^<<<>v^^<^>^v><><^>>v<>^vv^v>^v>>vv<^<^>vv<^<^<^^^<>v^vv><^^>v><<<<>>v^vv<^<>v><<<><><^vv<>v<^v^<><<>^<^^vvvv<<>^^vv<>>>><>^v^^^>v>>^>v^>^<<>v>>^v^^<<^^v><>^v^>vv>>v>^<^v<>>vvvv>>>^^<>^><>>v>><<^<>^>^>v>>>^^<^><^v>><^><><>^v^^>v^v>>^v^v<<<^^^<^<^<<^v>^<><>>>v>^<<><>vv>>>^>v<><>vvv^v>^v^vvvv>^v>>^<^>v>^>>><>vv<>^^<<>^v^v<<>vv<>^v>v<>^^<<>><<^vv^>>v^ +^^>vv>^<>vvv<^^v>v>v>v>v>^v>>^^><>v>v><><^>><^v>v^vv^^<<><^>vv^>>^><v>^><<<^<<>^vv<>>v<<<<><>v>^^><^><>>v^>v<^vv>v>^^<^>>v>^^>>v^vvv^v>v^<^v>><<>>>v<<<><>^<>^>^>vvv^^^>>v<^<^^^<^>v^>^<^v><><^vv^^><><^>^<<^>>v^>^v^<<^>v^>^<^>v>vvv<<<>v>>>>^>>v^><^vv><>><<>vvv<^<<>>>^<^v^^>^>v^<^><><v^vvv^^^<>^v>^>><^<<>>>>>>v<^>vvv>v^^^<<^>v<^><>>v>vvv<^^><^<^vv>^v<><>>^>>^>^<^><^>vv><><^><<<>>^>^v><>>v^v>^v<^^^><><^^>^^>v>^^^<^v><<<>>v<>>^>^^v>^^><>v<^^<<>>v<^^>>><<^>>^^vv><<>><>^<vv<<>>v^^v^v^^<><<<>v<>>^>>^<^<<<v^>>^<^<<>vvv<><>vvv>>>>^^>^vv>>^^v>>v<>^^^><^^^><>>^^^<<>>>v<^v^>^^^vvv><^<><>>>^v<><>^>>vv>^^vv^^<^<>vv<^<^<<>^>><<>>>^v><^v^^v^<^>v<<>>^v^^<^^>^>><>>^><>^>v^>>^^^^^^<^>^^>vv>>>>>^>v>^>^>>^v>>^><<> +>v><>^v^^>><<<<^^><>^>v<<<>vv^^^v^^<<<>v<<^^<>v<><^v<<^^v<>^v>^v<^v^<<<>>^v^<><<<>>v><>v>^v^^vv^^><>v>v^>v>><^>^<><>vvv>v^^<>vvv^^v>v><^>^>^<<^v<^><^vvv<^>^>v>>^>^^vvv<>v<<<^>vv^>v>v^v>v><<>vvvv>^>^v<^v<>>vv><>v^>>^<^^>v<^^>>>><><^v>>^>^^>^^^>^>><^^<>^^>v^<<^<^^<>vvv><>>v^^>^<^v<^^^^v>>>^>^^v<<<<>>vv>vvv<^>vvvv<^^^>^>v<>>>^<><^>><^>v<<<^><>>^>v><<<<^>v^^>^^vv<^<>>v>^>>^<^<<^v>^>>><^^vv<>^>v^><^>^vv^<>><<^>^>>^>^>v><<>^<v>>^>v^>^^v<>v>^v>v<>>^^>>>>>^><>>^>><vv<>v>^>>^^<>>>^>v>^>>>>vv><<^v<^<<>^<^>vv>^v>^^^>>><<<>v^^^<^<^><^<^>v<><>><><^v^^>>^<<^^>>>^<><^><<^v^<>>^v>^^<>^^^^^^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^<<>v^vvv<^vv^<>^>^v><^>>^vv<<<^^^v>^<^><>vv<v<^<^>>^<^v<>^^<^v<^>><^v>^^v<>>>v^<>>v<<<^>^>v<<>>>^>><><^v<>vvvv^v>^^>^^^>^v^v<>^v>^^v<^>vvv<>><^^^<^^<>v>^>>v^<>^^vv<^vv<>v<><^<>^^><<<^^>v>v^^>>v>vv^>vvv>v<<^><<<<>v<>^^>v^><>^>vv<><<^^>vv^<<<><^>^<>>^<^vv<>v>^vv<^>v<><^v><<<<<^vv><^><><^>^v>v>^v^><><>>>^>^>>>v><>>^^<<<<^vv<>>v^>^<>^^^<>v^v^vv><^vv>><^<>^>v>^^<>>>>^<^v<>>^^^^v^v<>^>v<^^><^<<^>v>^vv<^vv<>>>>>vv<^v^v^^v^><<<<^>vv^>>^>v<^<^>^^>v><<^<>v<v<>v>^<>^>vv^^<<^^v><>>vvv<>>^vv>><<^^>>^<^^^><>^vvv>^^^v<^<^>v>><<>v>>^vvvv<^^<<<<>v<^^^>v^v^>v^^<>^vv^v><<<^v>^v>^^<^v>>v^>^>v>v>^^vvv>v^^>>^v<>>^v^^^>^^<^><><>^v<^>^>>><^v<>vvv^> +<>><>>v>vv^<^^<^vvv^v><^><<>vvvv^><<<>v<<<>^><^v><^>v^>^>vv>^<<>v>>>>^^vv>v>^vv^>^v>v>>v>>^^^><>v>>^v>>v^><^vv^^vv^<>v<>><^^v^>v^v>v>vv<<vvvvvv^v^^^><<>vv>^v^><>^^v>>><^>v>>>>v^vv>^v^><<>^v<>vv>vvv^v^vv^v^^<>^<>v^v<>>^><^>^<>^^v^v^v>>vv>v>v>v^>>>>>^><<>^v<>^<^^^v><>v>^^^<>v^>^vv>>>>>><>v>><>>>v>><<^>v^^>vv><><<>v^>vv^^^v<<^>v^<>v<>>v>^^^v>v<^vvv^v<<>v><v>^^^<^^^><>>^vv>^<<<^^>^<^v<^^vv><^^>^<^><>^v>><<^>vv<^>^><>^>^>v><>^>>^>v>^^>vv<<<>>><>^>^><<>v^<<<<>^^v^<>>>^><^>>>^>v<>>^v<^>>><^^^><<<>><><^v>^<>v^<<^<^>^<>>>^v>><<^vv<^vv^v<>>v>v>>v^^vv^<^^vv><^v<>^v>>vvv>v<<^<>^v^v^>vv<>^vv<^<^>><<>vvv^<>v<^v>^^v^vvvv>vv^v^<^<<^v>v<^<<><>v<^<^<<^>v<<^<<<>v><><^^>vv^>v>v><><<<^^<^>vv><<>vv<<<>^v>>vvv^^v<^>^<^ +^^v^v>^>vv^><^<>v><^vv^<^>>vvvv<>>^vvv<>>v<>^v>><>vv>^vvv^v^^<^v><<<^>>v>vv^<^v^<^vvv><>><^^v<^<^<>>^>^^<<<>v^vv>^v>>^>^^v<<^^^>v<><><^>^>>v>>v<>^>>v><>vv>v>>>^>^<>v^>vvv<^<<>vv<<><>^vvv<><^^^v^^v>><v>>v^v>>^vv>v>^v^<<<^>>^>^^^<<^>>^>v<><>^^^^<>^vvvv^^v^<<<^><^><<^>v><^v^>v<<^><<<^^v^^^><v>>^>^vv<<<<^vvv>>>^><><<<v<^^v><>^v<^<>^<vvv<^^><><^v<>>><<^>v><>>><><^v<^<<>vv>v>^^><^<^>v^>v>vv<>^<<^><^^>v<^v>^vvvv><^vv>^^^><^v><>>v^>>v^v<>v>>><>v><>^<^<<<>>>>vv>>v<^>>><^<^>^^>><>^^<<<>v>v^<^v<<>vv>v^>^^<^><^>vv^>>^v><<><<>^v<><^^vv<^vv<>><>>v>^<<^v<^v<^^>^><^>^^>><<<>^>>>>v>v>>>^v>^^v<^v>^<>^>>^<><^>vvv>>vv<<>^v^>^^>^<^^><^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>v^<^<>^>^>>^<^^^^>^^v>v>>^><<^>>^vv<^^^^>^^v^<<v<^><^>><>>^vv^^<<^v<<>v><>^<>v^v>^<<v>>>vv^vv<^<^^v><<^v>>>vv<^<^^^v^>v><<>v^<>v><vv><^<<>>>v><^<>^^<^<><^<vvv<<<>>>^^^^>>v<^>>^vv>vv<^>vvv><^^v<>^<>vvv^>>v<>v<<>v<^v^^<^vvv>v<<<>>v^<^>v^vv^v>v^v><<>>>v<^<<^>vvv^>v>>>^vv><><<vvvv>^<>><^^v><><^v^v^^v><^^>>>><^>^>^>v>>vvv<<>^><>^^v^^^v^^>v<vv^><>><<>v<v^><^v^^^^^<><<^<^^^>^^^vvv^<<^v>vv<<v^<>v<^>v^vv^>^^>v<>vv^v><><>^<><>>><><^v^<>><vvvv<<^>^v<><>v^<<^^vvv<<<>^>^>^^^>^v><^^<>^>^v^>>^v^v<<>vvvvv^^v<>v^<><^<^v<>^v>^^><^v>v<>v>vv>^>^v<^<<^>v^v>^^>^<^>^vvv<<<^><^^<^>>^^>^<<<>^>^vvv^v^>^>>v<>><>><^v^v^>>^^>>>v<<^^^>^v^^^><<<<<<^v><><^v>vvv>^vv><>v< +<<>>v<^><^vv^^^^v^v^v^^^<^v<^^<<<>v^>>^^^v<>v^v>>>v<<><<<>^^>>^<>v^v^^^>^>^><>>><>>^v>><<^^vv>^<^^^<>^>>^v>>vvv^>v<>^^v^^^v>v<><<<>v^v>v<^v>^<^v^vv^><^>v^>v^>v^^^<>v>v<v>v^^>><>^><^vvv^v>^^<<<>^>v<^v<<>v>v<><>^^>^vv<><>vv>v<>v^>^^><^><>>>v<^><<^<>v^>>>^^^vv^><>vv<^<^v<^>^>^<^v>><^v^v^>>^^v^v>v>>v>>vv^^^^>><>vv><>^^v><<<>v^>^>^<^>^v>^vv><><^<<<<^<^^vv<<>>^v^^v^>>>><^>>^v>>v><<^^v>v>>^<^^v>>vv<<^vv^^v<^>^^v<^^<>vv><^<<^><^^vv>^^>^^^<<<<^v>>vv<<<><^vv^>^<^<>>vvv^v>><^^^^>^v<>>vv^^^<>>^^v>>>^^vvvvv^<^<<>>v<<>^<<>^>>>v<^^>v^><<><><>^v^^v>>^<>v<^<^^^v<<^>^^<<<<<^<>^><^<^v>^^^<>v^<>>^^>v^<^>^>^>^<<^><>v^v>>^<><^^>^>v<>>v>>>^>>v<><<^<^v^>>>v^<>^vvv<<<>>>^>^v^v><>>>^vv<<^^<>^v>><<<^<<^ +vvvv><><>>^^^>v><<>>><>^<^^^><>><>^>v><<<>>^<<^v<<<^^^>>>>^>>>>^><>v>>v>v>>v>>^^<>v>v^^^^<<>vv<^>>>>^v>vv^>vvv^v>>v<^^^>v>vvvv<<^>^>><>v^<^^vv>^<<><<>v><<<><^v^^>><>>^^<><>^<<>>>^<>^>^>><>^<<>^^>><<>><^><<<>>v<>v^^>vvv<<^<>vv^>v^><>^>^^v>^><><v^v>v>^><><><^^^^>^v<^>^vv^^v<^><>>><^<<^>>v><^v>>^>v>>v>>>vv><>v<^^v<<<^^<>^v><^<<^^^^^>>vv^<<><>v<^<>vv<<>^^<>^>vvv>^<v>^^<>>>^vv^^^^^^>^><^^>v>^vv<<><<>vv>v^><><^>>v^>^>>vvv<<><>^<>^^^v>^^^^^^v^>^<^^^^<>>>>>>><<>>>>^<<^>>>>>^>vv>^<<<<>v^>>>v^vv^>>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^><], posx: usize, posy: usize) { + for y in 0..map.len() { + for x in 0..map[0].len() { + if posx == x && posy == y { + print!("@"); + } else { + match map[y][x] { + MapField::Empty => print!("."), + MapField::Wall => print!("#"), + MapField::Box => print!("O"), + MapField::LeftBox => print!("["), + MapField::RightBox => print!("]"), + } + } + } + println!(); + } +} + +fn moveable(map: &[Vec], x: usize, y: usize, dx: isize, dy: isize) -> bool { + let nextx = x.checked_add_signed(dx).unwrap(); + let nexty = y.checked_add_signed(dy).unwrap(); + + match map[nexty][nextx] { + MapField::Empty => true, + MapField::Wall => false, + MapField::Box => unreachable!(), + MapField::LeftBox => { + if dy == 0 { + moveable(map, nextx, nexty, dx, dy) + } else { + moveable(map, nextx, nexty, dx, dy) && moveable(map, nextx + 1, nexty, dx, dy) + } + } + MapField::RightBox => { + if dy == 0 { + moveable(map, nextx, nexty, dx, dy) + } else { + moveable(map, nextx, nexty, dx, dy) && moveable(map, nextx - 1, nexty, dx, dy) + } + } + } +} + +fn move_box(map: &mut [Vec], x: usize, y: usize, dx: isize, dy: isize) { + let nextx = x.checked_add_signed(dx).unwrap(); + let nexty = y.checked_add_signed(dy).unwrap(); + + match map[y][x] { + MapField::Empty => (), + MapField::Wall => (), + MapField::Box => unreachable!(), + MapField::LeftBox => { + if dy == 0 { + move_box(map, nextx, nexty, dx, dy); + map[y][x] = MapField::Empty; + map[nexty][nextx] = MapField::LeftBox; + } else { + move_box(map, nextx, nexty, dx, dy); + move_box(map, nextx + 1, nexty, dx, dy); + map[y][x] = MapField::Empty; + map[nexty][nextx] = MapField::LeftBox; + map[y][x + 1] = MapField::Empty; + map[nexty][nextx + 1] = MapField::RightBox; + } + } + MapField::RightBox => { + if dy == 0 { + move_box(map, nextx, nexty, dx, dy); + map[y][x] = MapField::Empty; + map[nexty][nextx] = MapField::RightBox; + } else { + move_box(map, nextx, nexty, dx, dy); + move_box(map, nextx - 1, nexty, dx, dy); + map[y][x] = MapField::Empty; + map[nexty][nextx] = MapField::RightBox; + map[y][x - 1] = MapField::Empty; + map[nexty][nextx - 1] = MapField::LeftBox; + } + } + } +} + +fn main() { + let text = std::fs::read_to_string("input/15-1.in").unwrap(); + + let (map_string, commands) = text.trim().split_once("\n\n").unwrap(); + + let mut start_x = 0; + let mut start_y = 0; + let mut map = map_string + .lines() + .enumerate() + .map(|(y, l)| { + l.chars() + .enumerate() + .map(|(x, c)| match c { + '#' => MapField::Wall, + '.' => MapField::Empty, + 'O' => MapField::Box, + '@' => { + start_x = x; + start_y = y; + MapField::Empty + } + _ => unreachable!(), + }) + .collect::>() + }) + .collect::>(); + + let mut posx = start_x; + let mut posy = start_y; + + for (dx, dy) in commands + .chars() + .filter_map(|c| match c { + '^' => Some(0), + '>' => Some(1), + 'v' => Some(2), + '<' => Some(3), + _ => None, + }) + .map(|i| DIRECTIONS[i]) + { + let mut i = 1; + let boxes = loop { + match map[posy.checked_add_signed(dy * i).unwrap()] + [posx.checked_add_signed(dx * i).unwrap()] + { + MapField::Empty => break Some(i - 1), + MapField::Wall => break None, + MapField::Box => (), + _ => unreachable!(), + } + i += 1; + }; + + if let Some(boxes) = boxes { + let nextx = posx.checked_add_signed(dx).unwrap(); + let nexty = posy.checked_add_signed(dy).unwrap(); + if boxes > 0 { + map[nexty][nextx] = MapField::Empty; + + map[posy.checked_add_signed(dy * (boxes + 1)).unwrap()] + [posx.checked_add_signed(dx * (boxes + 1)).unwrap()] = MapField::Box; + } + + posx = nextx; + posy = nexty; + } + // dbg!(dx, dy); + // printmap(&map, posx, posy); + } + + let t = map + .iter() + .enumerate() + .flat_map(|(y, l)| { + l.iter() + .enumerate() + .filter(|&(_, f)| matches!(f, MapField::Box)) + .map(move |(x, _)| (x, y)) + .map(|(x, y)| 100 * y + x) + }) + .sum::(); + + println!("{t}"); + + let mut posx = start_x * 2; + let mut posy = start_y; + + let mut map = map_string + .lines() + .enumerate() + .map(|(y, l)| { + l.chars() + .enumerate() + .flat_map(|(x, c)| { + match c { + '#' => [MapField::Wall; 2], + '.' => [MapField::Empty; 2], + 'O' => [MapField::LeftBox, MapField::RightBox], + '@' => { + start_x = x; + start_y = y; + [MapField::Empty; 2] + } + _ => unreachable!(), + } + .into_iter() + }) + .collect::>() + }) + .collect::>(); + + for (dx, dy) in commands + .chars() + .filter_map(|c| match c { + '^' => Some(0), + '>' => Some(1), + 'v' => Some(2), + '<' => Some(3), + _ => None, + }) + .map(|i| DIRECTIONS[i]) + { + if moveable(&map, posx, posy, dx, dy) { + posx = posx.checked_add_signed(dx).unwrap(); + posy = posy.checked_add_signed(dy).unwrap(); + move_box(&mut map, posx, posy, dx, dy); + } + // dbg!(dx, dy); + // printmap(&map, posx, posy); + } + let t = map + .iter() + .enumerate() + .flat_map(|(y, l)| { + l.iter() + .enumerate() + .filter(|&(_, f)| matches!(f, MapField::LeftBox)) + .map(move |(x, _)| (x, y)) + .map(|(x, y)| 100 * y + x) + }) + .sum::(); + + println!("{t}"); +}