aocc23

Advent of Code 2023
git clone git://www.tkruger.se/aocc23.git
Log | Files | Refs | README

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 }