diff --git a/day-5/main.go b/day-5/main.go index 441b82a..460cb8b 100644 --- a/day-5/main.go +++ b/day-5/main.go @@ -2,6 +2,7 @@ package main import ( + "AoC2021/utils/log" "AoC2021/utils/timer" "bufio" "fmt" @@ -14,7 +15,7 @@ const MAX_SIZE = 1000 func check(e error) { if e != nil { - fmt.Println("Oh snap!") + log.Println(log.DEBUG, "Oh snap!") panic(e) } } @@ -23,11 +24,11 @@ func checkCoord(x int, y int) { badVal := false if x < 0 || x >= MAX_SIZE { badVal = true - fmt.Println("Invalid x value:", x) + log.Println(log.DEBUG, "Invalid x value:", x) } if y < 0 || y >= MAX_SIZE { badVal = true - fmt.Println("Invalid y value:", y) + log.Println(log.DEBUG, "Invalid y value:", y) } if badVal { @@ -36,15 +37,15 @@ func checkCoord(x int, y int) { } func main() { - fmt.Println("--- Day 5: Hydrothermal Venture ---") + log.Println(log.NORMAL, "--- Day 5: Hydrothermal Venture ---") timer.Start() - // part1() - // timer.Tick() - // fmt.Println() + part1() + timer.Tick() + log.Println(log.NORMAL) part2() timer.Tick() - fmt.Println() + log.Println(log.NORMAL) } func parseLine(line string) (int, int, int, int) { @@ -94,9 +95,9 @@ func Sign(a int) int { } func part1() { - fmt.Println("* Part 1 *") - fmt.Println(" Goal: Determine the number of points where at least two lines overlap") - fmt.Println(" Answer: At how many points do at least two lines overlap?") + log.Println(log.NORMAL, "* Part 1 *") + log.Println(log.NORMAL, " Goal: Determine the number of points where at least two lines overlap") + log.Println(log.NORMAL, " Answer: At how many points do at least two lines overlap?") input, err := os.Open("./input.txt") check(err) @@ -107,7 +108,7 @@ func part1() { goodLines := 0 var grid [MAX_SIZE][MAX_SIZE]uint - // fmt.Printf("Initialized grid of size %d\n", MAX_SIZE) + // log.Printf("Initialized grid of size %d\n", MAX_SIZE) // Draw the lines for scanner.Scan() { @@ -140,14 +141,14 @@ func part1() { } } - fmt.Printf("Read %d lines from input. Found %d straight segments\n", lines, goodLines) - fmt.Printf("Found %d line intersections\n", intersections) + log.Printf(log.NORMAL, "Read %d lines from input. Found %d straight segments\n", lines, goodLines) + log.Printf(log.NORMAL, "Found %d line intersections\n", intersections) } func part2() { - fmt.Println("* Part 2 *") - fmt.Println(" Goal: Including diagonal line segments, determine the number of points where at least two lines overlap") - fmt.Println(" Answer: At how many points do at least two lines overlap?") + log.Println(log.NORMAL, "* Part 2 *") + log.Println(log.NORMAL, " Goal: Including diagonal line segments, determine the number of points where at least two lines overlap") + log.Println(log.NORMAL, " Answer: At how many points do at least two lines overlap?") input, err := os.Open("./input.txt") check(err) @@ -171,7 +172,7 @@ func part2() { xVel := Sign(x2 - x1) yVel := Sign(y2 - y1) - //fmt.Printf("Drawing line from (%d,%d) to (%d,%d) using velocity [%d,%d]", x1, y1, x2, y2, xVel, yVel) + //log.Printf("Drawing line from (%d,%d) to (%d,%d) using velocity [%d,%d]", x1, y1, x2, y2, xVel, yVel) dots := 0 for x, y := x1, y1; x != x2 || y != y2; { @@ -185,7 +186,7 @@ func part2() { } // Mark the last point grid[x2][y2] += 1 - //fmt.Printf(" -- Drew %d dots\n", dots+1) + //log.Printf(" -- Drew %d dots\n", dots+1) } // Count the intersections intersections := 0 @@ -197,6 +198,6 @@ func part2() { } } - fmt.Printf("Read %d lines from input.\n", lines) - fmt.Printf("Found %d line intersections\n", intersections) + log.Printf(log.NORMAL, "Read %d lines from input.\n", lines) + log.Printf(log.NORMAL, "Found %d line intersections\n", intersections) } diff --git a/day-5/main_test.go b/day-5/main_test.go index bff5811..56222ee 100644 --- a/day-5/main_test.go +++ b/day-5/main_test.go @@ -1,11 +1,29 @@ package main import ( - assert "AoC2021/utils/testing" + "AoC2021/utils/log" + "AoC2021/utils/timing" + "fmt" "testing" + "time" ) -func TestDay5(t *testing.T) { - assert.IsTrue(t, true, "cool") - assert.StrEquals(t, "foo", "bar", "baz") +const TRIALS = 1000 + +func TestDay5Part1(t *testing.T) { + log.LOG_LEVEL = log.NONE + + duration := timing.TimeFunction(part1, TRIALS) + avg := time.Duration(int64(duration) / int64(TRIALS)) + + fmt.Printf("Part1: [Took %s across %d trials for an average of %s]\n", duration.String(), TRIALS, avg) +} + +func TestDay5Part2(t *testing.T) { + log.LOG_LEVEL = log.NONE + + duration := timing.TimeFunction(part2, TRIALS) + avg := time.Duration(int64(duration) / int64(TRIALS)) + + fmt.Printf("Part2: [Took %s across %d trials for an average of %s]\n", duration.String(), TRIALS, avg) } diff --git a/utils/log/log.go b/utils/log/log.go new file mode 100644 index 0000000..d7f319e --- /dev/null +++ b/utils/log/log.go @@ -0,0 +1,32 @@ +package log + +import "fmt" + +const ( + NONE = 0 + NORMAL = 1 + DEBUG = 2 +) + +var LOG_LEVEL = NORMAL + +func Print(minLevel int, a ...interface{}) (int, error) { + if LOG_LEVEL >= minLevel { + return fmt.Print(a...) + } + return 0, nil +} + +func Println(minLevel int, a ...interface{}) (int, error) { + if LOG_LEVEL >= minLevel { + return fmt.Println(a...) + } + return 0, nil +} + +func Printf(minLevel int, format string, a ...interface{}) (int, error) { + if LOG_LEVEL >= minLevel { + return fmt.Printf(format, a...) + } + return 0, nil +} diff --git a/utils/timing/timing.go b/utils/timing/timing.go new file mode 100644 index 0000000..f621e64 --- /dev/null +++ b/utils/timing/timing.go @@ -0,0 +1,14 @@ +package timing + +import "time" + +func TimeFunction(fn func(), trials int) time.Duration { + startTime := time.Now() + + for i := 0; i < trials; i++ { + fn() + } + endTime := time.Now() + + return endTime.Sub(startTime) +}