diff --git a/year25/day11/day.go b/year25/day11/day.go new file mode 100644 index 0000000..021d613 --- /dev/null +++ b/year25/day11/day.go @@ -0,0 +1,101 @@ +package day11 + +import ( + "fmt" + "strings" + + "git.bizdoc.ro/gabi-public/Advent-of-Code.git/aoc" + "git.bizdoc.ro/private/devkit.git/collections/dsa" +) + +func parseInput(ctx aoc.Context) (map[string][]string, error) { + graph := make(map[string][]string) + + s := ctx.Scanner() + for s.Scan() { + line := s.Text() + parts := strings.Split(line, ": ") + key := parts[0] + graph[key] = strings.Split(parts[1], " ") + } + if err := s.Err(); err != nil { + return nil, fmt.Errorf("scanner error: %w", err) + } + return graph, nil +} + +func Part1(ctx aoc.Context) (int, error) { + graph, err := parseInput(ctx) + if err != nil { + return 0, err + } + + const start = "you" + const end = "out" + + stack := dsa.NewStack[string]() + stack.Push(start) + var pathsToEnd int + for !stack.IsEmpty() { + this := stack.Pop() + for _, next := range graph[this] { + stack.Push(next) + } + if this == end { + pathsToEnd += 1 + } + } + + return pathsToEnd, nil +} + +func Part2(ctx aoc.Context) (uint64, error) { + graph, err := parseInput(ctx) + if err != nil { + return 0, err + } + + type Item struct { + DAC, FFT bool + Name string + } + cache := make(map[Item]uint64) + + var recursion func(current Item, end string) uint64 + recursion = func(current Item, end string) uint64 { + if current.Name == end { + return bool2int(current.DAC && current.FFT) + } + + switch current.Name { + case "dac": + current.DAC = true + case "fft": + current.FFT = true + } + + var sum uint64 + for _, next := range graph[current.Name] { + current.Name = next + + paths, ok := cache[current] + if !ok { + paths = recursion(current, end) + cache[current] = paths + } + sum += paths + } + return sum + } + return recursion(Item{DAC: false, FFT: false, Name: "svr"}, "out"), nil +} + +func bool2int(b bool) uint64 { + var i uint64 + if b { + i = 1 + } else { + i = 0 + } + return i +} diff --git a/year25/day11/day_test.go b/year25/day11/day_test.go new file mode 100644 index 0000000..8f0ac5e --- /dev/null +++ b/year25/day11/day_test.go @@ -0,0 +1,27 @@ +package day11 + +import ( + "testing" + + "git.bizdoc.ro/gabi-public/Advent-of-Code.git/tests" +) + +func TestPart1Example(t *testing.T) { + const want = 5 + tests.Test(t, "example.txt", tests.Handler(Part1), want) +} + +func TestPart1(t *testing.T) { + const want = 764 + tests.Test(t, "input.txt", tests.Handler(Part1), want) +} + +func TestPart2Example(t *testing.T) { + const want = 2 + tests.Test(t, "example_part2.txt", tests.Handler(Part2), want) +} + +func TestPart2(t *testing.T) { + const want = 462444153119850 + tests.Test(t, "input.txt", tests.Handler(Part2), want) +}