add 54 (WIP)

This commit is contained in:
timeshifter
2022-08-16 22:45:07 +02:00
parent 1463b36617
commit 67f8a0a2ea
2 changed files with 174 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
[package]
name = "euler54"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+166
View File
@@ -0,0 +1,166 @@
use std::collections::{HashMap, HashSet};
#[allow(dead_code)]
fn main() {
println!("Hello, world!");
}
struct Card {
value: Value,
suit: Suit,
}
impl Card {
fn from_str(s: &str) -> Self {
assert_eq!(s.len(), 2);
let mut chars = s.chars();
let value = Value::from_char(chars.next().unwrap());
let suit = Suit::from_char(chars.next().unwrap());
Self { value, suit }
}
}
enum Suit {
Diamonds,
Hearts,
Spades,
Clubs,
}
impl Suit {
fn from_char(c: char) -> Self {
match c {
'D' => Self::Diamonds,
'H' => Self::Hearts,
'S' => Self::Spades,
'C' => Self::Clubs,
_ => panic!(),
}
}
}
enum Value {
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King,
Ace,
}
impl Value {
fn from_char(c: char) -> Self {
match c {
'2' => Self::Two,
'3' => Self::Three,
'4' => Self::Four,
'5' => Self::Five,
'6' => Self::Six,
'7' => Self::Seven,
'8' => Self::Eight,
'9' => Self::Nine,
'T' => Self::Ten,
'J' => Self::Jack,
'Q' => Self::Queen,
'K' => Self::King,
'A' => Self::Ace,
_ => panic!("{c}"),
}
}
}
struct Hand {
cards: [Card; 5],
evaluation: Evaluation,
}
struct Game {
player1: Hand,
player2: Hand,
}
enum Evaluation {
High,
OnePair,
TwoPair,
ThreeOfAKind,
Straight,
Flush,
FullHouse,
FourOfAKind,
StraightFlush,
RoyalFlush,
}
impl Game {
fn from_line(line: &str) -> Self {
assert_eq!(line.len(), 29);
let (p1, p2) = Self::divide_into_two_hands(line);
let player1 = Hand::from_line(p1);
let player2 = Hand::from_line(p2);
Self { player1, player2 }
}
fn divide_into_two_hands(line: &str) -> (&str, &str) {
let (p1, p2) = line.split_at(15);
(&p1[..14], p2)
}
}
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 evaluation = Evaluation::from_cards(&cards);
Self { cards, evaluation }
}
}
impl Evaluation {
fn from_cards(cards: &[Card; 5]) -> Self {
todo!()
}
fn is_royal_flush(cards: &[Card; 5]) -> Option<Suit> {
let values = [
Value::Ten,
Value::Jack,
Value::Queen,
Value::King,
Value::Ace,
];
for value in values {
if !cards.contains_val(value) {
return None;
}
}
let mut suits = HashSet::new();
for card in cards {
suits.insert(card.suit)
}
if suits.len() == 1 {
Some(suits.iter().next().unwrap())
} else { None }
}
#[cfg(test)]
mod test {
use crate::Game;
#[test]
fn example1() {
let line = "5H 5C 6S 7S KD 2C 3S 8S 8D TD";
let game = Game::from_line(line);
}
}