summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Wernick <j.wernick@eyeo.com>2022-12-22 15:47:33 +0200
committerJustin Wernick <j.wernick@eyeo.com>2022-12-22 15:47:33 +0200
commit28d21df097a3682d7598e5454ca7d4020cb19ab9 (patch)
treee469f62d15c781758655a07a24b3a1e35b0f8c42
parente7bca77f9bd9f001c9c2dfd9ae48ca764a082325 (diff)
Day 22 part 1
-rw-r--r--2022/inputs/day_22.txt202
-rw-r--r--2022/src/bin/day_22.rs224
2 files changed, 426 insertions, 0 deletions
diff --git a/2022/inputs/day_22.txt b/2022/inputs/day_22.txt
new file mode 100644
index 0000000..2db8042
--- /dev/null
+++ b/2022/inputs/day_22.txt
@@ -0,0 +1,202 @@
+ ..#......#.#..............................##.......#.................##.........#.#............#....
+ ....#........................#......#.................#.#.......##......#........#..#.....#...#..#..
+ ...#..............#..............#........#..#.........##......#..............#................#....
+ .....#..#..............##..#..........#.........#...............................#...................
+ ............#...................#.....................#.......#..........#.#......#.........##.##...
+ ............................#..............................#..............#......#..#.#...........##
+ ..........#......#.........#..........#..................................................#..........
+ .......#...#....................#.........##...#...........#...............###......##....#.........
+ ...#............#...............................###.....##.........................#................
+ .#.................#...............#.........#......#.#.....................#......#................
+ ........#...............................#.......#.....#.##...........#....................#.........
+ ...............#...#.#....##.....#...........#....#........#......#......#......#..#......#.....#...
+ ...##.#.#....#..................#..........#........................#.#............#......#...#..#..
+ ...##....#.....#....#.#................#....#.....#...#.............................................
+ ...#....#............#..#.....#.............#..............#......#..............#.............#....
+ .......#.....#..#....#.........................#..............##...#.#........#.#........##........#
+ .....#..#......#...................#....#.##....#.....##..........#.....#....#.........#............
+ ...................#......#...##..#....................#..............#.#.......#.........#.#......#
+ #..#.............#.....#.........#.............#..........#.##.....#...............#.........#......
+ ............................#............#...............#.......#.#..#............#................
+ .............#.#...#.....#...##...#.........#...#....#............#..........#.#.#............#.....
+ ...................#.......#..........#.........#.............................#..........##.........
+ ...........#.......#............#......#.....#..#.................#...............#.........#.......
+ .#................................#..#.....##..#....#...........#....#...#.........#...........#....
+ ........#...#............................#.#............###..#........#........#......##......#.....
+ ........#.......#..........#.........#.#......................#.......##.......#........##..........
+ #.......#...........#...........................#.......#...............#.#.......#..#..........#...
+ ...............................................#.........................#.#.............###..#....#
+ ........................#...#.....#......#...............................##.....#.......#..#........
+ ..#.......#..#.#...#......................#.........................#........#......#...........#.#.
+ ..#.........#.#....#........###.##..............#....#............#.......#...#...............#.##..
+ .......#.....#................#....#...............#......##.........#...............#...#.#.#......
+ ........#.......................#.....#..........#..........#..#..#................................#
+ ..................#.#..........#....#.......................#....................#...#......#......#
+ .....##......#.................#.............#...........#..#...#........#..........................
+ ..................#.....#.......#.......#..........#...##......#...#.##.................#........#..
+ .........#......#...#....................#..#.....................#...#...........#.........#..#....
+ ....#...........#..................#..#....#................#................#....##................
+ ...#.....#.........#......##...............##.##...#..##..........#.....#..................#........
+ ..#..#.................#......#.......#.........................#.##..#..................#..........
+ .#.......#......##.................#.#........#...#....................................##.........#.
+ .#......#...............#........#.................#..#....#.#...#..#.......#.........#.............
+ .#..#...................#.#..........#.........................#.#.............#..................#.
+ .......####.#.............#..#..................#...#.............##......#..............#..........
+ ............#............#.....#..#..#..........#....................#.#....#.....#.#......##.......
+ .........#..........#.........#.#.....#...................#.....#..#...............#................
+ ........##....................#..........#................................#...#......#..............
+ .#.....#.#....##....#....#....#........#....#...#...............#..................#...........#....
+ ...................#..#.....#.#........#.......#................................#..............#....
+ ..#............#...........................................#.....#..#.........................#.....
+ .#........................#.#..................#..
+ .....#........#.....#...........#.................
+ .........#........................................
+ ..#.#.#.#.....#.............#.....................
+ .......#.#....#.#..............#..................
+ .......................#...#.........#.#..#....#..
+ ...#........#...............#....................#
+ ....................#............#......#.........
+ ........................#........................#
+ ........................................#...#.....
+ ..........#.......................#.........#.....
+ ...........#.......#............#..........#..#...
+ .#............#.................#.#.........#.....
+ ..............#.#.....................#.........#.
+ .............#...#...................#..#.##......
+ ...................#...#..#.......................
+ ...#......#.#................#...................#
+ .............#..#.................................
+ ........#..............#...#.........#............
+ ..##.....................#......##...#.....#......
+ ...#.#.........#...................#.#..#.........
+ .#.....#...................#.....#..........#.#...
+ .............#.............#....#..#.#........#..#
+ .....#.................#..........#...............
+ ....#............#.....##..........#.........#.#..
+ .........#..........#.....................#.......
+ ...#..............................................
+ .............#.#........#...#....#.......#........
+ ..#...#........#.......#..........................
+ ..#.#.............#...#........#...#....#....#....
+ ....##...................#............#...........
+ ..#.#....#.#.##.........##.....#..#.#.............
+ ..#...........#..............#....................
+ ....#.....................#..........#............
+ #..#.##..#.....................................##.
+ .................#...#.........##.................
+ ##.......................#................#.#....#
+ ...#...........#.....##.........................#.
+ ...............#......#...##...............#......
+ ....................#................#............
+ ......##......#......................#.....#......
+ .......#..#.....#............#.#...............#..
+ .....................#....##...........##.........
+ #...........#................#........#...........
+ .....#............#.#.....#....#..................
+ ........................................###.......
+ ........#........................#................
+ .......#.......#......#..........#.....#.#........
+ ...#.....#.#....................##...............#
+ .......#......#....#........#...........#.........
+.#.......#..................#......#..........#................#....#............#......#...........
+#.....#....#...#..............#..#...............#........#......#..................................
+........#.....................#.......#....#..................................#.#......#............
+...#...#.....#..........#.....#...............#.##.........................#..................#.....
+.......................#.##....#....#........#..........................#....#.##........#........#.
+......#...#..............#.....#.......#...............##.......##..................................
+.........................#.#......#................#..#.........#..#......#.#..#..#....#............
+......#...#..#....#...........#.......#.......#...#...#.................#.#.....................#...
+#.............#...#..#.#......#......#..##.#....#..#....#.....#......#..#.......#....#.#.....#......
+..#....#........#..........................#...#..#.#...............................#..........#....
+.#....#..........#...#.....................#.....#....................#..#..........#..........#....
+....#.........................................#.........#.#.#.........#............#..##............
+.....#...#...........#.............#......#....#.................................#.#.............#..
+.#.....#..#..#............#................#.#............................#....................#....
+..............#..........#........#....#...#..........#.#..................#.#........#.......#.....
+.............#..........................#..#..#...#.................#..#...........#............#...
+...................#.............#...#.....##..........#................#.#..#..........#...........
+..##..........#................................#.........................................#..........
+#.............#........................##.#...#....#.............#......#...........................
+.........#........#.......##...........................#...#.....#..................#........##..#..
+#......#..........#...................#......#..........#..................#........#..#............
+....#..................#...#...............#.......#.......#.......#....#..#....#...#............#..
+.....#.#..............#............................#..#......#.#.............#......................
+......#..#......#...........#........#..........##............#...........##........................
+.......#...#.....#.........#.............#..............#..#.......#....................#........##.
+.....#......#...........#.....#.............................#...................#........#..........
+................#..........................#.............#........#.#...........#......#..........#.
+.##.....#..................#.........#........#..#..................##..............#...............
+......#..#...................#.#.#...#..............................#.#..........#..................
+......#.....#........#...................#..............#.#.......................#.....##..........
+.#..#................#......#.#.....#.........................................#.....#..#...........#
+.#............................#.....#.....#...##....#..........#..#......#....#..............#......
+...#........#..#.......#.....................#..........#.....#..............#.......##......###....
+........#.#.#............#..............#..........#........#.....#........#......#.......##........
+........##...#.#.................#......#.........#.#........##.....................................
+#.......#........#.................#...................................#...#........#......#....#...
+.......#...#........#.............#........#.....................#................#..#.......#......
+................#....................................#.....#.....#............#......#....#.......#.
+...#........#...................#..#...#.....#.............#...#.....#.#..........#..............#..
+.....#.............#........#.#.................................#.#..........#......#...............
+.#......#..#..............#..................#..#.#....#.......#................#.........#.....#.#.
+.#.........#..................................................#.....................................
+..#.#..............##.............#...#.....................#..................#.##....#............
+....#.#..........#..................#.......................................#...#...................
+.........#........#.....#......#..#........#..#.#.......#............#..........#...................
+#...##..#.........................#..#......#..........#...........................................#
+#....................................#...#.........................#...#....#......#.#..............
+...#.#...........#..#..#......#..#..............#...........#..............#........................
+.....#.................#..##.........#....#.......#.....##..#....#...................#......#.......
+...........##...#.........................#...............###.......................................
+...........#.#.....#..........#..#......#......#..
+................##...#........#....#.#...#........
+..............................#............#...#..
+.......................#..........................
+.....##......#..................##...........#....
+...................#..........................#...
+.#...............#.........#...#................#.
+..##.....#.#......#......#..............#.........
+....................#........#.#.............#....
+.#......#........#......#.....................#...
+..........................................#.......
+..........#........#.................#............
+........#..........#..#...........#..#.#..........
+.##.............#....................#............
+..........................#.............#.......#.
+#.#...#............#...#.....#.....#........#.....
+#.##......................#..#....................
+.......#..#..#...........................#.......#
+..........#.......#..#.........#.........#.....#..
+.......#.......##..##...................#..#......
+.......................##.........#...............
+..#.....#.......#..................#..............
+........#...#............#....#...............#...
+#.........#...#.......#...............#.#.........
+....#.............#...........#.....#.............
+...................#......#......#....#....#......
+.............#.....#........#.....##...#..........
+.....................##..............#...#....#...
+................#.......#..###....................
+.............#....#..................#.#.....#....
+......#.......#...#.......#.#.....................
+....................##...............#.#.......##.
+.................#.....................#..........
+...........#......#...........#...................
+.........##......#................................
+................................#.........#.......
+..#..............#...#...........#.......#.#...##.
+...............#.....#.....#......#.#.......##..#.
+...........#...#.....##.......#....#..............
+#.............#.............#.....................
+....#........#...............#.#......#.#.........
+...............#....#.......#..............#......
+......................#.................#.........
+......................#.............##..##.....#..
+....#..#......................#.....#.............
+..........#.....#...##..#.........#..........#....
+....#................#........................#...
+....................#...#.#.......................
+....#......#........#.....#..#..#.............#...
+..............##.......#........................##
+
+23R40R49L35R17R7L43R8R11L6R28R8L30L40L28R9R22L2R5L6L6R26R27L37L17L29L9R29L42R29L27R4R26R47R11R6R18R43R15R32L13L39L46L7R30L23R46R40R44L40L28L25L33R28R3R1R43R43R39L15L6L16R26R17L31L39L41L29L16R41R25R48R17R12R35L9R14R47L22L20R24R45R8R35L23L46L39R18R34R25R33L38R15L49R24R22L40L11R3R43L18R2L9R10R13R2R15R16L34L34R43R15R4R40R16R19R16R39L40L37R16L32L13R11R20R25L19L10R29L48L28L38L4L14L12R14R47R18R15L6R20R28L28R8L29L13L7L19L33L48R26R32L34R34R40R8R2L6R20R45R33L36R25R27R27R42L34L17L32L5R13L1R9R34R6L13L36R39L38R13L31R32L40L23L23L26R7R34R2R12L24R39L44L30R2L21L15R15R39R10R23R24R34L50L34L11R6R9R10R50L42L39L20L21R15R10L41R6L50L13L17R23L17R38R18L37L4L14R4R45R36L15R1R37L14L16L19L42R8L35L47R24R20R2L41R35R3R22R6R20R12R38L4R2R29R24R45R8R3L42L14L41R5L35L24L49R25R35L50R1R8R47L28R41R46R20L9L10R17R27L7L15R25L31L7L22R1R31L36R2R14R42R4L48R5L19L39L28L9L36R44L46R42L35L16L41L31R5R14L34R35R3L18R5R7L19L30L13R24L13L15R49R14R31R27L40L27R45L8L19L34R13L43R18R29R4L1L3L2L41R41L7L20R25R33L3L15R15R36R15L33R39R33R36L27R47R6L32R24R8R40R34R3R25L12L49L19L23L21L35L41L32L48R2R46L8L3L10L17L25L8R47R10L40L33L4L21L49R16L48R42L23R45R3R29L50L50R41L9L28L36L22L41L7L4L42L45L21R49R19R18R2L9L42R11R24R38L50R17R30L37L11L22R43R43R27R22R50L22R2L20R40R17L42L19L45R47R45R6R8R22R37L10R24L23R31R43R48L45R2R10R48R8R31L8L36R39L8L44R1L40L44R33L1L2L42L45R5L1L20L47L23L39L6R23L29R45R11L14R10R36R47R6R15R3R22R22L29L10R32L12L40L21L48R47L14R9L26R35R23R1L38L43L26R26L4L48R13L39L3L38R47L45R30L16R43L18R19R3R6L5R16L35L15L45R35L35R2L11R6R50R22L36R8L18R44L19R42R16R45R9R38R8R47R47L10R19L18R14R13R49L29R6R19L40R7L34L7R28L27R31L17R14R28L5R16L48R44L38R33R43R36R28L1L25R28R49R31L31R19R30R50L33L16L49L19R31R5R37R45R47R22R40R43L43R9L33R28R33R17L12R25R33R30L35L34R46R23L2L49L39L10R6L35R24L30L19L41L46R5L35L20L13R32L23R4R34L16R46R9L23L23R26L37R3R47R44L5L43R31R21R36R1L46R18L7L26L34L41L14R35R9L1R18R2R25R9L8L19R44R17L46R10R7R24L18R8L2R7R43L20L30L19R31L1L31R25R25R23L5R44R22L46L46R28R31R30R9R6R18R30L3R19L39L35R13R30L11L38R23R2L24R48R5L3R10R27L48R30R8R40R16L40L37L26L3L15L50R36R15L9L23R29L48R40L6R4L26R25R34L24L38L27R34L10L29L31R23L50R1L49R1R21R26R4R47R32L15L21L34R36R39R9R29R46R29L13L48L17R16R41L21R9R28L4R35L10R23R38R34R22L12L5R43L9L30R27L8L8L21R26L28R38R1R27R10R34R47L6R25L12R48R18R27L22R34L2R42R41L11L12L31R37R39R15L50L50L31L28R1R23R32L6R6L16L12R46R25R34R23L30R48L19R5L23L43R30R31R15L22L19R50L47L48R4R3R8R14L49L15L26R12R17R11R24R17R3L7L23L39L3L35R49R30L26R23L24R29R41R19L12R48L29L14L1L41R28L24L45L12L48L39L30L9R19R16L30R48R37L40L43L12L6L12R16R3L9L36L43L1R22L15R39L17L32R50L10R41L8L29R4R26R8L43R33L46R18R4R22L1R32R39R7R7R18L42L8R45L29R38L3R41L31R21R42L30R36R35L32L4L47L11L26L28L10R8R31L22L1R2L26R27R49R26L13R45L40L42R35L20L28L7L49R8R11L42R47R37R28R6R35R37L27L7R31R24R16R40L40R4R6L30L30L25R37R49L14L37R26R45L5R32L4L36L30L21L45R29L5L42L20R46L11R26L35L41L33R19R41R6L40R11L32L2L38R9R35R25L33R19R25R39R50L38L36L32R41R2L30R21R2R22L7R32R42L36L20R22R32R31R39L43R17L15R13R25R33R27R37R47R35R9L36R32R21R30R30R26L26R25L49R11R23R9L37R5L38R11R46R10L7R33R4R19R29L50R10L20L49R4L16R7L23L12R18L20L42R20L19R45R2L38L23L17L39R29L44L37L33L2L15L45R28R41L29L18R30L35L4R2L17L34R15L20R37L4R24L20R24L46L36L48L32L42R15L22R48R14L43R25R39R44L2L32R30L31L29R22R7L10R17R18R6R50L49L24L19L16R40L14R45L36R37R22R25L28L46L18R36R15L38R39L24L4L4L47R46R5L27L23L28R35R30R11R45L45L17R37L43R40R37R12R43R39L1R40L35L37R30L23L42R37R44R33L39R36L44L50R5L26L4R36L3R48R25R27L45R8L30L23L2R37R35R19R16L8R28R38R35R25L17L49L45R30L17L27L18L2R49L11R44L18R11L24L10L39L32R4L37R26L2R24R11R15R37R18R44R12L8L47L45L39L45R42R3L45R1L37L38R7R31L3R29R21L38L45L33L40R43L11R22R45L48L8L23R22R15R20R15R45L5R39R22L16R17R33R17R4L35R31R35L40L34L48L40R15R4L3L8L16L39L2R39R45R48R20R5R42R12L15R13R4L43L39R22R29R24L42R42R30L26L38L42L33L45L38R21R1R4L13R37R29R22L35L35L27L30L7R31L9R13R2L30L33R15L47R12L11R44L10L29L39R29R29R34R31L15R9R38L3L19L30R10L13R22L3L9R12R49L45L28R38L19L13L24L23R48R24L3L30R48R30R9L48L41R48R36R26L42R28L50L20L43L43L46R7L4R25L5L5L50L35L48L9L38R16R4R28R34R34R45R32R15R48R9L44L14R17L43R49L20R1R1L4L15L23L39R3R46R2R36R18L20R11L41R18R40L18R20R40L22R11R28L45L18R24R18R11L22R47R8R29L50R31R9R40L18L44R18R7L24L34R48R8R26L7L47L46R22L39L14L37L22L27L4R48R14R6L16L27R42R17R35R15L6R50L33R43R44L10R27L14L18R2R20L25L45R40R47L29L35R45L41L26R23R26R16L48R3L17L26R19L5L7R35L4R25R6L42L20R13L45R5R41R15L6L5R28L23R3L29R49R25R41R44L16R23L26R39R22L45R2R13R32L47R49R2R41L3R16L2L37R9L48R43R28R42R27L50R5R33L24L13L39R39R35R47R41L20R25R41R22R44L42R10R9L36L45L47L21L2L30R22R6R34L7L38L42R2L39R17L14R5L33R46L40R36R50L10R2L17R22R45L42R37R24R45R32L50R37L38L14R24R7L17R33R11L32R22L11L22R40R26L28R15L44R48R32R17R17R46L22R41R6L12L47L5R32R41L34L25R47L14R44R43L7R28L21L14L41R47L49L14L49R1R4R35L49L32L21R20L12R45R7R22L1R36R14R39R43R16R13R10L28R6R37L7L40L7R50R50R16R36L10R6R4R39R50R50L28R29L40R15L22R22R27R32R27R47L40R24L39L11L11L43R25L18R26R42R35R18R2R10L17L41R47R25L37L29R20R29L12R28R14R27R10L15R3L45R20R27R3L29L31L14R15L27R3R24L21R27R11R44R15L29L17R24R35L48R47R47L7L22L19L28R35R10L50R9R16L50R19L46L46L17R45R11R3R29L34L28L43R26L21L10L38R8L33R36L8L14R49L2L7R4R50R6L2R39L24L4R15L34L12L3R17R10L22R40L22L38R45L35L18R38L3R21R4R5L38R21L5R1L25L2R46L45L40R40L19L13L29R19L49R21R47L27L23R24L28R9R12R36L36L31L35R5L43R5R13R25L24L27L31R11R44L29R16R34R31L1L15R21L47L36R6L30R3L2L49L12R27R32R2L27R50L36R15L32L4L29R29L40R30R28L30R22R38R25R24L15L4L6R13L21R31R20L17R38R27R42R34L18R22R22R17R37L15L6R45R25R13R17L41L7R32L17L24L50L3L49R2L47L21L32R23R27R49L1R19L16R28L38L17L48L47R45L43L19R42R7R21L35R18R35R31L4R1L46R6R24R43R33L37L8L32L43R42L17L41R9R36L15L40L12R36R50L37R45L12R25R38R49R7L19R46L45L10R32L15L45L3L24L48L14L5R30R46L31L20L45L41R36R17R23R43L32R1R10L41R22R43R37L35L32R6R12R35R5L14R23R37L45L50R28L17R17R18L33R13L18
diff --git a/2022/src/bin/day_22.rs b/2022/src/bin/day_22.rs
new file mode 100644
index 0000000..693164d
--- /dev/null
+++ b/2022/src/bin/day_22.rs
@@ -0,0 +1,224 @@
+use nom::{
+ branch::alt,
+ bytes::complete::tag,
+ character::complete::{line_ending, u32},
+ combinator::{map, value},
+ multi::{many1, separated_list1},
+ sequence::tuple,
+ IResult,
+};
+use std::fs;
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+ let input = fs::read_to_string("inputs/day_22.txt")?;
+ let parsed = Input::parser(&input).unwrap().1;
+
+ dbg!(State::walk_the_map(&parsed));
+ dbg!(State::walk_the_map(&parsed).score());
+
+ Ok(())
+}
+
+#[derive(Debug, Clone)]
+struct Input {
+ map: Map,
+ instructions: Vec<Instruction>,
+}
+
+#[derive(Debug, Clone)]
+struct Map(Vec<Vec<MapPoint>>);
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+enum MapPoint {
+ Wall,
+ Empty,
+ Void,
+}
+
+#[derive(Debug, Clone)]
+enum Instruction {
+ TurnLeft,
+ TurnRight,
+ Walk(u32),
+}
+
+impl Input {
+ fn parser(input: &str) -> IResult<&str, Self> {
+ map(
+ tuple((
+ Map::parser,
+ line_ending,
+ line_ending,
+ many1(Instruction::parser),
+ )),
+ |(map, _, _, instructions)| Input { map, instructions },
+ )(input)
+ }
+}
+
+impl Map {
+ fn parser(input: &str) -> IResult<&str, Self> {
+ map(separated_list1(line_ending, many1(MapPoint::parser)), Map)(input)
+ }
+}
+
+impl MapPoint {
+ fn parser(input: &str) -> IResult<&str, Self> {
+ alt((
+ value(MapPoint::Wall, tag("#")),
+ value(MapPoint::Empty, tag(".")),
+ value(MapPoint::Void, tag(" ")),
+ ))(input)
+ }
+}
+
+impl Instruction {
+ fn parser(input: &str) -> IResult<&str, Self> {
+ alt((
+ value(Instruction::TurnLeft, tag("L")),
+ value(Instruction::TurnRight, tag("R")),
+ map(u32, Instruction::Walk),
+ ))(input)
+ }
+}
+
+#[derive(Debug, Clone)]
+struct State {
+ position: Point,
+ facing: Direction,
+}
+
+#[derive(Debug, Clone)]
+struct Point {
+ x: usize,
+ y: usize,
+}
+
+#[derive(Debug, Clone)]
+enum Direction {
+ Right,
+ Down,
+ Left,
+ Up,
+}
+
+impl State {
+ fn walk_the_map(input: &Input) -> State {
+ let mut state = State::spawn(&input.map);
+ for instruction in &input.instructions {
+ state.process_instruction(&input.map, &instruction);
+ dbg!((&instruction, &state));
+ }
+ state
+ }
+
+ fn spawn(map: &Map) -> State {
+ let y = 0;
+ let x = map.0[y].iter().position(|p| p == &MapPoint::Empty).unwrap();
+ State {
+ position: Point { x, y },
+ facing: Direction::Right,
+ }
+ }
+
+ fn process_instruction(&mut self, map: &Map, instruction: &Instruction) {
+ match instruction {
+ Instruction::TurnLeft => {
+ self.facing = self.facing.spin_left();
+ }
+ Instruction::TurnRight => {
+ self.facing = self.facing.spin_right();
+ }
+ Instruction::Walk(amount) => {
+ for _ in 0..*amount {
+ let mut next_point = self.position.clone();
+
+ let mut made_a_step = false;
+ let mut hit_a_wall = false;
+ while !made_a_step && !hit_a_wall {
+ let peek = match self.facing {
+ Direction::Right => Point {
+ x: if next_point.x < map.0[next_point.y].len() - 1 {
+ next_point.x + 1
+ } else {
+ 0
+ },
+ ..next_point
+ },
+ Direction::Left => Point {
+ x: if next_point.x > 0 {
+ next_point.x - 1
+ } else {
+ map.0[next_point.y].len() - 1
+ },
+ ..next_point
+ },
+ Direction::Down => Point {
+ y: if next_point.y < map.0.len() - 1 {
+ next_point.y + 1
+ } else {
+ 0
+ },
+ ..next_point
+ },
+ Direction::Up => Point {
+ y: if next_point.y > 0 {
+ next_point.y - 1
+ } else {
+ map.0.len() - 1
+ },
+ ..next_point
+ },
+ };
+
+ let peek_value = map.0[peek.y].get(peek.x);
+ match peek_value {
+ Some(MapPoint::Empty) => {
+ next_point = peek;
+ made_a_step = true;
+ }
+ Some(MapPoint::Void) | None => {
+ next_point = peek;
+ }
+ Some(MapPoint::Wall) => {
+ hit_a_wall = true;
+ }
+ }
+ }
+
+ if !hit_a_wall {
+ self.position = next_point;
+ }
+ }
+ }
+ }
+ }
+
+ fn score(&self) -> usize {
+ (self.position.y + 1) * 1000 + (self.position.x + 1) * 4 + self.facing.score()
+ }
+}
+
+impl Direction {
+ fn spin_left(&self) -> Direction {
+ match self {
+ Direction::Right => Direction::Up,
+ Direction::Down => Direction::Right,
+ Direction::Left => Direction::Down,
+ Direction::Up => Direction::Left,
+ }
+ }
+
+ fn spin_right(&self) -> Direction {
+ self.spin_left().spin_left().spin_left()
+ }
+
+ fn score(&self) -> usize {
+ match self {
+ Direction::Right => 0,
+ Direction::Down => 1,
+ Direction::Left => 2,
+ Direction::Up => 3,
+ }
+ }
+}