#include #include #include #include typedef struct Monkey_ Monkey; typedef struct Monkey_ { __uint128_t item[64]; __uint128_t 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; } // int priminice(int n) // { // int isPrime; // int num = 1; // for (int i = 2; i <= n; i++) // { // if(n % i == 0) // { // isPrime = 1; // for (int j = 2; j <= i/2; j++) // { // if(i % j == 0) // { // isPrime = 0; // break; // } // } // if(isPrime == 1) // { // // printf("\n %d is a Prime Factor ", i); // if ( num % i != 0 ) // { // num *= i; // } // } // } // } // return num; // } __uint128_t priminice(__uint128_t n) { __uint128_t num = 1; while (n%2 == 0){ // cout<<"2\t"; if ( num % 2 != 0) num *= 2; n = n/2; } for (int i = 3; i*i <= n; i = i+2){ while (n%i == 0){ // cout< 2) { if (num % n != 0) num *= n; // cout<inspections += monkey->items; for (int i = 0; i < monkey->items; i++) { // set operant __uint128_t 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] = priminice(monkey->item[i]); monkeys[throw]->items++; } monkey->items = 0; } int main(int argc, char *argv[]) { int monkeys = 0; Monkey *monkey[10] = { }; char *line = NULL; size_t size; size_t len; __uint128_t 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("%lud ", 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 < atoi(argv[1]); 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("%lu ", 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%lu %lu %lu\n", active1, active2, active1 * active2); }