Advertisement
sarumeister

AoC-2022 Day 3b -- single pass approach

Dec 3rd, 2022
642
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.51 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. const char* input = R"(vJrwpWtwJgWrhcsFMMfFFhFp
  4. jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
  5. PmmdzqPrVvPwwTWBwg
  6. wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
  7. ttgJtRGJQctTZtZT
  8. CrZsJsPPZsGzwwsLwLmpwMDw
  9. )";
  10.  
  11. int getPriority(char c)
  12. {
  13.     if (c > 'Z')
  14.         return c - 'a' + 1;
  15.     return c - 'A' + 27;
  16. }
  17.  
  18. int processSack(int from, int count, int tripletPos)
  19. {
  20.     static char basket[52] = { 0 };
  21.  
  22.     if (0 == tripletPos)
  23.         memset(basket, 0, sizeof basket);
  24.    
  25.     for (int i = 0; i < count; i++)
  26.     {
  27.         char c = input[from + i];
  28.         int priority = getPriority(c);
  29.         basket[priority - 1] |= (1 << tripletPos);
  30.         if (0b0111 == basket[priority - 1])
  31.             return priority;
  32.     }
  33.  
  34.     return 0;
  35. }
  36.  
  37. int main()
  38. {
  39.     int sum = 0;
  40.  
  41.     int from = 0;
  42.     int count = 0;
  43.     int tripletPos = 0;
  44.  
  45.     while (input[from + count])
  46.     {
  47.         count++;
  48.         char c = input[from + count];
  49.         if ('\n' == c)
  50.         {
  51.             if (count % 2)  
  52.                 return -1; // odd count of items => input error
  53.  
  54.             sum += processSack(from, count, tripletPos);
  55.             from += count + 1;
  56.             count = 0;
  57.             tripletPos++;
  58.             tripletPos = tripletPos % 3;
  59.             continue;
  60.         }
  61.  
  62.         if ((c >= 'a') && (c <= 'z'))
  63.             continue;
  64.  
  65.         if ((c >= 'A') && (c <= 'Z'))
  66.             continue;
  67.  
  68.         return -1; // invalid character => input error
  69.     }
  70.  
  71.     printf("%d\n", sum);
  72.     return 0;
  73. }
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement