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