Ok(())
}
-static CARDS: &str = "123456789TJQKA";
+static CARDS: &str = "J123456789TQKA";
#[derive(Debug, PartialEq, PartialOrd)]
enum HandType {
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];
}
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,
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)]
#[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());
}
}