adventofcode

git clone https://git.ce9e.org/adventofcode.git

commit
e7b58347219ac81c3dc2b21708d183a04ec3d702
parent
9b219db14f5b120c9dc668c294450954ebda5628
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-12-16 11:47
2023-12-16

Diffstat

A 2023/16/input.txt 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/16/solution.rs 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/16/test.txt 10 ++++++++++

3 files changed, 267 insertions, 0 deletions


diff --git a/2023/16/input.txt b/2023/16/input.txt

@@ -0,0 +1,110 @@
   -1     1 \.........-......|...../................................-...........|.../.\\...\|...................|.........
   -1     2 ../..\...............-../............\.........-......-................././........|......................|...
   -1     3 ......../..-........../................../...|.....-......................\.....-..............|............/|
   -1     4 ......-......-............................\..\............../................./.-.................\.....|.\|..
   -1     5 ...-....-|....................-...-..../...................-....../...........|.............\.....-...........
   -1     6 ..\............../..../................|...........|/......|..........-\.........|...../....................|.
   -1     7 \...........\.\....../...|..........--.................|......//...../..-.....|.....-.........................
   -1     8 ..................................................|...........\.\.................../.....................\...
   -1     9 .....-...................-............./.......................|............/...|..........................-..
   -1    10 ..............-......\..............\................................-.|../................|....|../\....|....
   -1    11 ./../\..............-..............|.........................|\................................|.-./.....|....
   -1    12 ..........\....-................./........../............../........\-..........\....-........................
   -1    13 .........-....../.............\../-......-.............\........\......./......-|..\.........\............-...
   -1    14 ......-....|.......|.............................\..-.............\......-......................|......|......
   -1    15 ....\......../.............................||....-.............-.........................\........../.........
   -1    16 ........-......................................................\.........../...|./............-|..............
   -1    17 ......\..-........|./..................\../....|.........-\...-..-....\...-................\..................
   -1    18 |./.....\.-......../.-|.............\..\.\......-.|............/.|..\|....................../.................
   -1    19 ................................../..-........\.\..|.-..|/...-...............-............\........-..../.....
   -1    20 .......|............\../......\...../.......................|........|...-.|...\...-....\......|..............
   -1    21 .................-......./........../.......|/........|....-\........../..............-................../....
   -1    22 ..../...................-..\.........|................../..|.../...............|-\............../.............
   -1    23 .............................|....../............................|..|.........../....../....-.|..||....\......
   -1    24 .....//.........\..........\.|...-./.......|.-..\...\.......\.-.............../.....|..............-.|........
   -1    25 .-...........\.\..........\|..\.....\.|...........--.............\.....-./.......\................../.........
   -1    26 ............\....................................\.......-....../.....\....../....-.....................-.....
   -1    27 \.......\...-.|......./\..|...\......|......../.....-.....|......./................./.........../.............
   -1    28 /.|.....................................................\./.........\...|......|.......................|./..-.
   -1    29 ....|............./....\...-.\...../.......\.................|.............|......\..../.../..\...........\...
   -1    30 ..........................|...........|.../............\..\....\............-|...................\.../......\.
   -1    31 .......|\.\............./...../.......././..../.....-..|...\.......|..........\............/-.................
   -1    32 .|\....|.....-.-......\-..........\.....................\...........................-...|.....|..-...........|
   -1    33 /\......|....-.............................-/....|..|........./.........................................../.-.
   -1    34 ...............................|....................||....|.|....|./............./.|........./............\...
   -1    35 .......-......................./.............\....-....-...-..\........................................-......
   -1    36 .......-....|.........../................-.....................................|............../...............
   -1    37 .-..................\.../...../\...\.......................\...............-...//..\......\-.|..........|.....
   -1    38 ..\............................././\............../....-..........|..\....\.-./...............................
   -1    39 ...-.|/...........||......\...-.........................................|.....................................
   -1    40 ......|.././...........|......................./.||................\........\........|.|.....\...|....|.......
   -1    41 ...-......./............../.....|..-..-.|..-.......|..|....................\...\.......\........|.............
   -1    42 /../.................|............................/.............../....-/..|.....\...|........................
   -1    43 .........-.........|............/.......-.............-...../.\|.......\...-..\.-.....|..../...........-\..|..
   -1    44 ......................................\........|..../....|.......\......-.................|...................
   -1    45 ...\.......|.....|....\....................-............-....|......\.........\...................|...........
   -1    46 .....\.............\...-........|.............................-|......./.........-............//.......|......
   -1    47 ............/../...........-/.........................-...|...|...\............./....-..|..........\\.........
   -1    48 ..\......................\/./.........................\..-............-\..-...................................
   -1    49 ............................\...|.........|...|.\.......|............/.........|.................\............
   -1    50 ............|..|...........\..................../........|............-....-./.....\.-..-.................../.
   -1    51 ...................-.-.......-.\............-....\........-./.|../|.../.............\.......\............-....
   -1    52 ..../............../........../\...............-.............../......|.\/.........../......|.................
   -1    53 ...\......\.....................\..|...............-.......................-.-|....../..................-.....
   -1    54 .........\...\.............|........../.........................................................-...\......-..
   -1    55 ..-...........-\.........\....\.............../........\./........../....\......../...........................
   -1    56 ............|.............-.../.................|......../..-.........../............./...................\..\
   -1    57 ........-...................................-.....\-.........|............../..../...\\.|..........\....-.....
   -1    58 ..\..\.\.\.........../..|...\............/...|......................-.........................|...............
   -1    59 \.../...../..........|.....\...|./...|............./......\........................-.....-.....\..............
   -1    60 |....................-..-............................../...../..............-.../...-...|../../.\.............
   -1    61 ................/......-...|....|..........\\......-..............|\........|./.\...|.......................|.
   -1    62 ........../....................|./..........................|..................-.........|.........|..........
   -1    63 ..../.....\...|.......|../....................\...\..-...\...\...........|............./.-.....--.............
   -1    64 .........|-..........................\..-......--......../................\......\...../.|...|....../....-....
   -1    65 .......|.............\............./...............././/../..........\.........|\..........|..................
   -1    66 ....\........|.../......./....\./...//.............\..................|./.....................................
   -1    67 ..........-.|\............/..-...........\........-....|....../........-.|.................-/.-.........|.../|
   -1    68 .....-\........\........|.|...............................-...........\./..........................-........\.
   -1    69 ............../........./../--|.........................-....................\......-..\...\..........\......\
   -1    70 ..|...............................\........\......\..\.....-\............|....................................
   -1    71 ..\|.................\-......|...............\.........|.|...|........................|..../......-...-|...-..
   -1    72 ...........................\......................-.............................|........./......./....-......
   -1    73 .........-..../........../.......|../.....-.........................../.../...........|....-./.\..............
   -1    74 .-........./..-/...........\.......-.......-.........//.-.-......................................|...-........
   -1    75 ........../.....|...........\....../\............-......-......../....................|......................-
   -1    76 .......||....-.../....|....../....-.......|...................................................................
   -1    77 .....|./........\.-.....|..................|....\....../......\.......-|.....|../....\...\.\........|./......-
   -1    78 .-.|./............-....../............-..................|....|......-.....\................||.\\.............
   -1    79 ....-...-........./.........../.........\....|.\....|..\.\............................-.......//......\..-.\..
   -1    80 ...../.........................................|..........|.-|..\./............\.-.../......./............-..|
   -1    81 .../..........\..............\..../...\.........\................./.|....../........|............-...-.-..../.
   -1    82 ..\.\................\....../....................|......../\|...../...\....-..../...\.....|..../...\..........
   -1    83 ......\..-.\........................-.....................-............|.|.............-...-..................
   -1    84 ................\...\...../../....../.../................/.........\.\.................|......................
   -1    85 ......................|..................-./.........\..\.......-..........|..\.......\...-...|...............
   -1    86 ..........-.........................-................................./......../.....-.|......................
   -1    87 .......-\............./...............-............|.....................-..\.................-......\....-...
   -1    88 ..........................................\......./......\........-|..|.....\........\......./................
   -1    89 ........//...........-........../......./..............|...../..-..................../...\......-..........-..
   -1    90 ./....|..-|...|......-.............\.|.........................\...............-\.............................
   -1    91 |....................|....................../............................../...........\...|...-..............
   -1    92 \......./....|.../.|....................|..............|..................|................\..................
   -1    93 .........|......\.............../....\...................................|.\........./..-.................|./.
   -1    94 ......../..................\..................../.........................||./.-.............../..............
   -1    95 ......................./.........|.|........-../........./.....|............./......|......-....|...../.......
   -1    96 ................|......./............\...-......../..................\..\..../.......\.../.........-/.........
   -1    97 .........-.....\......-.....................-..-.........//...........................|...\-............../...
   -1    98 .....|............-...../.\......................|........|...........\..........|./......./.\.........\../...
   -1    99 ..\..........-.../.......|......./.................../............\............|......../....|................
   -1   100 .....\....................-...........-......//...........\....|..\...-.....................\.............../.
   -1   101 ..-.....|......\.......|.../......................\...|...\..\.....|...........................\..........|...
   -1   102 ....-....-...|.\-...-..\............../......-./...........\/............\-..|.........................\......
   -1   103 ......./.....-|.|.......|....\|||......\.............................................\......-.................
   -1   104 .................-\................/.-...............|............|...|.-......-..............................
   -1   105 ...|.............|...............|.......-.................-.........|.../..................................|.
   -1   106 ..-.../.....-.........................-....|......|/...../....\.............................-...............-.
   -1   107 .|.........-../....................../............|................\.....|........\...........................
   -1   108 .\\............\................-../.../....\.................................|.-.....|.....\.........-.....|.
   -1   109 .............../..................../..\.............-..\.......\...\..../..-........-..../-.....|............
   -1   110 \.................................-..............|...\./......../...........................|.........|.......

