aoc

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

main2.c (4186B)


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