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