aoc2023/day-8/two.go

60 lines
1.0 KiB
Go
Raw Normal View History

2023-12-08 21:18:51 +00:00
package main
import (
"strings"
)
// GCF returns the greatest common factor of two numbers
func GCF(a, b int) int {
for b != 0 {
t := b
b = a % b
a = t
}
return a
}
// LCM returns least common multiple of a set a numbers
func LCM(a, b int, integers ...int) int {
result := a * b / GCF(a, b)
for i := 0; i < len(integers); i++ {
result = LCM(result, integers[i])
}
return result
}
// two returns minimum steps required until all routes end with '*Z'
func two(lines []string) int {
parselines(lines)
startpoints := make([]string, 0)
for k := range steps {
if strings.HasSuffix(k, "A") {
startpoints = append(startpoints, k)
}
}
nums := []int{}
for _, step := range startpoints {
num := 0
for i := 0; !strings.HasSuffix(step, "Z"); i, num = i+1, num+1 {
if i == len(directions) {
i = 0
}
if directions[i] == 'L' {
step = steps[step][LEFT]
} else {
step = steps[step][RIGHT]
}
}
nums = append(nums, num)
}
lcm := 0
lcm = LCM(nums[0], nums[1], nums[2:]...)
return lcm
}