aocc22

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

common.c (1269B)


      1 #include "common.h"
      2 
      3 int64_t snafu2i64(const char *str, const size_t len) {
      4   assert(len < 27);
      5 
      6   int64_t r = 0;
      7 
      8   size_t i;
      9   for (i = 0; i < len; i++) {
     10     r *= 5;
     11     if (str[i] == '1') {
     12       r += 1;
     13     } else if (str[i] == '2') {
     14       r += 2;
     15     } else if (str[i] == '0') {
     16       r += 0; // hah
     17     } else if (str[i] == '-') {
     18       r -= 1;
     19     } else if (str[i] == '=') {
     20       r -= 2;
     21     } else {
     22       fprintf(stderr, "Error! Bad SNAFU char %c\n", str[i]);
     23       exit(1);
     24     }
     25   }
     26 
     27   return r;
     28 }
     29 
     30 static inline void strrev(char *buf, const size_t len) {
     31   size_t i = 0;
     32   while (i < len - i - 1) {
     33     buf[i] ^= buf[len - i - 1] ^= buf[i] ^= buf[len - i - 1];
     34     i++;
     35   }
     36 }
     37 
     38 void i64_2snafu(char *buffer, const size_t buffer_len, const int64_t x) {
     39   int64_t t = x;
     40   size_t i = 0;
     41 
     42   while (t > 0) {
     43     assert(i < buffer_len - 1);
     44     switch (t % 5) {
     45     case 0:
     46       buffer[i] = '0';
     47       t /= 5;
     48       break;
     49     case 1:
     50       buffer[i] = '1';
     51       t = t / 5;
     52       break;
     53     case 2:
     54       buffer[i] = '2';
     55       t = t / 5;
     56       break;
     57     case 3:
     58       buffer[i] = '=';
     59       t = (t + 2) / 5;
     60       break;
     61     case 4:
     62       buffer[i] = '-';
     63       t = (t + 1) / 5;
     64       break;
     65     }
     66     i++;
     67   }
     68 
     69   buffer[i] = '\0';
     70   strrev(buffer, i);
     71 }