2022 day11
This commit is contained in:
		
							parent
							
								
									0537a2bae5
								
							
						
					
					
						commit
						a1895fe157
					
				
							
								
								
									
										27
									
								
								2022/day11/input1.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								2022/day11/input1.txt
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					Monkey 0:
 | 
				
			||||||
 | 
					  Starting items: 79, 98
 | 
				
			||||||
 | 
					  Operation: new = old * 19
 | 
				
			||||||
 | 
					  Test: divisible by 23
 | 
				
			||||||
 | 
					    If true: throw to monkey 2
 | 
				
			||||||
 | 
					    If false: throw to monkey 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 1:
 | 
				
			||||||
 | 
					  Starting items: 54, 65, 75, 74
 | 
				
			||||||
 | 
					  Operation: new = old + 6
 | 
				
			||||||
 | 
					  Test: divisible by 19
 | 
				
			||||||
 | 
					    If true: throw to monkey 2
 | 
				
			||||||
 | 
					    If false: throw to monkey 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 2:
 | 
				
			||||||
 | 
					  Starting items: 79, 60, 97
 | 
				
			||||||
 | 
					  Operation: new = old * old
 | 
				
			||||||
 | 
					  Test: divisible by 13
 | 
				
			||||||
 | 
					    If true: throw to monkey 1
 | 
				
			||||||
 | 
					    If false: throw to monkey 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 3:
 | 
				
			||||||
 | 
					  Starting items: 74
 | 
				
			||||||
 | 
					  Operation: new = old + 3
 | 
				
			||||||
 | 
					  Test: divisible by 17
 | 
				
			||||||
 | 
					    If true: throw to monkey 0
 | 
				
			||||||
 | 
					    If false: throw to monkey 1
 | 
				
			||||||
							
								
								
									
										55
									
								
								2022/day11/input2.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								2022/day11/input2.txt
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,55 @@
 | 
				
			||||||
 | 
					Monkey 0:
 | 
				
			||||||
 | 
					  Starting items: 99, 67, 92, 61, 83, 64, 98
 | 
				
			||||||
 | 
					  Operation: new = old * 17
 | 
				
			||||||
 | 
					  Test: divisible by 3
 | 
				
			||||||
 | 
					    If true: throw to monkey 4
 | 
				
			||||||
 | 
					    If false: throw to monkey 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 1:
 | 
				
			||||||
 | 
					  Starting items: 78, 74, 88, 89, 50
 | 
				
			||||||
 | 
					  Operation: new = old * 11
 | 
				
			||||||
 | 
					  Test: divisible by 5
 | 
				
			||||||
 | 
					    If true: throw to monkey 3
 | 
				
			||||||
 | 
					    If false: throw to monkey 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 2:
 | 
				
			||||||
 | 
					  Starting items: 98, 91
 | 
				
			||||||
 | 
					  Operation: new = old + 4
 | 
				
			||||||
 | 
					  Test: divisible by 2
 | 
				
			||||||
 | 
					    If true: throw to monkey 6
 | 
				
			||||||
 | 
					    If false: throw to monkey 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 3:
 | 
				
			||||||
 | 
					  Starting items: 59, 72, 94, 91, 79, 88, 94, 51
 | 
				
			||||||
 | 
					  Operation: new = old * old
 | 
				
			||||||
 | 
					  Test: divisible by 13
 | 
				
			||||||
 | 
					    If true: throw to monkey 0
 | 
				
			||||||
 | 
					    If false: throw to monkey 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 4:
 | 
				
			||||||
 | 
					  Starting items: 95, 72, 78
 | 
				
			||||||
 | 
					  Operation: new = old + 7
 | 
				
			||||||
 | 
					  Test: divisible by 11
 | 
				
			||||||
 | 
					    If true: throw to monkey 7
 | 
				
			||||||
 | 
					    If false: throw to monkey 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 5:
 | 
				
			||||||
 | 
					  Starting items: 76
 | 
				
			||||||
 | 
					  Operation: new = old + 8
 | 
				
			||||||
 | 
					  Test: divisible by 17
 | 
				
			||||||
 | 
					    If true: throw to monkey 0
 | 
				
			||||||
 | 
					    If false: throw to monkey 2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 6:
 | 
				
			||||||
 | 
					  Starting items: 69, 60, 53, 89, 71, 88
 | 
				
			||||||
 | 
					  Operation: new = old + 5
 | 
				
			||||||
 | 
					  Test: divisible by 19
 | 
				
			||||||
 | 
					    If true: throw to monkey 7
 | 
				
			||||||
 | 
					    If false: throw to monkey 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Monkey 7:
 | 
				
			||||||
 | 
					  Starting items: 72, 54, 63, 80
 | 
				
			||||||
 | 
					  Operation: new = old + 3
 | 
				
			||||||
 | 
					  Test: divisible by 7
 | 
				
			||||||
 | 
					    If true: throw to monkey 1
 | 
				
			||||||
 | 
					    If false: throw to monkey 3
 | 
				
			||||||
							
								
								
									
										157
									
								
								2022/day11/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								2022/day11/main.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,157 @@
 | 
				
			||||||
 | 
					#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);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										165
									
								
								2022/day11/main2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								2022/day11/main2.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,165 @@
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <gmp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct Monkey_ Monkey;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct Monkey_ {
 | 
				
			||||||
 | 
					    mpz_t 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);
 | 
				
			||||||
 | 
					        mpz_init_set_str(monkey->item[j], token, 10);
 | 
				
			||||||
 | 
					        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
 | 
				
			||||||
 | 
					        mpz_t operant; //= monkey->operant;
 | 
				
			||||||
 | 
					        mpz_init_set_si(operant, monkey->operant);
 | 
				
			||||||
 | 
					        if (monkey->opertant_is_old)
 | 
				
			||||||
 | 
					            mpz_init_set(operant, monkey->item[i]);
 | 
				
			||||||
 | 
					            // operant = monkey->item[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // set operation
 | 
				
			||||||
 | 
					        if (monkey->is_multiply) 
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // monkey->item[i] *= operant;
 | 
				
			||||||
 | 
					            mpz_mul(monkey->item[i], monkey->item[i], operant);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // monkey->item[i] += operant;
 | 
				
			||||||
 | 
					            mpz_add(monkey->item[i], monkey->item[i], operant);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // monkey->item[i] /= 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // throw item based on test
 | 
				
			||||||
 | 
					        int throw = monkey->test_true;
 | 
				
			||||||
 | 
					        if (!mpz_divisible_ui_p(monkey->item[i], monkey->test))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            throw = monkey->test_false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // monkeys[throw]->item[monkeys[throw]->items] = monkey->item[i];
 | 
				
			||||||
 | 
					        mpz_set(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;
 | 
				
			||||||
 | 
					    long long 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 < 10000; 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%lld\n", active1 * active2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										214
									
								
								2022/day11/main3.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								2022/day11/main3.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,214 @@
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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<<i<<"\t";
 | 
				
			||||||
 | 
					            if (num % i != 0)
 | 
				
			||||||
 | 
					                num *= i;
 | 
				
			||||||
 | 
					            n = n/i;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (n > 2)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (num % n != 0)
 | 
				
			||||||
 | 
					            num *= n;
 | 
				
			||||||
 | 
					        // cout<<n<<"\t";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return num;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void inspect(Monkey *monkey, Monkey *monkeys[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    monkey->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);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										25
									
								
								2022/day11/test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								2022/day11/test.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					int main()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int n;
 | 
				
			||||||
 | 
					    int num = 1;
 | 
				
			||||||
 | 
					    printf("Enter the number you want: ");
 | 
				
			||||||
 | 
					    scanf("%d", &n);
 | 
				
			||||||
 | 
					    for(int i=2; i*i<=n; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        while(n%i==0)//find all the occurrences of a prime factor
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            printf("%d\n",i);
 | 
				
			||||||
 | 
					            if (num % i != 0)
 | 
				
			||||||
 | 
					                num *= i;
 | 
				
			||||||
 | 
					            n/=i;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if(n!=1)//if the number was originally a prime
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf("%d",n);
 | 
				
			||||||
 | 
					        num *= n;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    printf("new %d\n", num);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in a new issue