day8, example

This commit is contained in:
efim 2023-12-08 06:57:24 +00:00
parent d959473a29
commit f0c7f9815e
4 changed files with 120 additions and 3 deletions

102
day8/dayEight.go Normal file
View File

@ -0,0 +1,102 @@
package day8
import (
"fmt"
"os"
"regexp"
"strings"
)
func Run() int {
fmt.Print("hello day 8")
filename := "day8/example1"
net, path := Read(filename)
fmt.Printf("got %+v and %+v\n",net, path)
result := TraverseNetwork(net, path)
return result
}
func TraverseNetwork(net Network, path Path) int {
stepsNum := 0
curNode := net.Nodes["AAA"]
for curNode.Name != "ZZZ" {
direction := path.next()
var nextNodeName string
switch direction {
case 'L':
nextNodeName = curNode.Left
case 'R':
nextNodeName = curNode.Right
}
nextNode, found := net.Nodes[nextNodeName]
if !found {
panic(fmt.Sprintf("at step %d instruction %s from node %+v results in not found next node %s",
stepsNum, string(direction), curNode, nextNodeName))
}
curNode = nextNode
stepsNum += 1
}
return stepsNum
}
func Read(filename string) (Network, Path) {
net := Network{
Nodes: make(map[string]Node),
}
bytes, err := os.ReadFile(filename)
if err != nil {
panic(fmt.Sprintln("error reading file ", filename))
}
lines := strings.Split( string(bytes), "\n")
path := Path{
Instruction: strings.TrimSpace( lines[0] ),
}
netDescriptions := lines[2:]
re := regexp.MustCompile(`(?P<NAME>\D{3}) = \((?P<LEFT>\D{3}), (?P<RIGHT>\D{3})\)`)
nameIndex := re.SubexpIndex("NAME")
leftIndex := re.SubexpIndex("LEFT")
rightIndex := re.SubexpIndex("RIGHT")
for _, line := range netDescriptions {
if line == "" {
continue
}
match := re.FindStringSubmatch(line)
if match == nil {
panic(fmt.Sprintln("error finding match in string : ", line))
}
node := Node{
Name: match[nameIndex],
Left: match[leftIndex],
Right: match[rightIndex],
}
net.Nodes[node.Name] = node
}
return net, path
}
type Node struct {
Name string
Left, Right string
}
type Network struct {
Nodes map[string]Node
}
type Path struct {
Instruction string
curStep int
}
func (p *Path)next() rune {
curInstruction := p.Instruction[p.curStep]
p.curStep += 1
if p.curStep == len(p.Instruction) {
p.curStep = 0
}
return rune(curInstruction)
}

9
day8/example1 Normal file
View File

@ -0,0 +1,9 @@
RL
AAA = (BBB, CCC)
BBB = (DDD, EEE)
CCC = (ZZZ, GGG)
DDD = (DDD, DDD)
EEE = (EEE, EEE)
GGG = (GGG, GGG)
ZZZ = (ZZZ, ZZZ)

5
day8/example2 Normal file
View File

@ -0,0 +1,5 @@
LLR
AAA = (BBB, BBB)
BBB = (AAA, ZZZ)
ZZZ = (ZZZ, ZZZ)

View File

@ -3,11 +3,12 @@ package main
import ( import (
"log" "log"
"sunshine.industries/aoc2023/day7" "sunshine.industries/aoc2023/day8"
) )
func main() { func main() {
log.Print("> starting run:") log.Print("> starting run:")
result := day7.Run() result := day8.Run()
log.Printf("day7 result: %d\n****\n", result) log.Printf("day8 result: %d\n****\n", result)
} }