Browse Source

A bit of wikipedia and 3 times faster

Piotr Czajkowski 5 months ago
parent
commit
16aa4e70d1
1 changed files with 24 additions and 28 deletions
  1. 24 28
      08/code.go

+ 24 - 28
08/code.go

@@ -68,48 +68,44 @@ func atGoal(starts string, goal string) bool {
 	return strings.HasSuffix(starts, goal)
 }
 
-func min(results []int) int {
-	m := results[0]
-	for i := range results {
-		if results[i] < m {
-			m = results[i]
-		}
+func max(a, b int) int {
+	if a > b {
+		return a
 	}
 
-	return m
+	return b
 }
 
-func check(number int, numbers []int) bool {
-	for i := range numbers {
-		if number%numbers[i] != 0 {
-			return false
-		}
+func min(a, b int) int {
+	if a < b {
+		return a
 	}
 
-	return true
+	return b
 }
 
-func calculateResult(results []int) int {
-	if len(results) == 1 {
-		return results[0]
+func gcd(a, b int) int {
+	if a == 0 {
+		return b
 	}
 
-	min := min(results)
-	current := min
-	for {
-		if check(current, results) {
-			break
-		}
-
-		current += min
+	if b == 0 {
+		return a
 	}
 
-	return current
+	l := min(a, b)
+	h := max(a, b)
+
+	return gcd(l, h%l)
+}
+
+func lcm(a, b int) int {
+	return (a * b) / gcd(a, b)
 }
 
 func part(network Network, starts []string, goal string) int {
 	mod := len(network.moves)
-	var results []int
+	result := 1
 	for i := range starts {
 		steps := 0
 		index := 0
@@ -131,10 +127,10 @@ func part(network Network, starts []string, goal string) int {
 			index = (index + 1) % mod
 		}
 
-		results = append(results, steps)
+		result = lcm(result, steps)
 	}
 
-	return calculateResult(results)
+	return result
 }
 
 func main() {