From 8ba99a5bf026bd8ecb9082788800e693408d3531 Mon Sep 17 00:00:00 2001 From: Juliane Holzt Date: Fri, 20 Dec 2024 23:52:38 +0100 Subject: [PATCH] refactor, feat: allow parameters to calc function --- aoc/run.go | 6 ++-- day01/day01.go | 2 +- day02/day02.go | 2 +- day03/day03.go | 2 +- day04/day04.go | 2 +- day05/day05.go | 2 +- day06/day06.go | 2 +- day07/day07.go | 2 +- day08/day08.go | 2 +- day09/day09.go | 2 +- day10/day10.go | 2 +- day11/day11.go | 2 +- day12/day12.go | 2 +- day13/day13.go | 2 +- day14/day14.go | 74 ++++++++++++++++++++++++++------------------------ day15/day15.go | 2 +- day16/day16.go | 2 +- day17/day17.go | 2 +- 18 files changed, 57 insertions(+), 55 deletions(-) diff --git a/aoc/run.go b/aoc/run.go index a3c7364..66f690d 100644 --- a/aoc/run.go +++ b/aoc/run.go @@ -9,10 +9,10 @@ import ( ) // InputCalcFunction is the function signature for the calculation function -type InputCalcFunction func(i *Input, runPart1, runpart2 bool) (any, any) +type InputCalcFunction func(i *Input, runPart1, runpart2 bool, param ...any) (any, any) // Run runs the given calcFunction on the given input file -func Run(fileName string, calcFunction InputCalcFunction, runPart1, runPart2 bool) { +func Run(fileName string, calcFunction InputCalcFunction, runPart1, runPart2 bool, param ...any) { _ = pp.Print // just to keep this module in the project InputFile, err := os.Open(fileName) @@ -33,7 +33,7 @@ func Run(fileName string, calcFunction InputCalcFunction, runPart1, runPart2 boo lines = lines[:len(lines)-1] } - res1, res2 := calcFunction(NewInput(lines), runPart1, runPart2) + res1, res2 := calcFunction(NewInput(lines), runPart1, runPart2, param) result := fileName + ":" if runPart1 { diff --git a/day01/day01.go b/day01/day01.go index fb733ea..e5ff59b 100644 --- a/day01/day01.go +++ b/day01/day01.go @@ -34,7 +34,7 @@ func part2(col1, col2 []int) int { return sum } -func calc(input *aoc.Input, _, _ bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { col1 := []int{} col2 := []int{} diff --git a/day02/day02.go b/day02/day02.go index 9142162..14c9527 100644 --- a/day02/day02.go +++ b/day02/day02.go @@ -51,7 +51,7 @@ lineLoop: return sum } -func calc(input *aoc.Input, _, _ bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { return check(input, false), check(input, true) } diff --git a/day03/day03.go b/day03/day03.go index 18b5bb6..6c5451e 100644 --- a/day03/day03.go +++ b/day03/day03.go @@ -32,7 +32,7 @@ func calcFor(code string, isPart2 bool) int { return sum } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, doPart1, doPart2 bool, _ ...any) (any, any) { sumPart1 := 0 sumPart2 := 0 diff --git a/day04/day04.go b/day04/day04.go index b30c0dd..6f458ba 100644 --- a/day04/day04.go +++ b/day04/day04.go @@ -28,7 +28,7 @@ func checkForStartPosPart2(grid *aoc.Grid, pos aoc.Coordinate) int { return 0 } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { sumPart1 := 0 sumPart2 := 0 diff --git a/day05/day05.go b/day05/day05.go index b63fb96..75b0ba8 100644 --- a/day05/day05.go +++ b/day05/day05.go @@ -31,7 +31,7 @@ func doReorder(rules [][]int, pageList []int) { }) } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { sumPart1 := 0 sumPart2 := 0 diff --git a/day06/day06.go b/day06/day06.go index d8045af..3abab2b 100644 --- a/day06/day06.go +++ b/day06/day06.go @@ -66,7 +66,7 @@ func doWalkPart2(grid *aoc.Grid, additionalObstacle, startPos aoc.Coordinate) bo } } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { sumPart2 := 0 grid := input.Grid() diff --git a/day07/day07.go b/day07/day07.go index 0db27ed..8229e14 100644 --- a/day07/day07.go +++ b/day07/day07.go @@ -98,7 +98,7 @@ func checkWithRecursion(targetSum int, numbers []int, canBePart1 bool) (bool, bo return false, false } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { sumPart1 := 0 sumPart2 := 0 diff --git a/day08/day08.go b/day08/day08.go index d49469c..1fa70ec 100644 --- a/day08/day08.go +++ b/day08/day08.go @@ -4,7 +4,7 @@ import ( "github.com/julijane/advent-of-code-2024/aoc" ) -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { antennaLocations := make(map[byte][]aoc.Coordinate) grid := input.Grid() diff --git a/day09/day09.go b/day09/day09.go index d17579e..0d593c2 100644 --- a/day09/day09.go +++ b/day09/day09.go @@ -46,7 +46,7 @@ func defrag(files []FileBlocks, gaps []FileBlocks) int { return sum } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { line := input.PlainLines()[0] gapsPart2 := []FileBlocks{} diff --git a/day10/day10.go b/day10/day10.go index 51c62c4..ea04dec 100644 --- a/day10/day10.go +++ b/day10/day10.go @@ -15,7 +15,7 @@ type TrailByStartpos map[aoc.Coordinate]TrailInfo type TrailsByStartval map[byte]TrailByStartpos -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { grid := input.Grid() trailsByStartval := make(TrailsByStartval) diff --git a/day11/day11.go b/day11/day11.go index 660cc71..0b0a811 100644 --- a/day11/day11.go +++ b/day11/day11.go @@ -50,7 +50,7 @@ func calcForStoneAtLevel(stone StoneLevel, maxLevel int) int { return result } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { stones := aoc.ExtractNumbers(input.PlainLines()[0]) sumPart1 := 0 diff --git a/day12/day12.go b/day12/day12.go index 9bf3509..6875d0c 100644 --- a/day12/day12.go +++ b/day12/day12.go @@ -43,7 +43,7 @@ func walkFrom(g *aoc.Grid, c aoc.Coordinate, fieldVal byte, walkedFields map[aoc return sumFields, sumPerimeterLength, sumCorners } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { sumPart1 := 0 sumPart2 := 0 diff --git a/day13/day13.go b/day13/day13.go index 93e6b66..886c618 100644 --- a/day13/day13.go +++ b/day13/day13.go @@ -28,7 +28,7 @@ func solveFor(aX, aY, bX, bY, pX, pY int) int { return a*3 + b } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, _ bool, _ ...any) (any, any) { sumPart1 := 0 sumPart2 := 0 diff --git a/day14/day14.go b/day14/day14.go index 1404531..7617ca7 100644 --- a/day14/day14.go +++ b/day14/day14.go @@ -4,27 +4,27 @@ import ( "github.com/julijane/advent-of-code-2024/aoc" ) -const ( - gridWidth = 101 - gridHeight = 103 -) - type Robot struct { StartPos aoc.Coordinate Velocity aoc.Coordinate } -func (r Robot) PositionAfter(seconds int) aoc.Coordinate { +func (r Robot) PositionAfter(seconds, gridWidth, gridHeight int) aoc.Coordinate { return aoc.Coordinate{ X: (r.StartPos.X + r.Velocity.X*seconds) % gridWidth, Y: (r.StartPos.Y + r.Velocity.Y*seconds) % gridHeight, } } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, _, doPart2 bool, param ...any) (any, any) { sumPart1 := 0 sumPart2 := 0 + params := param[0].([]interface{}) + + gridWidth := params[0].(int) + gridHeight := params[1].(int) + robots := []Robot{} for _, line := range input.PlainLines() { values := aoc.ExtractNumbers(line) @@ -44,7 +44,7 @@ func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { quadrantCount := [4]int{} for _, robot := range robots { - finalPos := robot.PositionAfter(100) + finalPos := robot.PositionAfter(100, gridWidth, gridHeight) if finalPos.X < gridWidth/2 { if finalPos.Y < gridHeight/2 { @@ -64,47 +64,49 @@ func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { sumPart1 = quadrantCount[0] * quadrantCount[1] * quadrantCount[2] * quadrantCount[3] - for { - sumPart2++ - g := aoc.NewGrid(gridWidth, gridHeight, ' ') - for _, robot := range robots { - pos := robot.PositionAfter(sumPart2) - g.Set(pos, '#') - } + if doPart2 { + for { + sumPart2++ + g := aoc.NewGrid(gridWidth, gridHeight, ' ') + for _, robot := range robots { + pos := robot.PositionAfter(sumPart2, gridWidth, gridHeight) + g.Set(pos, '#') + } - connected := 0 - unconnected := 0 + connected := 0 + unconnected := 0 - for y := 0; y < gridHeight; y++ { - xloop: - for x := 0; x < gridWidth; x++ { - pos := aoc.Coordinate{X: x, Y: y} - if g.Get(pos, '.') != '#' { - continue - } + for y := 0; y < gridHeight; y++ { + xloop: + for x := 0; x < gridWidth; x++ { + pos := aoc.Coordinate{X: x, Y: y} + if g.Get(pos, '.') != '#' { + continue + } - for dir := 0; dir < 4; dir++ { - if g.Get(pos.Add(aoc.DirsStraight[dir]), ' ') == '#' { - connected++ - continue xloop + for dir := 0; dir < 4; dir++ { + if g.Get(pos.Add(aoc.DirsStraight[dir]), ' ') == '#' { + connected++ + continue xloop + } } + + unconnected++ } + } - unconnected++ + if float64(connected) > float64(connected+unconnected)*0.7 { + g.Print() + break } - } - if float64(connected) > float64(connected+unconnected)*0.7 { - g.Print() - break } - } return sumPart1, sumPart2 } func main() { - // aoc.Run("sample1.txt", calc, true, true) - aoc.Run("input.txt", calc, true, true) + aoc.Run("sample1.txt", calc, true, false, 11, 7) + aoc.Run("input.txt", calc, true, true, 101, 103) } diff --git a/day15/day15.go b/day15/day15.go index 656ef26..d06edb1 100644 --- a/day15/day15.go +++ b/day15/day15.go @@ -77,7 +77,7 @@ instLoop: return result } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, doPart1, doPart2 bool, _ ...any) (any, any) { blocks := input.TextBlocks() instructions := []byte{} diff --git a/day16/day16.go b/day16/day16.go index 7461bbe..97b5816 100644 --- a/day16/day16.go +++ b/day16/day16.go @@ -43,7 +43,7 @@ func (pq *PriorityQueue) Pop() any { // --- -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, doPart1, doPart2 bool, _ ...any) (any, any) { sumPart1 := math.MaxInt64 sumPart2 := 0 diff --git a/day17/day17.go b/day17/day17.go index 41da1d0..0c22218 100644 --- a/day17/day17.go +++ b/day17/day17.go @@ -98,7 +98,7 @@ type partialA struct { numSections int } -func calc(input *aoc.Input, doPart1, doPart2 bool) (any, any) { +func calc(input *aoc.Input, doPart1, doPart2 bool, _ ...any) (any, any) { resultPart2 := 0 cpu := NewCPU(input)