- commit
- 18f5919f86025a58624a35f4bd5e7a8729e5b317
- parent
- b8abde72fc085b81597438e99fdbd8dad857d85e
- Author
- Tobias Bengfort <tobias.bengfort@posteo.de>
- Date
- 2023-12-14 09:24
2023-12-14
Diffstat
A | 2023/14/input.txt | 100 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | 2023/14/part1.rs | 33 | +++++++++++++++++++++++++++++++++ |
A | 2023/14/solution.rs | 163 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | 2023/14/test.txt | 10 | ++++++++++ |
4 files changed, 306 insertions, 0 deletions
diff --git a/2023/14/input.txt b/2023/14/input.txt
@@ -0,0 +1,100 @@ -1 1 ......#.O#O.##...O.....#...#..##...OO#.OO.......O.##....O.......O..#.#..O.O...O#O.O....#.O..OO..O.O. -1 2 .##.##OO..#.#O..##..OOO#..O.....O.O...#.........#.......#.O#.O..O...O..OO#O..O....#..O..#OO.O..O.... -1 3 O.....#..#..O.#OOO.OO..O..#..#O.....O...#.O..#..#O#.........#.#.....###.#.#.O...#.#.O......O..OO..#. -1 4 O..#.#..#........O......O.OO#.OO..O.O...O.O.......O...O......#....O##.#.OO.#..#.O#O.O.#.#.O...#...O. -1 5 ...O........#.O.....#O.....OO#.#.##O...#..OO...#.O.#.##.OO...#.O.#O..O......#..#.....#..#..O#..#.... -1 6 ..O....O.....O.#..O...O..#O..O.O.#....#.#OO.O#.#..#....#..#....#.OOO..O.O#O##O......#.O.O...#O.....O -1 7 .OO.#....#.O..O..OO.....#.O.OO........OO...#.#..O....#.O.....O.#.#..#...O#.#.O##O..#O#.OO..#O.#.O#.. -1 8 .O..O.##O...O.O..O.O.....O....O...#O.........O.....O.#.O........O.OO.#O....OO..O..O.........#O...... -1 9 ....#....O...O...#OO#....#O......O#..O.#OO.#.##.#.....O.#O.O##....#.O.......O.#O##........#......O.O -1 10 .#OO#.OO.O.##O.#..#.##OO.O....O#.....#...##..#.....#O#O.O....O.O..#....O...#.O.O.....O..#OOO#O...#O. -1 11 #....#......#..O.........#..#..O.###..#...#.O.O...OOO#......#..#O...O#..#OO#.#..#....#OO.OOO.....OO. -1 12 .OO#....###....OO..#O..O..O.O..O.O..O...#..#O...#O.OOOO..#..##...#.O.OO..#O...#.O#....O...O...#....# -1 13 .....O...O###O.#....#.O.....O..OOO.....O.#.O.O#.#.O.#.O..O...#OO...#O.#O....O.#.#....#O#..O......OO# -1 14 .O#.#.O.OO......#.....#....O.....O.O...OOO..........##......O......O....OO...O..O#....O....OO....... -1 15 #.......#...O.OOO...##O.OO.O.O...O..OO#O#O###.....#.OOO.O#O#.....#..#.O###O.......#OO.O...O.O....O.O -1 16 O....#.O.............O..#.......O.#.....O....#..O.#O#OO.O.#O.O....O..#O#.O....#O#OO..#..O.O......OO. -1 17 O...#.O.OO.O.#O#O.#.....###.O..#.#.#.O.O..#..#........#.O...#....#.O.....O.....#O.O..O..#...##....O. -1 18 ....#............O#.....O...OOO..#O....##..#..O#...O..##.O...O....#.......##.O.#.#O..O..O.#O#...###O -1 19 ...#O...O.OO#.....O..#......O.O#O..##O.O.O..#.#O.......O..O...#....O...#.#O...#.O.#O#.#.#O..O.###O.O -1 20 #..#O..O.#...#...#..O..#..#......O.....O.#...O..#.OO........#..#....#...##..O..O..O.......O...OO...O -1 21 .OOO...O.........#.O....O..O##....##.......#....#O..#.OO.O......O#O....#.......O......O.O......##..O -1 22 ......#...#O#...#...#OO.O#...O.O.O....O.O.....#.#..O.........O#.#.#..O#.#..#.......O.O....O...OO.O.. -1 23 ...........#.OO....OOOO.....O...O#...O...#OO..O.O.#..#.O##O........#......#...#.#...##OO....#O#O###. -1 24 .#.##O....O#.O........O........OOO.OO..#..OO.....O.O.####...OO..O...#.O...O.OOO.#.....#..#.OO#.#O#O. -1 25 ..O..#.#..OO....OO..O............OO.....O#..OOO.O.O..#.O...O..O.OO#.O.#O.OO......#.##......O.#OO.... -1 26 #.O...#O#O...O.O....O...#.###O...#...#...O..OO...O.......O.#....#..O.#O.#O..O..#O#...O....#.O.##O#.. -1 27 .O#.....OO....O#.#.......#.#..###OO.......O....#...#O..#..#.O.O....O.O..#O........##O..#...O#.#O..O# -1 28 .O..##..#.....#.......#.....O....#..#O...#O#.O..O.O............O...#.#.#..OO#...O..#..O.O..#.....O.# -1 29 ..O..O#..#.###O..........#..O.OO.....O#.O..O...#.......###.......O..O#...#O##..O...O...#O....O#...O. -1 30 ..#O.#...OOOO.O...OO.OO...#....#.#.##...#.O.#O..#..O........O#.O...O.O#.....O#.#O..O...O.....#..#... -1 31 OO.....O.O#.O#.#.#...O#.#...#.........OO.#.#...#....O.OO...O...#O.##.O........O.O...O..O#..O..#.#.O. -1 32 .#.#..O..O..OO##...#.O.###O...#.O.....O...O...OO#.O...#O.#....#..OO#.O.O...#O#.#....O...#OO#..OO.#O. -1 33 O..O....O......#..O.#.#.#.#.....O.....#.#.O...O....OO....O.....O.....O...O.#O.....#OO...#..#.##..#.. -1 34 ..O#....#..##......O..O..#....OO....OOO...#O...#...O..##..#...OO...OO......O#.OO....O....O.#O..O.O#O -1 35 .....O.....#OOO.O.O.OO..O.O....#....O..O#O#..#.#......#.O.O##.O..O......OOO...O.........O..O#.O.##.# -1 36 .O.#.....O#...O#.....OOO....O.O#....#.OO#......O........#.OO#O...O.##O.O....O..O#O.#.......O.....O#. -1 37 ..O..#.O.....#.OOO.#.....#O.#...O.OO..O.....#O.###...O.#..##...O...#.##......O....O...O#....O....O.. -1 38 .O.O#O.O#.O......#.#.O..O#.......O.OO...OO...O.#OO#.....OO.O.O..#..OOO.....O#....O.#.....#....#.O... -1 39 ..O.........#.O..##...#..#OO#O#.#..#......O.#...#..#O.........#.#...OO....#......OO#O.##O.O..OO#.... -1 40 ...O#.O.#.#........#.#..O.O#...O.#......O....##..##.#.O..OO.#.#....O..O....O..#O.#...#O#.O...#....O# -1 41 ...O..#...O...#O...#...OO.#O..#.O....O.#.O..O..O#.O....O.##O..#O.##....#.OO..#.#..#...OOO.O..O.#.... -1 42 .......O#.O.#O##O..O..O.....O...O..O#O..O#O..#....O..O........O.....OO#...#...O.O#O....#.OO#....##.. -1 43 #.##O#.......#...O#...#...#...#O.O.O...O..#.OO......#.O.#...##.O.#.O..O..#O#O...........OOOOOOO....# -1 44 .....O..O.#..O......#....O.....OO..O..#.....#.O..#..OO..#.OO.O.#....#...##...O.......#OO.O...#O..... -1 45 O.......##..OO...#..O.#.#.#.....O#.....O..O#.O#....##....O.#..OO.#..#OOO.O.O###O#.#OO......O...O...O -1 46 .......O..##O....O...#..#....O..OO#..O##O...O.OO....#....O...#.##O...O...##..#.#.O..O#O....#O...#O.. -1 47 O.O.....O.O#.O#.O....O.#..##O.#.O..#.#.O.O###.#.O...#..O.O#...#.O.....#O..OO.O#O#..#O#.#...........O -1 48 .#...O.O#...#..OOO.O....O..#....O#...#........O#O.##.#...OO.....#....#O..#O.....O#...O...........#.. -1 49 .#.#...O#O.....O#OO.#O....O##..##..O...#..O.O.O.....O..#O..O#O......#.O...O........O...#.........O.O -1 50 O.#O.##.....O#...OOO.......O.O.#.#.#.....#.OO.......#O.....#.O.O#...O##..#.#.............#.O#O....#. -1 51 ...O##.O#....OO.........#OO........O.O.OOO.#.#..O..#...OO....OO..........O...OO#OO..#O...O.O..O...O. -1 52 .OO.O#..#.#.O...#O...O..#...O.O..#..##.........#..##O.OO..#..O#.........#O.OOO......O.##...O#O....#. -1 53 .OOO....O...#..#O.......#.O......OO.O#O.....O...O..#....O.O#......O.O....O....OOO###..OO...#OO...... -1 54 .O..O....#...OO.O...#....#O.O...#...OO##.....O..O...O........O...O#O...O...O.O....OO.OO......O.....# -1 55 ...#...#.OOO...O.......#......O.O.#.##.#.O.O...##.OO.#.O.O..OO#......OO..O.O#.#.......#..#.OO.O.OOO. -1 56 O#..#..##..O..OOO..O....#..O.......O...##O#..#..#.O.OO..#.O....#...OOO..O.O...OOO#.........#.#O...O. -1 57 .#...O..#.##.O........O..#..#O..##...#..OO...#.....O#..O.....#.##......#..OO........O..O#....#O#.... -1 58 O.O#..O..#OOO..#.......#...#.O....##...#.O#...O......##........O.O####O.OO#..O....#...##O#..O..#.... -1 59 ....#..O..#.O..O#O.#.......O.##....O#O#.OO.OO#.......O.O#..O...#O.OO.O.#..##OO#.O..OO.O.#OO#....O#O. -1 60 ....O..O...O...O#.#O.O...#.#O...O...O...O....#O##.#......##......O.....OO###OO....OO##.#...#.....OO# -1 61 .O.O.#...O...O......#.O..OOO#..O.O...O.#O......O......O...O.##..O.....#..#..O.#....O...##........... -1 62 #.O..##O.OO.O.....###O##OOO#O.#.#OO.O.O.O...#.#O#OOOO#.#O..O....O......OO....O........##.O..#O..O... -1 63 O#O..#OOO.O..O......#...O.......O.#..O#........#..##..#..O..O...#.#..#....O..O..OO.......O..#..O#..# -1 64 ..#....#.O..#.O#OO...........#...#.#OO#...#...#.##..O.#O.O.##...O#.#...O.##....O.O.O....O..O#.O.##.O -1 65 O..#.O...O....#....##.....#.#.O#..O..O.....#O.OO#.O..#...#.#.#.O.#..O#..OO.##O..O......O#O#..#..O.O. -1 66 .O....O.....O.#.......O.......O...#O..#...O..#OO##..O...##.#.O.O#.O..OO.......#OO.O....OO....##O.OO# -1 67 ..OO.#..O.......#O.O....O..#.O.O.OO....O..#....O.O.O....OO.#O##.....OOO#..O.#O.#...##OO.#...O.O.O..# -1 68 ..OO..OO.O#O...O..........O........O.O..#.#.O.O.......#O...O.O...##.#....#.O..#.....#...O.#...OO#O.# -1 69 .O.O.O.O..O#...O.....#.....O..O#....O..#..O###.O#.O.O...O.....O...##.#...O#..O#..O......O#...O.O.... -1 70 .#...OO...OO.O#O.#....#....#O#..#...O.O...#OO.#O..#...#.O.......O#O..O#..#.#.OO...##.OO..O.#...O.... -1 71 ....##...OOO..OO..O.O..#..#..##O..#O...........#..#..O#.OO.#....#..##OO#O.O#..#O#.##O##O##OO.O.#O.#O -1 72 .....#..O.....#....O#..#.O#.#..#OO.#..O.....O...#..#.O.O....#.#O.O.#..#.O.OO..O..#..O..#..#OOO....#O -1 73 OO#.#O..........O.......O#O..#O.#.##OO.#....O..O..#.O....#OO..#.##...#.....##O#.O.O...O#..O#..#....# -1 74 .O..O.OO..O.#...........OOO##..O..O...O.O#.O#OO...O.#...O.#.O.##.#..O.OO##.O.##O.O...O....OO#....... -1 75 .OOO.......#..O......OO.#...O...O#O.#......#.......O.#..#O..#O#...O.........OOO...O...##O.....#...OO -1 76 O..O.......#.O.O..#O##.##O.......#...O..OO.OO.#.OO.#.O.#.O...O....OO..O.##.......O....#.#.O..#....## -1 77 #..O.OO....#O......O..O.O...#.O....OO.O.OO..#..OO......#.....#.##.OO.##O.#O......#...O.OOO.....O..O. -1 78 .O....##..OO.##O####..........O##.##.O..O#O##.#O.#..O#......#O.OO........O#......##O...#OOO.....#.#. -1 79 .....#O..#..#....OO#....O.##....O.O.O.O#..#O.O..O....OO..OOOO.O.O.O..O....#.#..O..O..#...OO....#.O#O -1 80 #.#.#OO.....##.O...........#.##...#.#.O#O......#.......O.OOO..#.O...O....#.O.....#....O..#..O...##O. -1 81 ......OO...#....#...O#.OO...OO...O...O..#.#....##......O..................O.O..#.##......#.........# -1 82 ..O..#.O..##O.#.OO##O.OO.O..O..#....O.#.#.O.O..OO........O......O..O..#........###.#....O.#.#....... -1 83 ..##.......OO#..#.O.O#O.##.#..#.#...#O......O.O..O#...#O.O...OO...#..O#..#..O.#..O##..#...#..##..#O# -1 84 #O.OO..#....O...OO.#...O#.....O#..#..O...OO..#.....OO#.#.O...O..O.O.O.O.......O..O#..O..#OO.O#..#O#O -1 85 ......#........O.......#.O.O#.O...#...O.#........O..#O.#.O...O..O.##..O.O.........#OO.##............ -1 86 #OO.O.O#O.#O..O.O.#.O..#.#O.O#......##..#O.........#O.....O..O#.##OOO.#......##...O.#..O##...O.#O.#. -1 87 #...O.#O.O..OO...O.##...#.O...O#O.#.#.O....O......O....O...#...O..#.....O#....O.O.#O.......#.O.###.O -1 88 ....##..O......O.........#.O..#..#O...OOO....#O###......#.#...#..OO....#...OO..O#.O..##.O.#........# -1 89 ......#.O#O#...OOO....OO..#.#...O...OO......#.###........O.OOO......##..O#...OO..O.#OO#....O.OO.##.. -1 90 .#O#O#...##O...##O#...#.............#.#.O..O#OOO.##O#.O..#....O#....O......O..........#.#..O#.#...O. -1 91 O#O#.....OOO.....#............#.OO.#.O...O...O..#...#...##...O...O...O..#..O....O.....O.........#... -1 92 ...#O......O.##..#O...O#.O#O...O...#...O...O..#..O.O..........#....##..O.......#........#OO......... -1 93 ........#.O....O#.#.#O......##..#.#.....O.#..#...O..OO.O.#OO..O....O#...O.#..O.O...#.O.#O..O.O..#OO. -1 94 ..#.#.......#...#.O#...OOOOO..#...O...OOOO#..#...O.#OO..#..O............O....O..#.O.#.O.#...#..O.#.# -1 95 .#O....#.O..#O.O.#..#OO....O.O..O##O...O.##.....#..OO.##...#....OO...#.OO...O.#.O#.....##.#OO.#.##.. -1 96 .O..O.O...##......#OOO..OO....O....O#..#.......O....O...#O.#.O.O#O#O#.......O.#.....O.....##.#..#.O. -1 97 #.#O..O##....OOO..O##....#O.O.O##...O.#OO..##..O.#...O..O#...O.....#.##....O..OO.#.O...O.OO..#..O... -1 98 ..#.#...O..OOO#...#..........#.O...###.......O..O....O..#..#....##.....OO#O......O.OO....#..#...#OOO -1 99 .O...O...#.##.#OO.#.O...O...O#O.#O....#..#....O#...OO.O....#O.O........O....#.....O...O#.OO..#...... -1 100 .OO.O.#....O.O#......O#...#.##O#...O.#....#..O#O..#...#....O..OOO#.#.....O#.#O.##.#O#O.#.O....#.##O.
diff --git a/2023/14/part1.rs b/2023/14/part1.rs
@@ -0,0 +1,33 @@ -1 1 #[path = "../lib.rs"] -1 2 mod lib; -1 3 -1 4 fn main() { -1 5 let mut width = 0; -1 6 let mut height = 0; -1 7 let mut cols = vec![]; -1 8 let mut sum = 0; -1 9 let mut count = 0; -1 10 -1 11 for (y, line) in lib::iter_input().enumerate() { -1 12 height = y; -1 13 if width == 0 { -1 14 width = line.len(); -1 15 cols = vec![0; width]; -1 16 } -1 17 -1 18 for (x, b) in line.bytes().enumerate() { -1 19 match b { -1 20 b'#' => { cols[x] = y + 1 }, -1 21 b'O' => { -1 22 sum += cols[x]; -1 23 cols[x] += 1; -1 24 count += 1; -1 25 }, -1 26 b'.' => {}, -1 27 _ => unreachable!(), -1 28 } -1 29 } -1 30 } -1 31 -1 32 println!("part1: {}", count * (height + 1) - sum); -1 33 }
diff --git a/2023/14/solution.rs b/2023/14/solution.rs
@@ -0,0 +1,163 @@ -1 1 #[path = "../lib.rs"] -1 2 mod lib; -1 3 -1 4 enum Cell { -1 5 Square, -1 6 Round, -1 7 Empty, -1 8 } -1 9 -1 10 fn parse_input() -> Vec<Vec<Cell>> { -1 11 return lib::iter_input() -1 12 .map(|line| { -1 13 line.bytes() -1 14 .map(|b| match b { -1 15 b'#' => Cell::Square, -1 16 b'O' => Cell::Round, -1 17 b'.' => Cell::Empty, -1 18 _ => unreachable!(), -1 19 }) -1 20 .collect() -1 21 }) -1 22 .collect(); -1 23 } -1 24 -1 25 fn tilt_north(rows: &mut Vec<Vec<Cell>>) { -1 26 for x in 0..rows[0].len() { -1 27 let mut next = 0; -1 28 for y in 0..rows.len() { -1 29 match rows[y][x] { -1 30 Cell::Empty => {} -1 31 Cell::Square => next = y + 1, -1 32 Cell::Round => { -1 33 rows[y][x] = Cell::Empty; -1 34 rows[next][x] = Cell::Round; -1 35 next += 1; -1 36 } -1 37 } -1 38 } -1 39 } -1 40 } -1 41 -1 42 fn tilt_south(rows: &mut Vec<Vec<Cell>>) { -1 43 let last = rows.len() - 1; -1 44 for x in 0..rows[0].len() { -1 45 let mut next = 0; -1 46 for y in 0..rows.len() { -1 47 match rows[last - y][x] { -1 48 Cell::Empty => {} -1 49 Cell::Square => next = y + 1, -1 50 Cell::Round => { -1 51 rows[last - y][x] = Cell::Empty; -1 52 rows[last - next][x] = Cell::Round; -1 53 next += 1; -1 54 } -1 55 } -1 56 } -1 57 } -1 58 } -1 59 -1 60 fn tilt_west(rows: &mut Vec<Vec<Cell>>) { -1 61 for y in 0..rows.len() { -1 62 let mut next = 0; -1 63 for x in 0..rows[0].len() { -1 64 match rows[y][x] { -1 65 Cell::Empty => {} -1 66 Cell::Square => next = x + 1, -1 67 Cell::Round => { -1 68 rows[y][x] = Cell::Empty; -1 69 rows[y][next] = Cell::Round; -1 70 next += 1; -1 71 } -1 72 } -1 73 } -1 74 } -1 75 } -1 76 -1 77 fn tilt_east(rows: &mut Vec<Vec<Cell>>) { -1 78 let last = rows[0].len() - 1; -1 79 for y in 0..rows.len() { -1 80 let mut next = 0; -1 81 for x in 0..rows[0].len() { -1 82 match rows[y][last - x] { -1 83 Cell::Empty => {} -1 84 Cell::Square => next = x + 1, -1 85 Cell::Round => { -1 86 rows[y][last - x] = Cell::Empty; -1 87 rows[y][last - next] = Cell::Round; -1 88 next += 1; -1 89 } -1 90 } -1 91 } -1 92 } -1 93 } -1 94 -1 95 fn cycle(rows: &mut Vec<Vec<Cell>>) { -1 96 tilt_north(rows); -1 97 tilt_west(rows); -1 98 tilt_south(rows); -1 99 tilt_east(rows); -1 100 } -1 101 -1 102 fn hash(rows: &Vec<Vec<Cell>>) -> Vec<(usize, usize)> { -1 103 let mut hash = vec![]; -1 104 for y in 0..rows.len() { -1 105 for x in 0..rows[0].len() { -1 106 match rows[y][x] { -1 107 Cell::Round => hash.push((x, y)), -1 108 _ => {} -1 109 } -1 110 } -1 111 } -1 112 return hash; -1 113 } -1 114 -1 115 fn weigh(rows: &Vec<Vec<Cell>>) -> usize { -1 116 let mut sum = 0; -1 117 for y in 0..rows.len() { -1 118 for cell in rows[y].iter() { -1 119 match cell { -1 120 Cell::Round => sum += rows.len() - y, -1 121 _ => {} -1 122 } -1 123 } -1 124 } -1 125 return sum; -1 126 } -1 127 -1 128 fn part1() { -1 129 let mut rows = parse_input(); -1 130 tilt_north(&mut rows); -1 131 let weight = weigh(&rows); -1 132 println!("part1: {}", weight); -1 133 } -1 134 -1 135 fn part2() { -1 136 let mut rows = parse_input(); -1 137 -1 138 let period; -1 139 let mut history = vec![]; -1 140 history.push(hash(&rows)); -1 141 loop { -1 142 cycle(&mut rows); -1 143 let hash = hash(&rows); -1 144 if let Some(i) = history.iter().position(|h| *h == hash) { -1 145 period = history.len() - i; -1 146 break; -1 147 } else { -1 148 history.push(hash); -1 149 } -1 150 } -1 151 -1 152 for _ in 0..((1_000_000_000 - history.len()) % period) { -1 153 cycle(&mut rows); -1 154 } -1 155 -1 156 let weight = weigh(&rows); -1 157 println!("part2: {}", weight); -1 158 } -1 159 -1 160 fn main() { -1 161 part1(); -1 162 part2(); -1 163 }
diff --git a/2023/14/test.txt b/2023/14/test.txt
@@ -0,0 +1,10 @@ -1 1 O....#.... -1 2 O.OO#....# -1 3 .....##... -1 4 OO.#O....O -1 5 .O.....O#. -1 6 O.#..O.#.# -1 7 ..O..#O..O -1 8 .......O.. -1 9 #....###.. -1 10 #OO..#....