- 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 ..//.|....