advent-of-code/2022/day11/main.c

158 lines
3.6 KiB
C
Raw Permalink Normal View History

2024-05-17 15:10:54 +02:00
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Monkey_ Monkey;
typedef struct Monkey_ {
long long item[64];
int items, is_multiply, opertant_is_old, operant, test, test_true, test_false, inspections;
} Monkey;
Monkey* newMonkey()
{
char *line = NULL;
size_t size;
size_t len;
Monkey *monkey = malloc(sizeof(Monkey));
monkey->inspections = 0;
// items
len = getline(&line, &size, stdin);
char *begin = line+18;
char *token = NULL;
for (int j = 0; (token = strsep(&begin, ",")); j++)
{
// printf("%u: %s\n", j, token);
monkey->item[j] = atoi(token);
monkey->items = j+1;
}
// operation
len = getline(&line, &size, stdin);
monkey->is_multiply = line[23] == '*';
monkey->opertant_is_old = line[25] == 'o';
if (!monkey->opertant_is_old)
{
monkey->operant = atoi(line+25);
}
// test
len = getline(&line, &size, stdin);
monkey->test = atoi(line+21);
// test true
len = getline(&line, &size, stdin);
monkey->test_true = atoi(line+29);
// test true
len = getline(&line, &size, stdin);
monkey->test_false = atoi(line+30);
len = getline(&line, &size, stdin);
return monkey;
}
void inspect(Monkey *monkey, Monkey *monkeys[])
{
monkey->inspections += monkey->items;
for (int i = 0; i < monkey->items; i++)
{
// set operant
int operant = monkey->operant;
if (monkey->opertant_is_old)
operant = monkey->item[i];
// set operation
if (monkey->is_multiply)
{
monkey->item[i] *= operant;
} else {
monkey->item[i] += operant;
}
monkey->item[i] /= 3;
// throw item based on test
int throw = monkey->test_true;
if (monkey->item[i] % monkey->test != 0)
{
throw = monkey->test_false;
}
monkeys[throw]->item[monkeys[throw]->items] = monkey->item[i];
monkeys[throw]->items++;
}
monkey->items = 0;
}
int main()
{
int monkeys = 0;
Monkey *monkey[10] = { };
char *line = NULL;
size_t size;
size_t len;
int active1 = 0, active2 = 0;
while ((len = getline(&line, &size, stdin)) != -1)
{
// create monkeys
Monkey *new = newMonkey();
monkey[monkeys] = new;
monkeys++;
// print monkey attributes
printf("Items:");
for (int i = 0; i < new->items; i++)
{
printf("%lldd ", new->item[i]);
}
printf("\n %d %d %d %d %d %d\n\n",
new->is_multiply,
new->opertant_is_old,
new->operant,
new->test,
new->test_true,
new->test_false
);
}
for (int i = 0; i < 20; i++)
{
// do inspection
for (int ii = 0; ii < monkeys; ii++)
{
inspect(monkey[ii], monkey);
}
// output rounds
printf("Round %d\n", i);
for (int ii = 0; ii < monkeys; ii++)
{
printf("Monkey %d: ", ii);
for (int iii = 0; iii < monkey[ii]->items; iii++)
{
printf("%lld ", monkey[ii]->item[iii]);
}
printf("\n");
}
}
// get two most active monkeys
for (int i = 0; i < monkeys; i++)
{
if (monkey[i]->inspections > active1)
{
active2 = active1;
active1 = monkey[i]->inspections;
}
printf("Monkey %d inspected items %d times. \n", i, monkey[i]->inspections);
}
printf("Monkey biz: \n%d\n", active1 * active2);
}