aoc

advent of code
git clone git://source.orangerot.dev:/aoc.git
Log | Files | Refs

main.c (3715B)


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 
      5 typedef struct Monkey_ Monkey;
      6 
      7 typedef struct Monkey_ {
      8     long long item[64];
      9     int items, is_multiply, opertant_is_old, operant, test, test_true, test_false, inspections;
     10 } Monkey;
     11 
     12 Monkey* newMonkey() 
     13 {
     14     char *line = NULL;
     15     size_t size;
     16     size_t len;
     17     Monkey *monkey = malloc(sizeof(Monkey));
     18     monkey->inspections = 0;
     19     // items
     20     len = getline(&line, &size, stdin);
     21 
     22     char *begin = line+18;
     23     char *token = NULL;
     24     for (int j = 0; (token = strsep(&begin, ",")); j++) 
     25     {
     26         // printf("%u: %s\n", j, token);
     27         monkey->item[j] = atoi(token);
     28         monkey->items = j+1;
     29     }
     30 
     31     // operation
     32     len = getline(&line, &size, stdin);
     33     monkey->is_multiply = line[23] == '*';
     34     monkey->opertant_is_old = line[25] == 'o';
     35     if (!monkey->opertant_is_old)
     36     {
     37         monkey->operant = atoi(line+25);
     38     }
     39 
     40     // test
     41     len = getline(&line, &size, stdin);
     42     monkey->test = atoi(line+21);
     43 
     44     // test true
     45     len = getline(&line, &size, stdin);
     46     monkey->test_true = atoi(line+29);
     47 
     48     // test true
     49     len = getline(&line, &size, stdin);
     50     monkey->test_false = atoi(line+30);
     51 
     52     len = getline(&line, &size, stdin);
     53     return monkey;
     54 }
     55 
     56 void inspect(Monkey *monkey, Monkey *monkeys[])
     57 {
     58     monkey->inspections += monkey->items;
     59     for (int i = 0; i < monkey->items; i++)
     60     {
     61         // set operant
     62         int operant = monkey->operant;
     63         if (monkey->opertant_is_old)
     64             operant = monkey->item[i];
     65 
     66         // set operation
     67         if (monkey->is_multiply) 
     68         {
     69             monkey->item[i] *= operant;
     70         } else {
     71             monkey->item[i] += operant;
     72         }
     73 
     74         monkey->item[i] /= 3;
     75 
     76         // throw item based on test
     77         int throw = monkey->test_true;
     78         if (monkey->item[i] % monkey->test != 0)
     79         {
     80             throw = monkey->test_false;
     81         }
     82 
     83         monkeys[throw]->item[monkeys[throw]->items] = monkey->item[i];
     84         monkeys[throw]->items++;
     85     }
     86     monkey->items = 0;
     87 }
     88 
     89 int main()
     90 {
     91 
     92     int monkeys = 0;
     93     Monkey *monkey[10] = { };
     94 
     95     char *line = NULL;
     96     size_t size;
     97     size_t len;
     98     int active1 = 0, active2 = 0;
     99 
    100     while ((len = getline(&line, &size, stdin)) != -1)
    101     {
    102         // create monkeys
    103         Monkey *new = newMonkey();
    104         monkey[monkeys] = new;
    105         monkeys++;
    106         
    107         // print monkey attributes
    108         printf("Items:");
    109         for (int i = 0; i < new->items; i++)
    110         {
    111             printf("%lldd ", new->item[i]);
    112         }
    113         printf("\n %d %d %d %d %d %d\n\n",
    114             new->is_multiply,
    115             new->opertant_is_old,
    116             new->operant,
    117             new->test,
    118             new->test_true,
    119             new->test_false
    120                 );
    121     }
    122 
    123     for (int i = 0; i < 20; i++)
    124     {
    125         // do inspection
    126         for (int ii = 0; ii < monkeys; ii++)
    127         {
    128             inspect(monkey[ii], monkey);
    129         }
    130         
    131         // output rounds
    132         printf("Round %d\n", i);
    133         for (int ii = 0; ii < monkeys; ii++)
    134         {
    135             printf("Monkey %d: ", ii);
    136             for (int iii = 0; iii < monkey[ii]->items; iii++)
    137             {
    138                 printf("%lld ", monkey[ii]->item[iii]);
    139             }
    140             printf("\n");
    141         }
    142     }
    143     
    144     // get two most active monkeys
    145     for (int i = 0; i < monkeys; i++)
    146     {
    147         if (monkey[i]->inspections > active1) 
    148         {
    149             active2 = active1;
    150             active1 = monkey[i]->inspections;
    151         }
    152         printf("Monkey %d inspected items %d times. \n", i, monkey[i]->inspections);
    153     }
    154 
    155     printf("Monkey biz: \n%d\n", active1 * active2);
    156 }
    157