common.c (905B)
1 #include "common.h" 2 3 static inline size_t count_occ(uint8_t *cards, uint8_t val) { 4 size_t i; 5 size_t c = 0; 6 7 for (i = 0; i < 5; i++) 8 if (cards[i] == val) 9 c++; 10 11 return c; 12 } 13 14 static inline int has_occ(uint8_t *cards, size_t val) { 15 size_t i; 16 for (i = 0; i < 5; i++) { 17 if (count_occ(cards, cards[i]) >= val) 18 return 1; 19 } 20 21 return 0; 22 } 23 24 uint64_t hand_value(hand_t h) { 25 size_t i; 26 smallset s; 27 smallset_init(&s, 64); 28 29 for (i = 0; i < 5; i++) { 30 smallset_insert(&s, h.cards[i]); 31 } 32 33 size_t card = smallset_cardinality(&s); 34 35 smallset_clear(&s); 36 37 if (card == 1) { 38 return 7; 39 } else if (card == 2) { 40 if (has_occ(h.cards, 4)) { 41 return 6; 42 } else { 43 return 5; 44 } 45 } else if (card == 3) { 46 if (has_occ(h.cards, 3)) { 47 return 4; 48 } else { 49 return 3; 50 } 51 } else if (card == 4) { 52 return 2; 53 } else { 54 return 1; 55 } 56 }