day 14 part 1

This commit is contained in:
Dominic 2023-12-14 13:15:14 +01:00
parent cbbee06a64
commit ffb9985fd3
Signed by: msrd0
GPG key ID: DCC8C247452E98F9
4 changed files with 188 additions and 0 deletions

7
Cargo.lock generated
View file

@ -2,6 +2,12 @@
# It is not intended for manual editing.
version = 3
[[package]]
name = "aatree"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5de9cb8411c745f387ec1736ed2669a1ddcfdbba2282c76282973ab0dc085377"
[[package]]
name = "ahash"
version = "0.8.6"
@ -30,6 +36,7 @@ checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
name = "aoc23"
version = "0.0.0"
dependencies = [
"aatree",
"anyhow",
"ariadne",
"bit-vec",

View file

@ -5,6 +5,7 @@ publish = false
edition = "2021"
[dependencies]
aatree = "0.2.2"
anyhow = "1"
ariadne = "0.3"
bit-vec = "0.6"

100
inputs/day14.txt Normal file
View file

@ -0,0 +1,100 @@
O....#.O.#.O...O.O....#.#O....#.#..OO##.......#...O..O......O.OO.OOO.#...##...O...O#O....O..O#......
.....#.....O....O...##OOO#O.O..O..#...OO.#O#.#.O....O#...O##O.........##.........#.....O..O..O...OOO
...#OO#..#...#..O#.#......#.O......#.........O.#...O##....#.#..O..##..O...#......O.O.......##.#O.OO.
OO..##.#...O..O.OO#..#.#...O.O....OO.O.O.O......O#..#O...#.O.....#...........O.....O##..O.#..OO..O..
..O...O.....O..#O.O.....##..#..#..O......#..#.#.O.O#....##.O..O#....#..#....#.##O..#.O..OOO....O.#.#
#..O.OO.....#...#..O...#..O##..O#..O.....O...O..#.#...O.#..O.....OO...##.O.O....#..O..O...#....OO...
......O..O...#.#.....OO.........###O....O..O.##....O#.#.O.#.O.O..#....O.#.O....#.O.O##...O.....#....
..#.O#..O....O...O.O.....#O#.O.OO..#OO..O..#.....#...#.....#.#.##..O##..#.O.O#...O..#.O#OOOO.....O..
O#O.O.O.O.....#......O......O.O..O.OO.O..O#...O.O..OO.O.#.OO.O.#...OO...#.O...O.....#.O##O.....#O#O.
..#.#..O......#....#.#O..O..##OO.....OO.#O.O..O.....#...O...#O....O....O.OO....OO..#.#.##.........#.
O..............O..O.......##.....#..#......#O....##OO........OOOOO......O.O...O#..OO.#.#OO.O#....O.#
#.....#O....O......OO#....##O#..O...O.....OO#...OO...O#.#..OO.OO...O#..O.OO.........#.OO.........O#.
.O.O.#.#O....#...#.O..OO.....O.#.O......O.....O.....#OO..#OOO..#O...#.O.OO...#..O.#O..O...#O.O..#.O.
OOO..#OO#...##..O........####...#O#.....O..#OO.....O.O.......O.....OO.O..OO....O#O.O.#O..O.OO....#..
.O.......#OOO..#.O.OO.O............#....O..O..........O..O....OO......#..#.....O.OOO.#O....O..#.....
#..#...O.O#..OO.O.##..#.O.....O..#.O#...#.O...O#.#..OO.O..#O.O#O#O....#.O.O....#...O...O...#O.#.O.#.
..#..O.O.#...O.##.#O.O..#....O..O.###O.O......##..O..#O.O..O..#..#...###...........O.......#....O...
O.....O###...#.#O.#....#.#OO#...OO##.O#...#O..O...#.O..OO...O..OO.....OOO.......O.O.......#.........
.O#..O.#.OO.O....O.#O...O..#O#O.O....O.#..#O.OO#..#...O.##.O.O.##...#...#O......O..#.#......O##.....
.......O....O#..#....O.O...#.OOO..O.O....O#..O#....OO.O..#...O.##O..#..#O.O....#.#...#O...O.##O.....
..O.#O..O.#O#...O.OOO##.O....#####OO#...#.O.O....O..OO..#..O..O.O.O...O#.O.#......#..#OO......##....
.#.O.O.#.OO#..#..O...O.#.#.OO.#.#.OO...O#....#......OO..O#.#.O............O.OO##.O.O..#..#.....O....
...#.O..O.#.......##..O..#O#...O.........O..#.##O#O#.#O....###..##..#..O#.#........O.......#O.....#.
O#.#O.O..O.....#..O.O.##..........###..#..#O...O.OO#OO...O..O.....O#..OO#O.........#.#O..........#..
..O.O...O......O...#.....O.#..O.O.....OO#.#.#.OO...OO...#........O##O....OOOO...O.O......O..#O..O##.
..O#...O........O.#...##.O.O...O...#...O.##..#O..OO..#....##.#O..#O..OOO......O#.OO#.#.#...........O
.OO#.#.....O.......#O.##O...#.......O.#..OO##OO.O...##........#.O.#.#...#.#O....#..#......#..#......
..###..#.#O.....O..O.#.OO...#O.#.#...#...O#....#.O.##.#.#....##.#.O#.O.#.##..O..O......#.#...O...#.O
##O#..#..O.....O.....#O......#..#O....O..O##...O..O...OO....#.....O#..#.#O#.O.......##...#......OO#.
....O#....#O.#..O.....O.....OO.O.O.O#....O..#.O......O..OO..#..#.O....O#..#.#...#....#.....O.....###
..O....#O#.OO.......#..#...#...#O.#O#O..........O...O#O...O.....O..#O...O.#.#...O.##.O..###OOOO.O.O.
O.....#.....##O......O..O...O.O..#...#.......#O.O#.O..#...O....O...O.#.#O..#.#.O.O.OO..O...O.##OOO.O
........#.O...O#.......O....O.O.#.....#.....O....##.....#...#...#......O#.#......#...O..O.O...O...#.
#..O.O..O......#...#.O...#OO..O.O...##O#O....O.#O..#....O.#O#.#....#O.O..OO.##...#.###...#.O.#.OO..#
.OO........O.....#O....#O#.OO...#...O....OO.#.#...#O..O..O.#O.OOO....#.OOOO..O.O...#...#O..O..O.#...
O.#.O##O.O....O..#.....OO.#O.#.O..#..#.O.....O.#.O....#O....#.....O.#.O.O...#....#.O..O#..#.#..O...#
#...#......#...#..#O.......O...O..O....#OO.......#.O.....##..O###....#..#O...#...OO..O.O...O...O#OO.
.....#O.O...##O.#....O..........#...........O...##.......O..O#....O.#...OO#.O...OOO...O....O........
...O.#..#.O...O..O..O..#OO............#.O#..##....#OOO#.#.O.#.O...#....#....OO#O.O..#..#O...O..O...#
OOO......#...#.......O#...........O.....O#.#.O.O....##.OOO.....#O...O.#.#OO.###....O##.#....O..#....
.#..###.#O...#..O##....O....OO##...#....O....#.O#..#.OO....O#O...##.#O.....#.O##O#.OO...O.....O##.#.
..#....OO...#.O..#.O###.#..#..O..O..O#...#.O.#..O..OOO#OO........O.#O#O.#.O..###.##O#..OO..O.#.#....
....O..#..#..O.O#O....O#...#.O.OO...O#.O.....O#.#..O...#..#.#O......O..#.............#.O...O.#..O...
#.#...O.#..O..#...O...#..OOO....O.O...O....O...O#.....#.....#.OO.O.O......#........#...O.O......#...
...#.....O.OO#...O...O..##O.OO...#....##.#.O#...OO.......O.O#O....OO.O.#OOO..O.#.......O#......#.#..
.###....#.O....#O.#.O#.OO..#...O......##O....O#.#.#.O...#...OOO.O#O.O..O.O..#..##..O..OO#...........
.O.#.##O#....O....O..O.#OO...##..#...#O..O.#O##....O.##....O...O#..#...O.O#...#..#.#....##....O.....
...O..#O#O...O.O.#O.OO......O.#O#...#....O.#O......#..O...O...###...#..O....O.O..OO###..O#.O..O....#
.#O..#OO.OO.......O..OO.....#.OO.O.##.#OO.#.#....#O.#O..#.#O..#......#O......#.O.#.O#...OO......O#O.
...O.O......#....O.O#O...O.O.#...#..#OO.#.O.........#...#.#.#.O.#..#...O.#.#......#.#O...#.....O...#
...#O.......OO.O.OO.#O......O...#...O...#.O......O..##O.....#OO......#.#O.O.#..O.#O#.......#OO#.O...
...#..###O..#..O........O..##.................O.O.....OO.#..O.....O.O.#OO...#.O....O.O....#.#O#O#..#
...#OOO...O...#..OOO...#..O.....O#O..O...........O.#.....#..#.O..............O....O.....#O...#O#.OO.
...#...#O..O#.....O....OO...#....#O.#....#..O.....OO#.#.O.O.....##...O.OO.O...OOOO.O...O...O...O....
...OOO...O.O#.#........OO.#.#.OO...#O...###.O#.O#.#.O.##O.O.O#.....##.....#.O..O.O.....#.#.......#..
.#.O..O.OO#.O.............O#....O#O...#.O.O.OO##.OO.O..O....O...O.....OO.#.O.O.......O..#O..#..O#..#
O....#O.O.O....#..O..#O....OOO...#.O#..O......O..O....OO.OO...#O#O..#O..#...##.#OOOOO..O..##....#.O.
..O.....#...OO#.O.......##OO#.O........O......O..#..O#...OOO....#.O.O#OO....#...#....#.OO#..OO....O.
..O#...#..#..O........#..O..#O..#..O..O...O.#..O...#O.#..##..##...O.....O.O.O....#.O.O....#.##......
...#......#.OO.O.#OO..O..##...O.....O.#O#..#O..............O.O..O.#..#..##...........OO.#.....###OO.
...#......O..#O.O.OOO...OO..O..O........#..............#.#.OO..####..#...#.#...#.O#.............#.O#
....#....O.......#....O..#....O#.#.#..#.#OO.#.O.O.....#O#......#.#......#...#...O..O......OOO###...O
O##..OO..#.O...OOOOO#.#........##..OOOO.O.#.O.O.O...OO...O...#..#...#...O......O..O#O#.#O.....##....
O..O...O....O...#.O.....O...O.#..#.O...#..#..#.OOO....O..##.#......O.#..O...O...#.O.O#.##O...#O...O.
..O.O..#.......O......O..#....O..#.#OO#.#.#...OOOOOO.#OO........O..###O....O.#OO#..O.O#.##.#.O......
#...##..OO.O#..O.OO#...##.#.#O.........O.......O....O........##.O.###......O...#O...O.O.O#..O#O...O.
..OOO........O.##O....#...#.##..O..O....#.O........O##.........OO.#OOO#OOO..#..#O.#.#...O......#.O.O
...##.#.#O........OO.OOO.#O.O#..#..O#.O..#.O##....O#O##O#...#.O....O....#..##O..#.O..O.#.....#.#..O.
.O.O.O##..#..O....OOO.O.#.##.##.....O...#O#.....#O...#.OO.O..O......O.O.OO.O.O..#..O..OO...#..#...#.
#......O..OO.....O#.O...##...#.O.O...O#....##.##.OO.O...O.#....#...#...O...#....O.......OO.O..O.#..#
....#......O...##...OO.O...........#..O.###...#...##.OOOO#...#...#....O#...#..#O....#.O.......OO.O..
...##O...#....##..##..##..O.#O.O##...O.........O........O..O#..O#.....O.O.#O##.O#OOO..O...OO#...#..O
.O..O###.#O...O..O.O.O.....#.#.#.#..OO....O..O.O##.#O....#...#OO...#.#OO.O.OO....##...OO#.#O.#....#O
#OO..O...O..#..OO.O.................#O.......####.#..O##.O..OOO#.....##O.OO..O#O...#.##.#.......#...
O#..#.....O#.......#.....O..#OOO..O...O.....#...O.....O#.O..O.#O....##...##.O.#O.O.##......O....O#OO
.#O......##..O.....O...#.O#....##.O.O.#.....#O#..OO#OO.O.##O.#.......O.O....#.#.#....#O..O...#....OO
###.#O.......OO#..O#.O#.O.#..#...O...O...#.....O#...........#....O...##....#.#.......#.#O.....O.....
O#.#O.....O....OO....O...#..O.O.......##.#..O...O.#O...#O.#.#O#......O......OO#...#....O.O.#......#.
OO..#O....O..O#..#......#O...#..#.##......O..O.#.O.O.O.O.O...#.OO.O.O...O........O.....#.OO.O.#...#.
..O.#..O....O#..OO##O..O...O..#...#..#......###...........###O...#...........##O....#.O....#.#..OO#.
......OOO.OO.####.O...#..#...##..O..#.#...#...#...#.#..#.........OO..O#O.O.##O#....#O....#.....#O#..
O....O.O...#..O.....#.O...O..O.O...#OO..#OO.O..O#.O#O..#....#..#OO.O..#O.O..#........#O.#..##.....O.
#O#O#.....O...##.O.O..#O..#.OO.#OO........OO#..#.#O....#.OO..O.O#...#.O....O......O...O..O..##.O..#.
.......##O..OO#.O#.O.#O.....#.#.#.OO..O.O......OO.#...#...O..#O#........#.....O#.O#...OO..#.#OO.O...
..#O.O#O.O....#....OOO....O.#O.O#..#..O#.#.......#O...OOO.#..OO..#...#..#.......O..O..O..OO...OO#.O.
O....#..#O..O#..O##..#O........O....O.OO.OOOOO#.OOOO.....OOO#....O..#.....#..............#..#..O##.#
O.##.O..#O...#OO.........O...O..O.......OO#..##.O##.O.O....#.....O#....O.....O#..O..OO..O.........O.
...#OO..O......#..O#O..#O#...#...OO#.#.#O.#..O...#......O.O...O##.......#....O......O....#OO.#O.OO.O
.....#OO#...#..#......#.O...#OO..O#......O....O..O#..#.O.O...O..#O..O..OO.....O.O..O..#O....O..O..OO
.#.OOO.OO...##.......#OO.OO...O......O.OO.O.#O#.O..#...OO.O..O..#O........OOO#..#.#OO.#.O...O.O.....
...#..O..#...O..##......#....OOO..##.O...O#..#............O#O..O..O.#OOO...#...#...O......#...#.....
............#.O.#...#..O..O.....O.O#..O.....O#..#...#.......O#..#....O.#.O##...OO.O#.#.....O..OO..#.
......O#..O....O.....#........OO..O.#.#O.#...O#....##..O.#...#O#O.......#.....#...O....##...O...O.O.
.O..O...O.O.#.O..O#.......#..#.O...OO..OO..#O...............#O.O......##.OO.......OO..O.......#....#
O#.....#.O.O..O.OOOO.....OOO...#........O...#...##.......##O#.OO#O#...#.O..O.OOO....##..........#..O
...O.#.O..O.#.#O.....#...OO...O.O.....OO......O..O..O..OO##....O....O...O...O#..#..#.O...O.......#..
#.....O#.....#.....#......#.O.............O.O..OO.O..O.......O.OO...O..#...#.....#.O.O.......O......
.#.#.O.OO...#.##.....O....#...O.O...#.......OO.O.O.....O..#....O.........O..#..#.#.O.......O...O...O
O..O#.O.#OO..#.#.#......OOO.#..#.#.O#O.O...OO..#O#O.....O.O..O#O.#..O...O#...O.O.O###...O....O.O..O.
..O.#......O.O....#..#O.............#..OOO.O...........O....O.OO.....#.#O.OO...OO...#....#..#...##.#

80
src/bin/day14.rs Normal file
View file

@ -0,0 +1,80 @@
#![forbid(elided_lifetimes_in_paths, unsafe_code)]
use aatree::AATreeSet;
use aoc23::read;
use chumsky::prelude::*;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum Cell {
Void,
RollingStone,
PermanentStone
}
impl Cell {
fn parser() -> impl Parser<char, Self, Error = Simple<char>> {
choice((
just('.').map(|_| Self::Void),
just('O').map(|_| Self::RollingStone),
just('#').map(|_| Self::PermanentStone)
))
}
}
fn parser() -> impl Parser<char, Vec<Vec<Cell>>, Error = Simple<char>> {
Cell::parser()
.repeated()
.then_ignore(just("\n"))
.repeated()
.then_ignore(end())
}
fn main() -> anyhow::Result<()> {
let grid = read("inputs/day14.txt", parser())?;
let mut rolling_stones: AATreeSet<(usize, usize)> = grid
.iter()
.enumerate()
.flat_map(|(i, row)| {
row.iter()
.enumerate()
.filter(|(_, stone)| **stone == Cell::RollingStone)
.map(move |(j, _)| (i, j))
})
.collect();
// we skip the first row, no stones can be rolled north
let mut last_row = 0;
let mut last_col = grid[0].len();
while let Some((row, col)) = rolling_stones
.first_at_or_after(&(last_row, last_col + 1))
.copied()
{
let mut new_row = row;
while new_row > 0
&& !rolling_stones.contains(&(new_row - 1, col))
&& grid[new_row - 1][col] != Cell::PermanentStone
{
new_row -= 1;
}
if new_row != row {
rolling_stones.remove(&(row, col));
rolling_stones.insert((new_row, col));
}
last_row = row;
last_col = col;
}
let mut weight = 0;
for col in 0 .. grid[0].len() {
for row in 0 .. grid.len() {
if rolling_stones.contains(&(row, col)) {
weight += grid.len() - row;
}
}
}
println!("{weight}");
Ok(())
}