From 44f085ef9f6d643e2a188c6a0c064eba0fb2c474 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 14 Dec 2023 13:33:54 +0100 Subject: [PATCH] Day14 - part 1 --- src/day14.rs | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 2 + 2 files changed, 114 insertions(+) create mode 100644 src/day14.rs diff --git a/src/day14.rs b/src/day14.rs new file mode 100644 index 0000000..20ad187 --- /dev/null +++ b/src/day14.rs @@ -0,0 +1,112 @@ +use std::io::Read; +use std::error::Error; +use std::fs::File; + +pub fn run(input_file: &str) -> Result<(), Box> { + let mut f = File::open(input_file)?; + let mut input = String::new(); + f.read_to_string(&mut input)?; + + let res = run_part1(&input)?; + println!("{res}"); + + let res = run_part2(&input)?; + println!("{res}"); + + Ok(()) +} + +fn run_part1(input: &str) -> Result> { + println!("Running day14 - part 1"); + + let mut rows: Vec> = input.lines() + .filter_map(|l| { + match l.is_empty() { + true => None, + false => { + Some(l.chars().collect::>()) + }, + } + }) + .collect(); + //rows.iter().for_each(|r| { println!("{:?}", r); }); + + let height = rows.len(); + let width = rows[0].len(); + for i in 0..width { + let mut j = 0; + while j < height { + while j < height && rows[j][i] != 'O' { + j += 1; + } + if j >= height { + continue; + } + if rows[j][i] == 'O' { + if j == 0 { + j += 1; + continue; + } + let mut k = j; + while k > 0 && rows[k - 1][i] == '.' { + k -= 1; + } + rows[j][i] = '.'; + rows[k][i] = 'O'; + //println!("{:2} swap: {} -> {}", i, j, k); + //rows.iter().for_each(|r| { println!("{:?}", r); }); + } + j += 1; + } + } + + let res = rows.iter().enumerate() + .map(|(i, r)| { + let s: u64 = r.iter() + .filter_map(|c| { + match c { + 'O' => Some(1), + _ => None, + } + }) + .sum(); + s * (height - i) as u64 + }) + .sum(); + Ok(res) +} + +fn run_part2(input: &str) -> Result> { + println!("Running day14 - part 2"); + let res = 0; + Ok(res) +} + +#[cfg(test)] +mod tests { + use super::*; + + static TEXT_INPUT: &str = "\ +O....#.... +O.OO#....# +.....##... +OO.#O....O +.O.....O#. +O.#..O.#.# +..O..#O..O +.......O.. +#....###.. +#OO..#...."; + + #[test] + fn day14_part1() { + let res = run_part1(TEXT_INPUT); + assert_eq!(136, res.unwrap()); + } + + #[test] + fn day14_part2() { + let res = run_part2(TEXT_INPUT); + assert_eq!(0, res.unwrap()); + } +} diff --git a/src/main.rs b/src/main.rs index 88d4d8e..6c63e78 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,6 +14,7 @@ pub mod day08; pub mod day09; pub mod day10; pub mod day11; +pub mod day14; fn main() { let args: Vec = env::args().collect(); @@ -43,6 +44,7 @@ fn run(day: &str, input_file: &str) -> Result<(), Box> { "day09" => day09::run(input_file)?, "day10" => day10::run(input_file)?, "day11" => day11::run(input_file)?, + "day14" => day14::run(input_file)?, _ => return Err(format!("unknown day \"{day}\"").into()), } Ok(()) -- 2.39.5