Browse Source

It's crazy

Piotr Czajkowski 1 year ago
parent
commit
a248f630e6
1 changed files with 16 additions and 33 deletions
  1. 16 33
      11/code.go

+ 16 - 33
11/code.go

@@ -4,8 +4,8 @@ import (
 	"bufio"
 	"fmt"
 	"log"
-	"math"
 	"os"
+	"sort"
 	"strconv"
 	"strings"
 )
@@ -145,28 +145,16 @@ func performOperation(mon monkey, itemIndex int) int {
 		y = mon.op.y.val
 	}
 
-	var result int
 	if mon.op.action == '+' {
-		if x > math.MaxInt-y {
-			result = mon.items[itemIndex]
-		} else {
-			result = x + y
-		}
-	} else {
-		if x > math.MaxInt/y {
-			result = mon.items[itemIndex]
-		} else {
-			result = x * y
-		}
+		return x + y
 	}
 
-	return result
+	return x * y
 }
 
-func processMonkey(index int, monkeys []monkey, relief int) []monkey {
+func processMonkey(index int, monkeys []monkey, relief int, divider int) []monkey {
 	for i := range monkeys[index].items {
-		worryLevel := performOperation(monkeys[index], i)
-		worryLevel /= relief
+		worryLevel := performOperation(monkeys[index], i) / relief % divider
 
 		if worryLevel%monkeys[index].test == 0 {
 			monkeys[monkeys[index].iftrue].items = append(monkeys[monkeys[index].iftrue].items, worryLevel)
@@ -181,24 +169,15 @@ func processMonkey(index int, monkeys []monkey, relief int) []monkey {
 	return monkeys
 }
 
-func process(monkeys []monkey, rounds int, relief int) int {
+func process(monkeys []monkey, rounds int, relief int, divider int) int {
 	for i := 0; i < rounds; i++ {
 		for m := range monkeys {
-			monkeys = processMonkey(m, monkeys, relief)
+			monkeys = processMonkey(m, monkeys, relief, divider)
 		}
 	}
 
-	first := 0
-	second := 0
-	for i := range monkeys {
-		if monkeys[i].counter > first {
-			second = first
-			first = monkeys[i].counter
-		}
-	}
-
-	fmt.Println(first, second)
-	return first * second
+	sort.Slice(monkeys, func(i, j int) bool { return monkeys[i].counter > monkeys[j].counter })
+	return monkeys[0].counter * monkeys[1].counter
 }
 
 func main() {
@@ -219,7 +198,11 @@ func main() {
 		originalMonkeys[i] = monkeys[i]
 	}
 
-	fmt.Println("Part1:", process(monkeys, 20, 3))
-	fmt.Println("Part2:", process(originalMonkeys, 1000, 1))
-	fmt.Println(originalMonkeys)
+	divider := 1
+	for i := range monkeys {
+		divider *= monkeys[i].test
+	}
+
+	fmt.Println("Part1:", process(monkeys, 20, 3, divider))
+	fmt.Println("Part2:", process(originalMonkeys, 10000, 1, divider))
 }