diff --git a/2023/16/solution.rs b/2023/16/solution.rs

@@ -0,0 +1,147 @@
   -1     1 #[path = "../lib.rs"]
   -1     2 mod lib;
   -1     3 
   -1     4 enum Cell {
   -1     5     Empty,
   -1     6     SplitVertical,
   -1     7     SplitHorizontal,
   -1     8     MirrorLeft,
   -1     9     MirrorRight,
   -1    10 }
   -1    11 
   -1    12 const RIGHT: u8 = 1;
   -1    13 const LEFT: u8 = 2;
   -1    14 const UP: u8 = 4;
   -1    15 const DOWN: u8 = 8;
   -1    16 
   -1    17 fn parse_input() -> Vec<Vec<Cell>> {
   -1    18     return lib::iter_input()
   -1    19         .map(|line| {
   -1    20             return line
   -1    21                 .bytes()
   -1    22                 .map(|b| match b {
   -1    23                     b'.' => Cell::Empty,
   -1    24                     b'|' => Cell::SplitVertical,
   -1    25                     b'-' => Cell::SplitHorizontal,
   -1    26                     b'\\' => Cell::MirrorLeft,
   -1    27                     b'/' => Cell::MirrorRight,
   -1    28                     _ => unreachable!(),
   -1    29                 })
   -1    30                 .collect();
   -1    31         })
   -1    32         .collect();
   -1    33 }
   -1    34 
   -1    35 fn push(map: &Vec<Vec<Cell>>, queue: &mut Vec<(usize, usize, u8)>, x: usize, y: usize, dir: u8) {
   -1    36     match dir {
   -1    37         LEFT => {
   -1    38             if x > 0 {
   -1    39                 queue.push((x - 1, y, dir));
   -1    40             }
   -1    41         },
   -1    42         RIGHT => {
   -1    43             if x + 1 < map[0].len() {
   -1    44                 queue.push((x + 1, y, dir));
   -1    45             }
   -1    46         },
   -1    47         UP => {
   -1    48             if y > 0 {
   -1    49                 queue.push((x, y - 1, dir));
   -1    50             }
   -1    51         },
   -1    52         DOWN => {
   -1    53             if y + 1 < map.len() {
   -1    54                 queue.push((x, y + 1, dir));
   -1    55             }
   -1    56         },
   -1    57         _ => unreachable!(),
   -1    58     }
   -1    59 }
   -1    60 
   -1    61 fn count(map: &Vec<Vec<Cell>>, start: (usize, usize, u8)) -> usize {
   -1    62     let mut visited = vec![vec![0; map[0].len()]; map.len()];
   -1    63     let mut queue = vec![start];
   -1    64 
   -1    65     while let Some((x, y, dir)) = queue.pop() {
   -1    66         if visited[y][x] & dir != 0 {
   -1    67             continue;
   -1    68         } else {
   -1    69             visited[y][x] |= dir;
   -1    70         }
   -1    71 
   -1    72         match map[y][x] {
   -1    73             Cell::Empty => match dir {
   -1    74                 RIGHT => push(&map, &mut queue, x, y, dir),
   -1    75                 LEFT => push(&map, &mut queue, x, y, dir),
   -1    76                 UP => push(&map, &mut queue, x, y, dir),
   -1    77                 DOWN => push(&map, &mut queue, x, y, dir),
   -1    78                 _ => unreachable!(),
   -1    79             },
   -1    80             Cell::SplitHorizontal => {
   -1    81                 match dir {
   -1    82                     RIGHT => push(&map, &mut queue, x, y, dir),
   -1    83                     LEFT => push(&map, &mut queue, x, y, dir),
   -1    84                     UP | DOWN => {
   -1    85                         push(&map, &mut queue, x, y, LEFT);
   -1    86                         push(&map, &mut queue, x, y, RIGHT);
   -1    87                     }
   -1    88                     _ => unreachable!(),
   -1    89                 };
   -1    90             },
   -1    91             Cell::SplitVertical => {
   -1    92                 match dir {
   -1    93                     UP => push(&map, &mut queue, x, y, dir),
   -1    94                     DOWN => push(&map, &mut queue, x, y, dir),
   -1    95                     LEFT | RIGHT => {
   -1    96                         push(&map, &mut queue, x, y, UP);
   -1    97                         push(&map, &mut queue, x, y, DOWN);
   -1    98                     }
   -1    99                     _ => unreachable!(),
   -1   100                 };
   -1   101             },
   -1   102             Cell::MirrorRight => match dir {
   -1   103                 UP => push(&map, &mut queue, x, y, RIGHT),
   -1   104                 RIGHT => push(&map, &mut queue, x, y, UP),
   -1   105                 DOWN => push(&map, &mut queue, x, y, LEFT),
   -1   106                 LEFT => push(&map, &mut queue, x, y, DOWN),
   -1   107                 _ => unreachable!(),
   -1   108             },
   -1   109             Cell::MirrorLeft => match dir {
   -1   110                 DOWN => push(&map, &mut queue, x, y, RIGHT),
   -1   111                 LEFT => push(&map, &mut queue, x, y, UP),
   -1   112                 UP => push(&map, &mut queue, x, y, LEFT),
   -1   113                 RIGHT => push(&map, &mut queue, x, y, DOWN),
   -1   114                 _ => unreachable!(),
   -1   115             },
   -1   116         }
   -1   117     }
   -1   118 
   -1   119     let mut sum = 0;
   -1   120     for y in 0..map.len() {
   -1   121         for x in 0..map[0].len() {
   -1   122             if visited[y][x] != 0 {
   -1   123                 sum += 1;
   -1   124             }
   -1   125         }
   -1   126     }
   -1   127 
   -1   128     return sum;
   -1   129 }
   -1   130 
   -1   131 fn main() {
   -1   132     let map = parse_input();
   -1   133 
   -1   134     let sum1 = count(&map, (0, 0, RIGHT));
   -1   135     println!("part1: {}", sum1);
   -1   136 
   -1   137     let mut sum2 = 0;
   -1   138     for x in 0..map[0].len() {
   -1   139         sum2 = sum2.max(count(&map, (x, 0, DOWN)));
   -1   140         sum2 = sum2.max(count(&map, (x, map.len() - 1, UP)));
   -1   141     }
   -1   142     for y in 0..map.len() {
   -1   143         sum2 = sum2.max(count(&map, (0, y, RIGHT)));
   -1   144         sum2 = sum2.max(count(&map, (map[0].len() - 1, y, LEFT)));
   -1   145     }
   -1   146     println!("part2: {}", sum2);
   -1   147 }

diff --git a/2023/16/test.txt b/2023/16/test.txt

@@ -0,0 +1,10 @@
   -1     1 .|...\....
   -1     2 |.-.\.....
   -1     3 .....|-...
   -1     4 ........|.
   -1     5 ..........
   -1     6 .........\
   -1     7 ..../.\\..
   -1     8 .-.-/..|..
   -1     9 .|....-|.\
   -1    10 ..//.|....