From a62d9413c5297096d85a2a34eb1436486e3e203b Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 7 Dec 2023 12:22:13 +0100 Subject: [PATCH] Day07 - part 2 Casse la partie 1 --- src/day07.rs | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/src/day07.rs b/src/day07.rs index 9e456d1..834fcc9 100644 --- a/src/day07.rs +++ b/src/day07.rs @@ -19,7 +19,7 @@ pub fn run(input_file: &str) -> Result<(), Box> { Ok(()) } -static CARDS: &str = "123456789TJQKA"; +static CARDS: &str = "J123456789TQKA"; #[derive(Debug, PartialEq, PartialOrd)] enum HandType { @@ -39,7 +39,6 @@ struct Hand { hand_type: HandType, } -// TODO implémenter l'ordre impl Hand { pub fn new(cards: &str, bid: u32) -> Self { let mut hand_cards: [ char ; 5 ] = [ '\0' ; 5]; @@ -54,19 +53,34 @@ impl Hand { } pub fn find_type(cards: [char; 5]) -> HandType { - let mut map = CARDS.chars() + let mut map: HashMap<_, u32> = CARDS.chars() .map(|c| (c, 0_u32)) - .collect::>(); + .collect(); cards.into_iter() .for_each(|c| { map.insert(c, map.get(&c).unwrap() + 1); }); + // prendre en compte les jokers J + let jokers: u32 = match map.get(&'J') { + Some(j) => *j, + _ => 0_u32, + }; + // on ne conserve que le type de cartes de la main et leur nombre // d'occurrence - let occurrence = map.into_iter() - .filter(|(_,v)| v > &0) + // attention: si 5 jokers, on les garde + let mut occurrence = map.into_iter() + .filter(|(k,v)| (v > &0 && k != &'J') || (k == &'J' && v == &5)) .map(|(_,v)| v) .collect::>(); + // trie des occurences par ordre décroissant + occurrence.sort_by(|a, b| b.cmp(&a)); + // les J sont associées aux cartes ayant le plus d'occurrence + // sauf si toutes les cartes sont des J + if occurrence[0] < 5 { + occurrence[0] += jokers; + } + match occurrence.len() { 5 => HandType::HighCard, 4 => HandType::OnePair, @@ -135,8 +149,7 @@ fn run_part1(input: &str) -> Result> { fn run_part2(input: &str) -> Result> { println!("Running day07 - part 2"); - let res = 0; - Ok(res) + run_part1(input) } #[cfg(test)] @@ -160,6 +173,13 @@ QQQJA 483 #[test] fn day07_part2() { let res = run_part2(TEXT_INPUT); - assert_eq!(0, res.unwrap()); + assert_eq!(5905, res.unwrap()); + } + + #[test] + fn day07_only_jokers() { + let input = "JJJJJ 10"; + let res = run_part2(&input); + assert_eq!(10, res.unwrap()); } } -- 2.39.5