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