diff --git a/day11/day11.go b/day11/day11.go new file mode 100644 index 0000000..77232ab --- /dev/null +++ b/day11/day11.go @@ -0,0 +1,118 @@ +package main + +import ( + "AOC2022/helper" + "fmt" + "os" + "sort" + "strconv" + "strings" +) + +type Monkey struct { + items []int + newOperation func(item int) int + test func(item int) int + inspections int +} + +func main() { + args := os.Args[1:] + lines := helper.ReadTextFile(args[0]) + runSimulation(lines, 20, true) + runSimulation(lines, 10000, false) + +} + +func runSimulation(lines []string, turns int, part1 bool) { + monkeys, worryLimiter := getMonkeys(lines, part1) + for i := 0; i < turns; i++ { + for i := 0; i < len(monkeys); i++ { + monkey := &monkeys[i] + for _, item := range monkey.items { + monkey.inspections++ + item = monkey.newOperation(item) % worryLimiter + throwTo := monkey.test(item) + monkeys[throwTo].items = append(monkeys[throwTo].items, item) + } + monkey.items = []int{} + } + } + sort.Slice(monkeys, func(i, j int) bool { + return monkeys[i].inspections > monkeys[j].inspections + }) + fmt.Println(monkeys[0].inspections * monkeys[1].inspections) +} + +func getMonkeys(lines []string, part1 bool) ([]Monkey, int) { + var monkeys []Monkey + worryLimiter := 1 + for i := 0; i < len(lines); i += 7 { + monkey := Monkey{} + startingItemsString := lines[i+1][18:] + for _, item := range strings.Split(startingItemsString, ", ") { + monkey.items = append(monkey.items, helper.RemoveError(strconv.Atoi(item))) + } + worryLimiter *= getTest(lines, i, &monkey) + getOperation(lines, i, &monkey, part1) + monkeys = append(monkeys, monkey) + } + return monkeys, worryLimiter +} + +func getTest(lines []string, i int, monkey *Monkey) int { + divisbleby := helper.RemoveError(strconv.Atoi(lines[i+3][21:])) + returnTrue := helper.RemoveError(strconv.Atoi(lines[i+4][29:])) + returnFalse := helper.RemoveError(strconv.Atoi(lines[i+5][30:])) + monkey.test = func(item int) int { + if item%divisbleby == 0 { + return returnTrue + } + return returnFalse + } + return divisbleby +} + +func getOperation(lines []string, i int, monkey *Monkey, part1 bool) { + opertionString := lines[i+2][23:] + value, err := strconv.Atoi(opertionString[2:]) + if err == nil { + if opertionString[0] == '+' { + monkey.newOperation = func(item int) (returnVal int) { + returnVal = (item + value) + if part1 { + returnVal /= 3 + } + return + } + } + if opertionString[0] == '*' { + monkey.newOperation = func(item int) (returnVal int) { + returnVal = (item * value) + if part1 { + returnVal /= 3 + } + return + } + } + } else { + if opertionString[0] == '+' { + monkey.newOperation = func(item int) (returnVal int) { + returnVal = item + item + if part1 { + returnVal /= 3 + } + return + } + } + if opertionString[0] == '*' { + monkey.newOperation = func(item int) (returnVal int) { + returnVal = item * item + if part1 { + returnVal /= 3 + } + return + } + } + } +} diff --git a/day11/input b/day11/input new file mode 100644 index 0000000..ec27405 --- /dev/null +++ b/day11/input @@ -0,0 +1,55 @@ +Monkey 0: + Starting items: 54, 61, 97, 63, 74 + Operation: new = old * 7 + Test: divisible by 17 + If true: throw to monkey 5 + If false: throw to monkey 3 + +Monkey 1: + Starting items: 61, 70, 97, 64, 99, 83, 52, 87 + Operation: new = old + 8 + Test: divisible by 2 + If true: throw to monkey 7 + If false: throw to monkey 6 + +Monkey 2: + Starting items: 60, 67, 80, 65 + Operation: new = old * 13 + Test: divisible by 5 + If true: throw to monkey 1 + If false: throw to monkey 6 + +Monkey 3: + Starting items: 61, 70, 76, 69, 82, 56 + Operation: new = old + 7 + Test: divisible by 3 + If true: throw to monkey 5 + If false: throw to monkey 2 + +Monkey 4: + Starting items: 79, 98 + Operation: new = old + 2 + Test: divisible by 7 + If true: throw to monkey 0 + If false: throw to monkey 3 + +Monkey 5: + Starting items: 72, 79, 55 + Operation: new = old + 1 + Test: divisible by 13 + If true: throw to monkey 2 + If false: throw to monkey 1 + +Monkey 6: + Starting items: 63 + Operation: new = old + 4 + Test: divisible by 19 + If true: throw to monkey 7 + If false: throw to monkey 4 + +Monkey 7: + Starting items: 72, 51, 93, 63, 80, 86, 81 + Operation: new = old * old + Test: divisible by 11 + If true: throw to monkey 0 + If false: throw to monkey 4 \ No newline at end of file diff --git a/day11/testinput b/day11/testinput new file mode 100644 index 0000000..c04eddb --- /dev/null +++ b/day11/testinput @@ -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 \ No newline at end of file