day 13 part 1 start coding

This commit is contained in:
Dominic 2023-12-13 09:05:41 +01:00
parent b5185d38b2
commit 4e186f6221
Signed by: msrd0
GPG key ID: DCC8C247452E98F9
2 changed files with 98 additions and 0 deletions

15
inputs/day13.txt Normal file
View file

@ -0,0 +1,15 @@
#.##..##.
..#.##.#.
##......#
##......#
..#.##.#.
..##..##.
#.#.##.#.
#...##..#
#....#..#
..##..###
#####.##.
#####.##.
..##..###
#....#..#

83
src/bin/day13.rs Normal file
View file

@ -0,0 +1,83 @@
#![forbid(elided_lifetimes_in_paths, unsafe_code)]
use aoc23::read;
use chumsky::{prelude::*, text::int};
use rayon::iter::{IntoParallelRefIterator as _, ParallelIterator as _};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum Cell {
Working,
Broken,
Unknown
}
impl Cell {
fn parser() -> impl Parser<char, Self, Error = Simple<char>> {
choice((
just('.').map(|_| Self::Working),
just('#').map(|_| Self::Broken),
just('?').map(|_| Self::Unknown)
))
}
}
struct Pattern {
grid: Vec<Vec<Cell>>
}
impl Pattern {
fn parser() -> impl Parser<char, Self, Error = Simple<char>> {
Cell::parser()
.repeated()
.at_least(1)
.then_ignore(just("\n"))
.repeated()
.at_least(1)
.map(|grid| Self { grid })
}
}
fn parser() -> impl Parser<char, Vec<Pattern>, Error = Simple<char>> {
Pattern::parser()
.separated_by(just("\n"))
.then_ignore(end())
}
fn main() -> anyhow::Result<()> {
let patterns = read("inputs/day13.txt", parser())?;
let mut rows = Vec::new();
let mut cols = Vec::new();
for Pattern { grid } in &patterns {
'i: for i in 1 .. grid.len() - 1 {
for j in 0 .. i.min(grid.len() - i) {
if grid[i - j - 1] != grid[i + j + 1] {
eprintln!("discarding cut {i} due to rows {}/{}", i - j - 1, i + j);
continue 'i;
}
}
rows.push(i);
}
println!("rows: {rows:?}");
'i: for i in 1 .. grid[0].len() - 1 {
for j in 0 .. i.min(grid[0].len() - i) {
for k in 0 .. grid.len() {
if grid[k][i - j - 1] != grid[k][i + j] {
eprintln!("discarding cut {i} due to cols {}/{}", i - j - 1, i + j);
continue 'i;
}
}
}
cols.push(i);
}
println!("cols: {cols:?}");
}
println!(
"{}",
rows.iter().sum::<usize>() + 100 * cols.iter().sum::<usize>()
);
Ok(())
}