From 66d884e298c2b7c6598c61cff25df976fd75bb34 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Wed, 17 Aug 2022 20:21:01 +0200 Subject: [PATCH] add more code for 54 (WIP) --- src/euler31/src/main.rs | 2 +- src/euler54/src/main.rs | 50 +++++++++++++++++++++++++++++++---------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/euler31/src/main.rs b/src/euler31/src/main.rs index 61cf129..b35d49e 100644 --- a/src/euler31/src/main.rs +++ b/src/euler31/src/main.rs @@ -9,5 +9,5 @@ fn main() { ways[i] += ways[i - value]; } } - println!("{:#?}", ways); + println!("{}", ways[TARGET]); } diff --git a/src/euler54/src/main.rs b/src/euler54/src/main.rs index 9884442..6bca5e7 100644 --- a/src/euler54/src/main.rs +++ b/src/euler54/src/main.rs @@ -6,6 +6,7 @@ fn main() { println!("Hello, world!"); } +#[derive(Debug, PartialEq)] struct Card { value: Value, suit: Suit, @@ -21,6 +22,7 @@ impl Card { } } +#[derive(Debug, PartialEq, Hash, Eq, Clone)] enum Suit { Diamonds, Hearts, @@ -40,6 +42,7 @@ impl Suit { } } +#[derive(Debug, PartialEq)] enum Value { Two, Three, @@ -119,18 +122,33 @@ impl Hand { fn from_line(line: &str) -> Self { assert_eq!(line.len(), 14); let vec: Vec<_> = line.split_whitespace().map(Card::from_str).collect(); - let cards = vec.try_into().unwrap_or_else(|_| panic!()); + let cards: [Card; 5] = vec.try_into().unwrap_or_else(|_| panic!()); let evaluation = Evaluation::from_cards(&cards); Self { cards, evaluation } } } +trait Contains { + fn contains_value(&self, x: T) -> bool; +} + +impl Contains for &[Card] { + fn contains_value(&self, x: Value) -> bool { + for card in self.iter() { + if card.value == x { + return true; + } + } + false + } +} + impl Evaluation { - fn from_cards(cards: &[Card; 5]) -> Self { + fn from_cards(cards: &[Card]) -> Self { todo!() } - fn is_royal_flush(cards: &[Card; 5]) -> Option { + fn is_royal_flush(cards: &[Card]) -> Option { let values = [ Value::Ten, Value::Jack, @@ -139,28 +157,36 @@ impl Evaluation { Value::Ace, ]; for value in values { - if !cards.contains_val(value) { + if !cards.contains_value(value) { return None; } } - let mut suits = HashSet::new(); - for card in cards { - suits.insert(card.suit) + if Self::have_matching_suits(cards) { + Some(cards[0].suit.clone()) + } else { + None } - if suits.len() == 1 { - Some(suits.iter().next().unwrap()) - + } - } else { None } + fn have_matching_suits(cards: &[Card]) -> bool { + let first_suit = &cards[0].suit; + for card in cards { + if &card.suit != first_suit { + return false; + } + } + true + } } #[cfg(test)] mod test { - use crate::Game; + use crate::{Card, Game}; #[test] fn example1() { let line = "5H 5C 6S 7S KD 2C 3S 8S 8D TD"; let game = Game::from_line(line); + assert_eq!(game.player1.cards[0], Card::from_str("5H")); } }