diff --git a/inputs/day04example.exe b/inputs/day04example.exe new file mode 100644 index 0000000..8209399 --- /dev/null +++ b/inputs/day04example.exe @@ -0,0 +1,10 @@ +..@@.@@@@. +@@@.@.@.@@ +@@@@@.@.@@ +@.@@@@..@. +@@.@@@@.@@ +.@@@@@@@.@ +.@.@.@.@@@ +@.@@@.@@@@ +.@@@@@@@@. +@.@.@@@.@. diff --git a/src/bin/day04.rs b/src/bin/day04.rs new file mode 100644 index 0000000..2c2802f --- /dev/null +++ b/src/bin/day04.rs @@ -0,0 +1,12 @@ +use aoc_2025::day04; +use color_eyre::Report; + +fn main() -> Result<(), Report> { + color_eyre::install()?; + let data = day04::data("inputs/day04example.txt")?; + let code1 = day04::part1(&data)?; + let code2 = day04::part2(&data)?; + println!("code1: {code1}"); + println!("code2: {code2}"); + Ok(()) +} diff --git a/src/day04.rs b/src/day04.rs new file mode 100644 index 0000000..19615a7 --- /dev/null +++ b/src/day04.rs @@ -0,0 +1,85 @@ +use color_eyre::{Report, eyre::ContextCompat}; +use std::{ + fs::File, + io::{self, BufRead, BufReader, Lines}, +}; + +struct Wall { + inner: Vec, + width: usize, + height: usize, +} + +impl TryFrom> for Wall { + type Error = Report; + fn try_from(mut value: Lines) -> Result { + let width = None; + while let Some(line) = value.next() { + let line = line?; + let chars: Vec = line.chars().collect(); + let new_width = chars.len(); + if let Some(old_width) = width { + return Err(); + } + let mut inner: Vec = Vec::with_capacity(width); + for c in chars { + match c { + '#' => inner.push(true), + '.' => inner.push(false), + _ => return Err(Report::msg(format!("Invalid character in wall: {}", c))), + } + } + let height = 1; + } + Ok(Self { + inner, + width, + height, + }) + } +} + +pub fn part1(data: &Wall) -> Result { + // Ok(data + // .iter() + // .map(|v| v.part1()) + // .collect::, Report>>()? + // .iter() + // .sum::()) + Ok(0) +} + +pub fn part2(data: &Wall) -> Result { + // let first = BatteryBank::try_from(String::from("818181911112111"))?.part2()?; + // Ok(data + // .iter() + // .map(|v| v.part2()) + // .collect::, Report>>()? + // .iter() + // .sum::()) + Ok(0) +} +pub fn data(filepath: &str) -> Result { + let file = File::open(filepath)?; + let bufreader = BufReader::new(file); + let wall = Wall::try_from(bufreader.lines())?; + Ok(wall) +} + +#[cfg(test)] +mod tests { + use super::*; + use criterion::Criterion; + use criterion_macro::criterion; + + #[criterion] + fn bench_part1(b: &mut Criterion) { + let data = data("inputs/day04.txt").unwrap(); + b.bench_function("day04-part1", |b| b.iter(|| part1(&data).unwrap())); + } + #[criterion] + fn bench_part2(b: &mut Criterion) { + let data = data("inputs/day04.txt").unwrap(); + b.bench_function("day04-part2", |b| b.iter(|| part2(&data).unwrap())); + } +} diff --git a/src/lib.rs b/src/lib.rs index 866948c..512b045 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,3 +5,4 @@ extern crate test; pub mod day01; pub mod day02; pub mod day03; +pub mod day04;