From 851acf0703cb5db87219aaa6569a28e06bae599e Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 15 Dec 2023 10:14:25 +0100 Subject: [PATCH] Day15 - part 2 --- src/day15.rs | 88 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 80 insertions(+), 8 deletions(-) diff --git a/src/day15.rs b/src/day15.rs index 28f26ae..8d84672 100644 --- a/src/day15.rs +++ b/src/day15.rs @@ -2,6 +2,8 @@ use std::io::Read; use std::error::Error; use std::fs::File; +use std::collections::HashMap; + pub fn run(input_file: &str) -> Result<(), Box> { let mut f = File::open(input_file)?; let mut input = String::new(); @@ -16,6 +18,15 @@ pub fn run(input_file: &str) -> Result<(), Box> { Ok(()) } +fn aoc_hash(s: &str) -> u32 { + let mut r: u32 = 0; + s.as_bytes().iter() + .for_each(|&b| { + r = ((r + b as u32) * 17 ) % 256; + }); + r +} + fn run_part1(input: &str) -> Result> { println!("Running day15 - part 1"); @@ -28,12 +39,7 @@ fn run_part1(input: &str) -> Result> { match h.is_empty() { true => None, false => { - let mut r: u32 = 0; - h.as_bytes().iter() - .for_each(|&b| { - r = ((r + b as u32) * 17 ) % 256; - }); - Some(r) + Some(aoc_hash(h)) }, } }) @@ -44,7 +50,73 @@ fn run_part1(input: &str) -> Result> { fn run_part2(input: &str) -> Result> { println!("Running day15 - part 2"); - let res = 0; + + // map sur nom de la lentille + // la valeur contient le slot de la lentille et sa focale + let mut boxes: Vec> = Vec::new(); + (0..256).for_each(|_| { boxes.push(HashMap::new()); }); + + let s = match input.ends_with('\n') { + false => input, + true => &input[..input.len() - 1], + }; + s.split(',') + .filter(|h| !h.is_empty()) + .for_each(|h| { + let (label, n_lens) = h.split_once(['-', '=']).unwrap(); + let box_n: usize = aoc_hash(label) as usize; + match n_lens { + "" => { + // supprimer les lentilles + let value = boxes[box_n].remove(label); + // déplacer les slots des lentilles restantes + if value.is_some() { + let removed_slot = value.unwrap().0; + let b = &mut boxes[box_n]; + b.iter_mut() + .for_each(|value| { // label => (slot, focal) + if value.1.0 > removed_slot { + value.1.0 -= 1; + } + }); + } + }, + _ => { + match boxes[box_n].get_mut(label) { + Some(value) => { // (slot, label) + // remplacer les lentilles + value.1 = n_lens.parse().unwrap(); + }, + None => { + // ajouter les lentilles + let slot = boxes[box_n].values() + .map(|(i,_)| i) + .max(); + let slot = match slot { + Some(s) => s + 1, + None => 0, + }; + boxes[box_n].insert( + label.to_string(), + (slot, n_lens.parse().unwrap()) + ); + }, + } + }, + } + }); + + let res = boxes.iter().enumerate() + .map(|(i, b)| { + b.iter() + .map(|(_, (slot, focal))| { + //println!("{} = i: {} slot: {} focal: {}", label, i + 1, slot + 1, focal); + // focusing power + (i as u32 + 1) * (*slot as u32 + 1) * focal + }) + .sum::() + }) + .sum(); Ok(res) } @@ -63,6 +135,6 @@ mod tests { #[test] fn day15_part2() { let res = run_part2(TEXT_INPUT); - assert_eq!(0, res.unwrap()); + assert_eq!(145, res.unwrap()); } } -- 2.39.5