This commit is contained in:
Karl Spickermann 2022-12-11 18:52:47 +01:00
parent e43af3b8bc
commit cacb123431
3 changed files with 200 additions and 0 deletions

118
day11/day11.go Normal file

@ -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
}
}
}
}

55
day11/input Normal file

@ -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

27
day11/testinput 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