adventofcode2022

My solutions for Advent of Code 2022
Log | Files | Refs

commit 39668b814c452e98622924c314bca65bfaff5aa8
parent 702ea36107882b4d56a497bf0c1abba77d066d4c
Author: Lukas Henkel <lh@entf.net>
Date:   Thu, 22 Dec 2022 13:04:15 +0100

Day 22 task 1

Diffstat:
Madventofcode2022.asd | 6++++--
Ainput/day22.txt | 202+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/day22.lisp | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
At/day22.lisp | 23+++++++++++++++++++++++
4 files changed, 341 insertions(+), 2 deletions(-)

diff --git a/adventofcode2022.asd b/adventofcode2022.asd @@ -32,7 +32,8 @@ (:file "day18") (:file "day19") (:file "day20") - (:file "day21"))) + (:file "day21") + (:file "day22"))) (defsystem "adventofcode2022/test" :description "My solutions to the advent of code 2022" @@ -63,4 +64,5 @@ (:file "day18") (:file "day19") (:file "day20") - (:file "day21"))) + (:file "day21") + (:file "day22"))) diff --git a/input/day22.txt b/input/day22.txt @@ -0,0 +1,202 @@ + ..........#..................#...........#.................#......#..................#...........#.. + .........................#.......#.....#..............................#...........#.......#......... + .................#...............#.#....#.........#................#...##.....#...........#......... + .#........##........#..................#...........................#.##...............#............. + .....#..#.....#.....................#.................#...#...#.#........##...........#............. + .##.#...............#......#..#.....#.........#..............#..............#.......#............#.. + .#..#.....#..........................................#......#......#......#..#........#.#........... + ......#.#.#.......#...........#...#....#...#......#......#............................#..#.......... + .......#...........#.....#...........#....#..#..#.........#......................................... + ........##.....#................#........#..........#..........##....#......#...#.#.....#........... + .................#.............#............#.............##.....#..............#...#........#...... + #............................................#................#......................#.............. + .................##....................#...#.....#................#......#.#..#....#.............#.# + ...........#...#............#.........##........#...##..........................#.#................# + ....#.............#...............#...#......#........##....#........#...#..........#...##.......... + ..#..#..#.............................#........................#...................................# + .#............................................#......#....#........#....................#.......#... + ................#.#.....................#..........#..............#..#....#.#.#..................... + .#....................#.#..............................#..................#...#....#................ + ............#.........................................##.#..............#..........................# + ...#..#.....#.#...#......#.....#..........#............#............................................ + ............#...#.......#...........................#....#........................#.......#......... + ..#..........#....#.....#...................#.............................#.#.#...............##..#. + ...............................#.#...##............#.....##..#.#.................................... + .........#......#......#.....#..#.......................#.#........#..#....#......##................ + ......#...........#............#.......#.#....#...............##.......#..........#................. + ................#......#..#...#...#............#...##...#...#...........##.....#........#.....#..... + .......................#.#....#..................#.................#.#.#...................#........ + ................#....#..............#..#..#....#.......#................#.......................#... + ............#..#.....##...#..........#.......#.........#.................#.....#........#.........#. + ..#.......................#.........#..........##............#...#.........................#........ + ...#......#.........#...............................#..................#.....................#...... + .........#...............#.#.................#....#.....#...............#.#......................... + .#...........#................#..#...............#............#.....#...................#.....##..#. + ..#.#.................#.#..........#.....#......#...........##..#................................... + .#....##.#...............#...........#............................#..........#.............#......#. + #................#.................#......###...........................#...........#....#.......#.. + ................................................#.....................#..#.........#.......##....... + ......#.........................#..#......#......#........................#.....#.#............#.... + ....#..........................#...........................#.#...........#..................#....... + ....................#..........#....#..........##...............##.....#.........##..........#...... + .#..................#.............#.....#.#..#.#.........#.......................................... + ..#.........#...##.........#...............#................#..............#................##...... + .#...#.........#...............#....#..#......#...##............#..#...#...........#................ + #......#..#...........#..................#...#.....#.#.......#......................#.#.#..#........ + #..#..................#....#....................................#.............#......##..........#.. + ............................................#.............#..#......#.........#........#............ + #........#................#......#..###.#................#.........................#................ + ...#...#..........#........#....#.#...........##.............##........#......#.............##...... + ..................#....#.............................#..#............................#......#......# + ...#...............#......#....#...#..#........... + .......##.......#...###.......#.........#.......#. + ...........#...................#.#....#......#.... + .........#.................#....#...#.#..........# + ..........#.....#............#.............#...... + ..#............................#.......#.........# + .............#.....##..............#..#........... + ............#.#....#...#.#.##.#...............#... + ........................#................##......# + ......#......................................#.... + ....................#......##....#.#.............. + #........#........#.#................#..#......... + ............................#.#.........#..#...... + #..........#..................#.......#.#..#...... + #...#...#..#.#.....#.#....#....................#.. + ................#....................#............ + ..........#.................................#..... + ...#....###........................#.............. + ..................#....#.........#................ + .......###...................#...#....#........... + ..............#.................#...#........#.... + ..........................#....................... + ...#..........................#................... + ..#...##.................................#.....#.. + ...........#..............#....................#.. + ....#..#............................#............. + ..#....#...........#.#........................#... + .....#......#..###..........#...#..........#...... + .#.......#...............#..#..............#...... + ...#....#......#........#..#.#..#.#............... + ..#..#..........#..#...#....##............#..#.... + ........#......#...............#........#.#....... + .....#...........##...#..........#..#.......#..... + ...........#......#.......#...........#....#...... + .#........#.......................#...#........... + ..........#............##.....#......#....#..##... + ........#............#.#.......................#.. + ..#..................#............................ + ...............................#.#.#....#.#.#..... + ................#.#......#.#...................#.. + ...#...#.#..#.........#.................#......... + .................#....#........#..##.............. + #...................#............#....#....#...... + .................................................. + .........#......#......#...............#.......... + ......#.........#.#....#....................#.#... + ....#..........#..##..................#......#.... + ..............................#......#............ + #.......#.............#............#.............. + ...................##.....###.................#... +...................#....#.......#....#.##.#..#.#..#............................#....##.............. +........#.#........#..#.....#.....#..........#.#....#.............#..#.............................. +...#...................#.#......#....................#..........................#................... +.....................#...........#.......................#..........................##..#..#...#.... +........................#.......................#......#.................#..........#...........#... +.......#...................##..........#..........#.........#.....#...............#....##.#......... +............#..#.......#..#...##..........#....#...#..#............#............#..#.#....#...#....# +....#.#....#...........#....#...................#.............................#..................#.. +.....................................#.#.........#........#.....#.##....#................#....#...## +....#.#.......#......#..#..............#.#...............##......#.............#................#... +.#......#........................#........#...#...............#......#...................#..#....... +......#........##.........#....##........#.....#.......#......#...........#.......#................. +......#.#........#.....#.......##...##.#..........#.....#..........#..............##...#.......#.... +...#...#..#........#......##................#...#.......#........##.....#.......#................... +.......##.#..#............#.............##..................#........#..........#........#.......... +..#.......#.......#.........#.....#.........#..#.....#...........#....#.......#.#................... +.......#...........#........#.........................#......#...#..#............................... +#...#.............##.........................#..#..................#...#..............#...##........ +.................##...............................................#................................. +......##..............#...##..#.....#......#..........##............#..#......#.....#...#...#....... +...#............#..............#................#..#.......................#.#..##.#..#............. +.........##........##...........#...........................#......#...#.......#.....#......#....... +......#...............#.#...........#....#..#.#.#....................#........#...#........#..##.... +...#.............#.......................................................#..............#...##..##.. +....#.............#..........................#...........#..#.#...............................#..... +..........#.#.......#......................#.............#.....#.............#...............#...... +...............##........#....#.#......................................................#............ +...........................#.....#..........#..........#.#.................#.#...#.......#....#..... +.....#...............#..........#.#....................#..................#.............#........... +......#.#.....#....#...#............#..........#.............#........#..............#.............. +.........#.......#...........................#...#...............#......#.#......#....#.#..##..#.... +....#.#....#...#...#.............##..#....#.......#.....#.#.........#......#..........#...##........ +.....#.............#.#.............................#.........................#...........#.......... +...#.....#............................#....#.................#......#..#.........................#.. +#....#....#..........#......................#...#..........................##.............#......#.. +.......................#..............#............#................#...#.......#.............#..... +...#.................#........#.................#.....#....................#........................ +............#.#...##...............#..#........#..............#.....#..#...##.........#............. +....#...#..............##....#.................#..#..#.......#.#..#................................. +.............#.#........................#..........................#......#...#..................... +..................#.........................#................#...#..........#....................#.. +.........#...........#............#..........#...............#..................#.........#.....#.#. +.............#.....................#....................#....#.................................#.... +...............#......#...#..#....#..#.........#............#........................#.#....#.....#. +.........##................#........................#.........#............#..#..#..#...........#... +.#...##.#..........#....#..#.....#..........##......#.##...............#.................#.#........ +..#...#......#.....#.#.......##...#.......#..............................#..#.#..#.................. +...................##..##.....#.#....#..........##...#..#.#.......###.#.....#.......#...#........... +....#....#................##.#...###....#....#....................................................#. +#.#........#.......##...................#.#...........#.................#.....#.................##.. +..............#..........#........................ +...#..#.......#..............................#..#. +..............#....##.....................#...#.#. +......#.....#..........##.#.##..#...#.......#..... +.........................#...............#.#...... +..#..............#.##.......#...#....#...#......#. +.......................#..............#........... +...#...........#.....##.#..##..#...#......#..#.... +.#..............#..........#...............#...... +.......#..........#..#.........#....#............. +.....#..#......#..........###............#........ +................#......#....#...............#..... +................#.........#..............#.....#.. +...................#..............#.......#....... +...........#....................#.....#..#........ +..............#....................#...........#.. +..#......#..............................#......... +........................................#........# +.....#....#..........#.......#.................... +....#......##..............#..........#........... +...............#....##....#....#.....#.#......#... +.................................................. +...................##..........................#.. +..#.......#......#...#..#......................#.. +......#...##.......#.#...........#................ +#.......................#....................#.... +...#...#..................#...#......#............ +#..#..............#....#......#.........#..#...... +.#.......................#...........#..#......... +.......#.....#...#.....#..........#.#...#......... +#..#....................................#...##.... +.............................#....#.#........#.... +.................................................# +....#....#..............#.....#..................# +..#...........#.#........................#.#...... +...........................#.......#..#....##....# +.............#....................##..#........... +...#...................#.......................#.. +........#............##.................#...#..... +........#.....................................#... +.....#.................................#..#....... +.#.................##..........#.......#..#....... +...................#........#.............#.#..... +.........#.....#.................................. +..................#.....#......................... +........#.#....................................... +....#...##........#....#......##.....#...#..#..#.. +............#.#.#...........................#..... +............#......#..#.......#.....##........#..# +......#.........#...#....#........................ + +16L3L21R23R30R5L5R46R14R33R20L39R5R27L14L21L44L35R39R9L11L19R50R34R7R43R29R21R7R13L6R18L19L45R50L27R29L4L35L39R14L19L31R39R50L14L7R30R43L12R18R2L19L28R9L28L26R29R9L21L11R22R3R41L27R6R47L31R26L48R34L11L25R1R20R30R26L20R10R14L40L33R41L10R5R24R19L36R2R22L41L16R12R36R3L50R3L1L38R15L40L3L47L2R41R15L7L43R30R20R1L13L17R14L16L35R41L6L16R19R40R16L23L25L33L32L22L34L42R36R16R13L9L21R22L44L10L25L21L36R42R10L44L31R10R39R36R36R32L2R1L10R11R11L39R26L25L46R38L5L43L16L2L29R44L28R16L29R49R36R40L12L44L43L11R7L46L28L45R5L21R11R50R40R30R35R9R28L2L24R16L23R13L18R17L15R35L20L49L34R15L17R39R47R15L32R24R43L2R8L12L1R50R2L24L21R31R19R41R10L31L24L12L33R24R16R17L9L24R21L36R17R42L35L2L34R27R10R9R1R11L2R27L43L46R35L8L41R11R42R5R20L44L35L21L15R32L34R38R37R42L4R14L16R40L6L2L41L11R4R3R10L48R35R1R17R7R32L44L31R37R33R8L34R3L6R7R50R13R50R7R29R6L29L47R17R12R2L32L22L33R22L37L32L14L43L32L3R8L23R44L28L12L40L42R33L36R42L28R42R7R14R13L44R30R33R33L34L20L28L9L5R30L7L23R48L41L49L34R1R18R44R50L18L5L7L39R37L28L12R35R8L30L34R43R12L44L45R29R45R27R4R35R26R14R42R4L50L7R7R27R32L28L9R18R26L47R17L40R3L31R11R32R27L39R20R25R33L34R3R39R3L46R15R22L43L31L31L21R44R12L46L41L42R43L29L11R34L36R48L28L40R32R46R41R4R25L39L44R43L39L43L9L47R49L22L33L47L42R33L39R28R18L40L30R26R35R11L48L45R2R37R17R30R36R27L39L46L48L40L7R43R6R40R40R30R45R35L26R45L6R11L33R15L3R32R2L12R10L2R30L24R40R11L14L16R10L25R3R49L7R29L33L34R19L22L11L14R14R45R22R1L38L47L44R32L24L19R9R2R38R14L11L42R3R29L34R50L39R39R15R46L1L23L46L24L33R37L14L20R8L28L26R46L13L15R40L26R48L9L50R36R45L43R46R37R5R34L33L3R49R27L36L27L21L1L35R37R18L41L5R46L10R2L17R36L49R18R44R31R35L34L37L7R11R14L45R37L44L25L50R41L36R48L36R5R38L24R28R46L22L42L13L44L12L49L47L44L44L37L22R2L49L20R23R50L46R33R36L41L27L29R17L13R9L22L40L13R19L21L27L7L46R11L13R14R49L6L6R42L24L44L38R10R13L33L42L33R11R3R1L24R17R49R23R44R3L43R39R47L46R34R1L17L23R50R14R4L50L6L43R14R10L29R12R45L48R28R13R18R13R50L14R38L37L17R49R3R44L16L6L36L45R20L46R21R22R31L7L27L49R44L5R17L40L34L2R40L3L12L7R32R8R12L46R40R37L9L10L22R30R45L30L9R40L28L13R46R4R38R24R43L8R47R39R18R12R1R43L46L11L17R21L48L19R48R33R26L27R24L12R34R31L41R14R40R4L25R34R36L47L29R13L45L5L12L2R32L29R39L42R34R7L47L23L31R13R47R8L25L17R29R20L25R42R42R28L48R37L48R25R5R30R7R25L16R37R50L39R26L19R48L2L47L48L21R3L49L43L6L40R14R25L13R42L39L1R40L35R5L43R5R42R5L31L2R10R42R23R4R17R41L5R50R41L19R12L42R41R42R2L27L39R36R44L48L19R7R26L29R19L16L32L47L5L47R39L22L32L45L36L14L27R21L47R47L34R9R43R19R30R4R41L11L24L37R24L28L31L33R6L7L34R4L26L4L31L44R22R4R36L20L36R7R48R2L39R28L15R44R18L10L23L31R45L30L3L14R11L1R22L38L11R48R10R13L27L24R34R15R18R47L40L41R23R45L17R21L29L45L39L25L28L21L31R28L26R49L17R21L7R31R24L29R6R29R23R20R9L35L28L44R28L34R32R26L42L34R22R34R38L50R11R47L11R18L43R29R30R22L41L46L36R10R5R16L41L27R28L8L6L13L5L11R30R38L29R15L15R48L2R41L2R45L25L32R13L8L1L33R45R42R1R42L24L41L24R3R38R22R7L10L22R15L18L31L48L26R3R11R23L15R3L36L20R44L13L19R43R23R41L47L41L5R10L28R44R26R50L35L3L18L22L1R8R25R27R7L41L31R13R39R5R14R12L4R22R48R11L26R10L24L48R45L2R41R4R46L19R24R44L8R44R22R40R19L39L9R7R39L46L38L10R1R22R37L36L47R40R31L38L16L6R13R20L39L35R1R46L34R42L14R50L46L4L38R14L36L13L36L23R10L45L28L43R15L33L10L10L8R49L40R29R29L12R10R47L14L36R12R1L10L6L31L6L35R2L23L28L46R9R13L14R16R29R41L31L3R25L31R3R16R18R10R42L27L10R42L2R19L18L42L7L22L45L47R9R24R46L6L4L16L8R26R36R26L42R43R6L39L19L16R47R40L21L33R21L49L14R45R42L31L1L27R22L6L45L37R46R32R48R17L25L2R29L49R27R41L22L11L5R25L30L13R23R8R15L2L21R33L8L25R27R22L20L10R27L7R4R39R42R28L6L32L16R20L21L15R26R25R15R32L32R10R39L19R11R37R29L3L48L45R48R37L45L42R38L49L46R16R20R33R11L12L2L29R40R33L25R49R6R40R46R10L36L38R31R23L4L25R10L35L10R25R27L22R6R19L26L26L22R18R30R38R29L19R7R7R4L10R44R9R24L2R5R39L40L48R46R48R31L6R44R28L33L43R2R9R41R10R4L28L10R47L16L10L14L24R49L14L34R26R25L47L30R46R44L35L46R42L38R13R45R17R25L36R36L17R37L30L21L30L47L37R34R14R23L15R19L22R49L44R2L1R10R30L36L47R38R34L42R9L2L11R26R31L46R30R20L48R1R43L36L29L47R33R3L41L41L3R37L11R11R40L26L28R37R18R3R16R8L1L27L24L9L37R37L46R2L18L21L10L35R22L30R42R49R9R39R3R47L2R24R41R35R13R25L26L20L14R39R50L3L49R45L45R3R41L7R43L49R12R22L10R30R11R11L42R35L46R22L44R9L25L26L27L28R26R41L6R25L17L3R45L3R30L38L31L21R38R14R2R33L20L32R4L17R34L13L18R33L10L44R47R8L31R27L22L46R33R22R43L20L44R35L25L25R21L1L22L6R30R33L31L27R45L23L35R16L22R24L1R30R49L24L17R13L11L1L2R30R38L15L15L35R14L34R30R48R42L12R27R3L41R5R13L32L46R32L17R7L5R28L15L5L8L42L33L29L24L33R18L19R10L26L6R28L42R7R18R46L26R11R31R3R17L5R5L40L13L28R2L50R7L8L33L15L12L27L3L1L5L50R3R16R20R41R12R24L42R29L31R39L47R4L10R7L37L36L13R12R4R34R43L31L16R12L46R6R50L13R37R30L30R17L1L22R26R7L25L8R5R13R21L50R23R22R6L50L33L24L15L13L46R18R27L12L8L28R1L23R34R7R36R5L48L37L50R30R38R28R16L34L26R48R39L29R25R44R25L38R27R33L6L15R45L48L20R46L33L29R43L42L9R21R33L47R18L27L32R32L29L22R35L49R50R42R39R38R43R35L33R45R32L40R7L11L12R50L24R5L19R26L24L10L33R8R9L14R19L47R31R39L19R45R26L21L29L34L39R49L25R40L29R28L8L20L28R36L1L39R45R17L37R29R25L2L19L23R12L18R11R40R15L13R19R19L3R41L45R15R2R4R22R1L18R50R38R1L48L14L6L7L24L23R24R29R37L34R32R36R40L6L22L44R14R9L37L29R34L28R39R12L23R40R47R25L6L16R13L23R11L50L27L24R34R40R22R39R8R44R13R15L42R3R30R6R22R37R43R34L46R1R5L36R30L18R48L25L50R23R29R11L28L48R40L2L34R35L34L46L2L32L50L16R28R18R27L18R11R27L5L33L36R15R5L41L4R27R37L14R27L21R49R20R48R37L37L23R39L21R31R26L20L15R19L37R38R12L29L6L50R16L28L50L47L1R28R44R47R42R44L18R13R39L27R26L34R7R27L27R2R5L32L23R31R43R39R38R28L29R8R39L45R37L13L28L3R33L33L15L31R46R20R1R19L20R39L45R9R13L45L14L10R4L43L40R19R29L38L20R18L35L35L48L36R28L23R39L15L41L34R16L44L17R11R47R3R21R38L7R8R33L28R7R37R24R5R41R42L38L28R14R4R31R33L8R11L6L17R4R38R3L17L16R5R22R42L14R27R25L7L39L50L50R2L32R14R45L13L19R50R45R45L42L26R13L42R26R24L41R39R23R1L31R4L13R44L32R14R38R42R14L40R21R14R38L34L2L14R31 diff --git a/src/day22.lisp b/src/day22.lisp @@ -0,0 +1,112 @@ +(defpackage #:adventofcode2022/day22 + (:use #:cl #:adventofcode2022)) +(in-package #:adventofcode2022/day22) + +(defun turn (facing direction) + (mod + (+ facing + (case direction + (:left -1) + (:right 1) + (otherwise 0))) + 4)) + +(defun walk (coords facing) + (let ((x (car coords)) + (y (cadr coords))) + (case facing + (0 (list (1+ x) y)) + (1 (list x (1+ y))) + (2 (list (1- x) y)) + (3 (list x (1- y)))))) + +(defun parse-input (inputs) + (loop with map = (make-hash-table :test 'equal) + with last-line? = nil + with min-x = nil + for line in inputs + for length = (length line) + for y from 0 + when last-line? + return (values + map + (loop with start = 0 + with results = nil + for i from 0 + while (< i length) + for char = (aref line i) + if (not (digit-char-p char)) + do (push (parse-integer (subseq line start i)) results) + and do (push (case char (#\R :right) (#\L :left)) results) + and do (setf start (1+ i)) + finally (push (parse-integer (subseq line start i)) results) + finally (return (nreverse results))) + (list min-x 0)) + when (= length 0) + do (setf last-line? t) + do (loop for x from 0 below length + for char = (aref line x) + for type = (case (aref line x) + (#\# :wall) + (#\. :empty) + (otherwise nil)) + when (and (= y 0) + (eq type :empty) + (or (null min-x) + (< x min-x))) + do (setf min-x x) + when type + do (setf (gethash (list x y) map) type)))) + +(defun wrap-around (map pos last-pos) + (let ((x (car pos)) + (y (cadr pos))) + (if (= y (cadr last-pos)) + (list + (if (> x (car last-pos)) + (loop for i from 0 + for tile = (gethash (list i y) map) + when tile + return i) + (loop for i from (car last-pos) + for (tile exists) = (multiple-value-list (gethash (list i y) map)) + while exists + maximize i)) + y) + (list + x + (if (> y (cadr last-pos)) + (loop for i from 0 + for tile = (gethash (list x i) map) + when tile + return i) + (loop for i from (1+ y) + for tile = (gethash (list x i) map) + while tile + maximize i)))))) + +(defun task1 (inputs) + (multiple-value-bind (map directions start-pos) + (parse-input inputs) + (loop with facing = 0 + with current-pos = start-pos + for direction in directions + if (numberp direction) + do (loop repeat direction + for next-coord = (walk current-pos facing) + for next-tile = (gethash next-coord map) + when (null next-tile) + do (setf next-coord (wrap-around map next-coord current-pos)) + and do (setf next-tile (gethash next-coord map)) + never (eq next-tile :wall) + do (setf current-pos next-coord)) + else + do (setf facing (turn facing direction)) + finally (return (+ (* 1000 (1+ (cadr current-pos))) + (* 4 (1+ (car current-pos))) + facing))))) + +(define-day 22 + () + #'task1 + nil) diff --git a/t/day22.lisp b/t/day22.lisp @@ -0,0 +1,23 @@ +(in-package #:adventofcode2022/test) + +(define-constant +testdata-day22+ " ...# + .#.. + #... + .... +...#.......# +........#... +..#....#.... +..........#. + ...#.... + .....#.. + .#...... + ......#. + +10R5L5R10L4R5L5" + :test 'equal) + +(def-test day22-task1 () + (is-true + (= 6032 + (run-task 22 1 + (make-string-input-stream +testdata-day22+)))))