]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day07 - part 2
authoralex <null>
Thu, 7 Dec 2023 11:22:13 +0000 (12:22 +0100)
committeralex <null>
Thu, 7 Dec 2023 11:31:35 +0000 (12:31 +0100)
Casse la partie 1

src/day07.rs

index 9e456d159a1c1d68802597dab0325e9991af2120..834fcc993bada1a45b329ad691d6828acba7548c 100644 (file)
@@ -19,7 +19,7 @@ pub fn run(input_file: &str) -> Result<(), Box<dyn Error>> {
     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::<HashMap<_,_>>();
+            .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::<Vec<_>>();
 
+        // 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<u32, Box<dyn Error>> {
 
 fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
     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());
     }
 }