2023 day 08

This commit is contained in:
tristan 2023-12-09 15:39:30 +00:00
parent b54d01e43a
commit 9b5de2f13e
10 changed files with 1114 additions and 0 deletions

39
2023/08/part1/cmd/main.go Normal file
View file

@ -0,0 +1,39 @@
package main
import (
"bufio"
"os"
"fmt"
"git.tristans.cloud/tristan/aoc/2023/08/part1/part1"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin);
ins, err := reader.ReadString('\n');
if err != nil {
fmt.Println("Halted too soon!")
return
}
ins = strings.Trim(ins, "\n")
_, err = reader.ReadString('\n');
if err != nil {
fmt.Println("Halted too soon!")
return
}
net := part1.Network{}
for {
line, err := reader.ReadString('\n');
if err != nil {
break
}
part1.AddToNet(net, line)
}
steps, err := part1.StepsToSolve(ins, net)
if (err != nil) {
fmt.Println(err)
}
fmt.Println(steps)
}

View file

@ -0,0 +1,55 @@
package part1
import (
"regexp"
"errors"
"fmt"
)
type Network = map[string][2]string
const start = "AAA"
const Goal = "ZZZ"
func GetValues(in string) (src, left, right string, err error) {
re := regexp.MustCompile(`[A-Z1-9]{3}`)
out := re.FindAllString(in, -1)
if (len(out) != 3) {
return "", "", "", errors.New("must be three values")
}
src = out[0];
left = out[1];
right = out[2];
return
}
func AddToNet(net Network, line string) error {
src, left, right, err := GetValues(line)
if err != nil {
return err
}
net[src] = [2]string{left, right}
return nil
}
func StepsToSolve(ins string, net Network) (int, error) {
current := start;
steps := 0;
i := 0
for {
if current == Goal {
return steps, nil
}
steps ++
switch ins[i % len(ins)] {
case 'L':
current = net[current][0]
case 'R':
current = net[current][1]
default:
return 0, fmt.Errorf("instructions unclear! Must only be 'R' and 'L', but got %v at [%v]", ins[i], i)
}
i++
}
}

View file

@ -0,0 +1,58 @@
package part1
import (
"testing"
"reflect"
)
func TestGetValues(t *testing.T) {
src, left, right, err := GetValues("AAA = (BBB, CCC)\n")
equal(t, err, nil)
equal(t, src, "AAA")
equal(t, left, "BBB")
equal(t, right, "CCC")
}
func TestAddToNet(t *testing.T) {
net := Network{}
err := AddToNet(net, "AAA = (BBB, CCC)")
equal(t, err, nil)
equal(t, net["AAA"], [2]string{"BBB","CCC"})
}
func TestStepsToSolveWithBadDirections(t *testing.T) {
_, err := StepsToSolve("AB", Network{})
if err == nil {
t.Errorf("wanted an error")
}
}
func TestStepsToSolve(t *testing.T) {
net := Network{
"AAA": [2]string{"BBB","CCC"},
"CCC": [2]string{"ZZZ","AAA"},
"ZZZ": [2]string{"ZZZ","ZZZ"},
}
steps, err := StepsToSolve("RL", net)
equal(t, err, nil)
equal(t, steps, 2)
}
func TestStepsToSolveWithLoop(t *testing.T) {
net := Network{
"AAA": [2]string{"BBB","BBB"},
"BBB": [2]string{"AAA","ZZZ"},
"ZZZ": [2]string{"ZZZ","ZZZ"},
}
steps, err := StepsToSolve("LLR", net)
equal(t, err, nil)
equal(t, steps, 6)
}
func equal(t *testing.T, actual any, target any) {
if !reflect.DeepEqual(actual, target) {
t.Errorf("expected '%v', got '%v'", target, actual)
}
}