deuces_rs/
card.rs

1#[derive(Debug, PartialEq)]
2pub struct Card(pub u32);
3
4impl Card {
5    pub const INT_RANKS: [u32; 13] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
6    pub const PRIMES: [u32; 13] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41];
7    pub const CHAR_RANK_TO_INT_RANK: [(char, u32); 13] = [
8        ('2', 0),
9        ('3', 1),
10        ('4', 2),
11        ('5', 3),
12        ('6', 4),
13        ('7', 5),
14        ('8', 6),
15        ('9', 7),
16        ('T', 8),
17        ('J', 9),
18        ('Q', 10),
19        ('K', 11),
20        ('A', 12),
21    ];
22    pub const CHAR_SUIT_TO_INT_SUIT: [(char, u32); 4] = [
23        ('s', 1), // spades
24        ('h', 2), // hearts
25        ('d', 4), // diamonds
26        ('c', 8), // clubs
27    ];
28
29    pub fn new(string: &str) -> Self {
30        let rank_char = string.chars().next().unwrap();
31        let suit_char = string.chars().nth(1).unwrap();
32        let rank_int = Card::CHAR_RANK_TO_INT_RANK.iter().find(|&&(r, _)| r == rank_char).unwrap().1;
33        let suit_int = Card::CHAR_SUIT_TO_INT_SUIT.iter().find(|&&(s, _)| s == suit_char).unwrap().1;
34        let rank_prime = Card::PRIMES[rank_int as usize];
35
36        let bitrank = 1 << rank_int << 16;
37        let suit = suit_int << 12;
38        let rank = rank_int << 8;
39
40        let card_int = bitrank | suit | rank | rank_prime;
41
42        Card(card_int)
43    }
44
45    pub fn prime_product_from_rankbits(rankbits: u32) -> u32 {
46        let mut product = 1;
47        for i in Card::INT_RANKS.iter() {
48            if rankbits & (1 << i) != 0 {
49                product *= Card::PRIMES[*i as usize];
50            }
51        }
52        product
53    }
54
55    pub fn prime_product_from_hand(card_ints: &[u32]) -> u32 {
56        let mut product = 1;
57        for &c in card_ints {
58            product *= c & 0xFF;
59        }
60        product
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use super::*;
67
68     #[test]
69    fn test_new() {
70        assert_eq!(Card::new("2s").0, 69634);
71        assert_eq!(Card::new("3h").0, 139523);
72        assert_eq!(Card::new("4d").0, 279045);
73        assert_eq!(Card::new("Ac").0, 268471337);
74    }
75
76    #[test]
77    fn test_prime_product_from_rankbits() {
78        assert_eq!(Card::prime_product_from_rankbits(0b1000000000001), 82);
79        assert_eq!(Card::prime_product_from_rankbits(0b1000000000010), 123);
80        assert_eq!(Card::prime_product_from_rankbits(0b1000000000100), 205);
81        assert_eq!(Card::prime_product_from_rankbits(0b1000001000000), 697);
82        assert_eq!(Card::prime_product_from_rankbits(7936), 31367009);
83        assert_eq!(Card::prime_product_from_rankbits(124), 85085);
84        assert_eq!(Card::prime_product_from_rankbits(62), 15015);
85        assert_eq!(Card::prime_product_from_rankbits(31), 2310);
86        assert_eq!(Card::prime_product_from_rankbits(4111), 8610);
87    }
88}