100 lines
2.5 KiB
Go
100 lines
2.5 KiB
Go
package day08
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
type Direction struct {
|
|
Destination string
|
|
Left string
|
|
Right string
|
|
}
|
|
|
|
func Part1(input string) int {
|
|
lines := strings.Split(input, "\r\n")
|
|
dir := make(map[string]Direction)
|
|
for _, line := range lines {
|
|
pattern := `[A-Z]+`
|
|
re := regexp.MustCompile(pattern)
|
|
matches := re.FindAllString(line, -1)
|
|
dir[matches[0]] = Direction{matches[0], matches[1], matches[2]}
|
|
}
|
|
|
|
currentloc := "AAA"
|
|
m := "LRLRRLLRRLRRRLRLRRRLLRRLLLLRRRLRRRLRRLRRLRRRLRRRLLRRLRLRRLRRRLLLRRLRRLLRLLRRRLRRRLLRLRRRLRLLRRLLLRLRRRLRRRLRRRLLRLRRRLLRRLRLRLLRRLRRRLRRLRLLRLRRRLRRLRLRLRRLRRRLRRRLRRRLRRLRRRLLRRLRRLLRRRLLRLRLRLRLLLRRLRLRRLRRLRRLRRLRRRLRRRLRLRRRLRLRRRLRRLRLLRLRRLRLRLLLRLLLRRRLRRLLLRLRRRR"
|
|
moves := strings.Split(m, "")
|
|
moveIndex := 0
|
|
total := 0
|
|
for {
|
|
move := moves[moveIndex]
|
|
if move == "R" {
|
|
currentloc = dir[currentloc].Right
|
|
} else {
|
|
currentloc = dir[currentloc].Left
|
|
}
|
|
total++
|
|
if currentloc == "ZZZ" {
|
|
return total
|
|
}
|
|
moveIndex = int(math.Mod(float64(moveIndex+1), float64(len(moves))))
|
|
}
|
|
return -1
|
|
}
|
|
|
|
func Part2(input string) int {
|
|
lines := strings.Split(input, "\r\n")
|
|
dir := make(map[string]Direction)
|
|
for _, line := range lines {
|
|
pattern := `[A-Z1-9]+`
|
|
re := regexp.MustCompile(pattern)
|
|
matches := re.FindAllString(line, -1)
|
|
dir[matches[0]] = Direction{matches[0], matches[1], matches[2]}
|
|
}
|
|
var startingLoc []string
|
|
for _, loc := range dir {
|
|
des := loc.Destination
|
|
if des[2] == 'A' {
|
|
startingLoc = append(startingLoc, des)
|
|
}
|
|
}
|
|
|
|
m := "LRLRRLLRRLRRRLRLRRRLLRRLLLLRRRLRRRLRRLRRLRRRLRRRLLRRLRLRRLRRRLLLRRLRRLLRLLRRRLRRRLLRLRRRLRLLRRLLLRLRRRLRRRLRRRLLRLRRRLLRRLRLRLLRRLRRRLRRLRLLRLRRRLRRLRLRLRRLRRRLRRRLRRRLRRLRRRLLRRLRRLLRRRLLRLRLRLRLLLRRLRLRRLRRLRRLRRLRRRLRRRLRLRRRLRLRRRLRRLRLLRLRRLRLRLLLRLLLRRRLRRLLLRLRRRR"
|
|
moves := strings.Split(m, "")
|
|
moveIndex := 0
|
|
startingLocIndex := 0
|
|
currentloc := ""
|
|
total := 0
|
|
for {
|
|
for _, loc := range startingLoc {
|
|
currentloc = loc
|
|
move := moves[moveIndex]
|
|
if move == "R" {
|
|
currentloc = dir[currentloc].Right
|
|
} else {
|
|
currentloc = dir[currentloc].Left
|
|
}
|
|
startingLoc[startingLocIndex] = currentloc
|
|
startingLocIndex = int(math.Mod(float64(startingLocIndex+1), float64(len(startingLoc))))
|
|
}
|
|
total++
|
|
endFlag := false
|
|
for _, loc := range startingLoc {
|
|
if loc[2] == 'Z' {
|
|
endFlag = true
|
|
} else {
|
|
endFlag = false
|
|
break
|
|
}
|
|
}
|
|
if endFlag == true {
|
|
return total
|
|
}
|
|
moveIndex = int(math.Mod(float64(moveIndex+1), float64(len(moves))))
|
|
fmt.Println(total)
|
|
}
|
|
return -2
|
|
}
|