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), ('h', 2), ('d', 4), ('c', 8), ];
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}