chore: cleanup and add tools
This commit is contained in:
@@ -10,7 +10,7 @@ import (
|
||||
|
||||
// var log = aoc.Log
|
||||
|
||||
func main() { aoc.MustResult(aoc.Runner(run)) }
|
||||
func main() { aoc.MustResult(aoc.Runner(runner(64))) }
|
||||
|
||||
type result struct {
|
||||
valuePT1 int
|
||||
@@ -19,12 +19,81 @@ type result struct {
|
||||
|
||||
func (r result) String() string { return fmt.Sprintf("%#v", r) }
|
||||
|
||||
func run(scan *bufio.Scanner) (*result, error) {
|
||||
func runner(rounds int) func(scan *bufio.Scanner) (*result, error) {
|
||||
return func(scan *bufio.Scanner) (*result, error) {
|
||||
var garden garden
|
||||
|
||||
for scan.Scan() {
|
||||
_ = scan.Text()
|
||||
for scan.Scan() {
|
||||
txt := scan.Text()
|
||||
garden.m = append(garden.m, []rune(txt))
|
||||
|
||||
for i, c := range txt {
|
||||
if c == 'S' {
|
||||
garden.start[0] = len(garden.m) - 1
|
||||
garden.start[1] = i
|
||||
}
|
||||
}
|
||||
}
|
||||
garden.Step(rounds)
|
||||
return &result{
|
||||
valuePT1: len(garden.steps[len(garden.steps)-1]),
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
|
||||
type garden struct {
|
||||
start aoc.Point[int]
|
||||
m [][]rune
|
||||
steps []aoc.Set[aoc.Point[int]]
|
||||
}
|
||||
|
||||
func (g *garden) Neighbors(p aoc.Point[int]) []aoc.Point[int] {
|
||||
var neighbors []aoc.Point[int]
|
||||
for _, n := range []aoc.Point[int]{
|
||||
{p[0] - 1, p[1]},
|
||||
{p[0] + 1, p[1]},
|
||||
{p[0], p[1] - 1},
|
||||
{p[0], p[1] + 1},
|
||||
} {
|
||||
if n[0] >= 0 && n[0] < len(g.m) && n[1] >= 0 && n[1] < len(g.m[0]) && g.m[n[0]][n[1]] != '#' {
|
||||
neighbors = append(neighbors, n)
|
||||
}
|
||||
}
|
||||
return neighbors
|
||||
}
|
||||
|
||||
func (g *garden) Step(n int) {
|
||||
if len(g.steps) == 0 {
|
||||
g.steps = append(g.steps, aoc.NewSet(g.start))
|
||||
}
|
||||
|
||||
return &result{}, nil
|
||||
for step := range(n) {
|
||||
g.steps = append(g.steps, aoc.NewSet[aoc.Point[int]]())
|
||||
for p := range g.steps[step] {
|
||||
for _, n := range g.Neighbors(p) {
|
||||
g.steps[step+1].Add(n)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (g garden) String() string {
|
||||
var b []rune
|
||||
for i, line := range g.m {
|
||||
if i == g.start[0] {
|
||||
line[g.start[1]] = 'X'
|
||||
}
|
||||
|
||||
if steps := len(g.steps) - 1; steps > 0 {
|
||||
for p := range g.steps[len(g.steps)-1] {
|
||||
if p[0] == i {
|
||||
line[p[1]] = 'O'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
b = append(b, line...)
|
||||
b = append(b, '\n')
|
||||
}
|
||||
return string(b)
|
||||
}
|
||||
@@ -20,11 +20,11 @@ func TestExample(t *testing.T) {
|
||||
is := is.New(t)
|
||||
scan := bufio.NewScanner(bytes.NewReader(example))
|
||||
|
||||
result, err := run(scan)
|
||||
result, err := runner(6)(scan)
|
||||
is.NoErr(err)
|
||||
|
||||
t.Log(result)
|
||||
is.Equal(result.valuePT1, 0)
|
||||
is.Equal(result.valuePT1, 16)
|
||||
is.Equal(result.valuePT2, 0)
|
||||
}
|
||||
|
||||
@@ -32,10 +32,10 @@ func TestSolution(t *testing.T) {
|
||||
is := is.New(t)
|
||||
scan := bufio.NewScanner(bytes.NewReader(input))
|
||||
|
||||
result, err := run(scan)
|
||||
result, err := runner(64)(scan)
|
||||
is.NoErr(err)
|
||||
|
||||
t.Log(result)
|
||||
is.Equal(result.valuePT1, 0)
|
||||
is.Equal(result.valuePT1, 3709)
|
||||
is.Equal(result.valuePT2, 0)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user