|
@@ -64,33 +64,9 @@ func readInput(file *os.File) Network {
|
|
|
return network
|
|
|
}
|
|
|
|
|
|
-func part1(network Network) int {
|
|
|
- steps := 0
|
|
|
- current := "AAA"
|
|
|
- mod := len(network.moves)
|
|
|
- index := 0
|
|
|
- for {
|
|
|
- if current == "ZZZ" {
|
|
|
- break
|
|
|
- }
|
|
|
-
|
|
|
- d := network.paths[current]
|
|
|
- if network.moves[index] == 'L' {
|
|
|
- current = d.left
|
|
|
- } else {
|
|
|
- current = d.right
|
|
|
- }
|
|
|
-
|
|
|
- index = (index + 1) % mod
|
|
|
- steps++
|
|
|
- }
|
|
|
-
|
|
|
- return steps
|
|
|
-}
|
|
|
-
|
|
|
-func (n *Network) AtGoal() bool {
|
|
|
- for i := range n.starts {
|
|
|
- if !strings.HasSuffix(n.starts[i], "Z") {
|
|
|
+func atGoal(starts []string, goal string) bool {
|
|
|
+ for i := range starts {
|
|
|
+ if !strings.HasSuffix(starts[i], goal) {
|
|
|
return false
|
|
|
}
|
|
|
}
|
|
@@ -98,21 +74,21 @@ func (n *Network) AtGoal() bool {
|
|
|
return true
|
|
|
}
|
|
|
|
|
|
-func part2(network Network) int {
|
|
|
+func part(network Network, starts []string, goal string) int {
|
|
|
steps := 0
|
|
|
mod := len(network.moves)
|
|
|
index := 0
|
|
|
for {
|
|
|
- if network.AtGoal() {
|
|
|
+ if atGoal(starts, goal) {
|
|
|
break
|
|
|
}
|
|
|
|
|
|
- for i := range network.starts {
|
|
|
- d := network.paths[network.starts[i]]
|
|
|
+ for i := range starts {
|
|
|
+ d := network.paths[starts[i]]
|
|
|
if network.moves[index] == 'L' {
|
|
|
- network.starts[i] = d.left
|
|
|
+ starts[i] = d.left
|
|
|
} else {
|
|
|
- network.starts[i] = d.right
|
|
|
+ starts[i] = d.right
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -137,6 +113,6 @@ func main() {
|
|
|
}
|
|
|
|
|
|
network := readInput(file)
|
|
|
- fmt.Println("Part1:", part1(network))
|
|
|
- fmt.Println("Part2:", part2(network))
|
|
|
+ fmt.Println("Part1:", part(network, []string{"AAA"}, "ZZZ"))
|
|
|
+ fmt.Println("Part2:", part(network, network.starts, "Z"))
|
|
|
}
|