diff --git a/D01/benchmark_test.go b/D01/benchmark_test.go new file mode 100644 index 0000000..5696e02 --- /dev/null +++ b/D01/benchmark_test.go @@ -0,0 +1,24 @@ +package main + +import ( + "testing" +) + +func BenchmarkPart1(b *testing.B) { + for n := 0; n < b.N; n++ { + b.StopTimer() + left, right := parseInputs() + b.StartTimer() + Part1(left, right) + } +} + +func BenchmarkPart2(b *testing.B) { + for n := 0; n < b.N; n++ { + b.StopTimer() + left, right := parseInputs() + Part1(left, right) + b.StartTimer() + Part2(left, right) + } +} diff --git a/D01/main.go b/D01/main.go index 6f393ca..4f3517f 100644 --- a/D01/main.go +++ b/D01/main.go @@ -38,44 +38,35 @@ func getTotalDistance(leftList, rightList []uint) uint { return totalDistance } -func parseFile(f *os.File) (left, right []uint, e error) { +func parseFile(f *os.File) (left, right []uint) { sc := bufio.NewScanner(f) left, right = make([]uint, 0, 100), make([]uint, 0, 100) for sc.Scan() { - leftIntStr, spaceAndIntStr, found := strings.Cut(sc.Text(), " ") + leftIntStr, spaceAndIntStr, _ := strings.Cut(sc.Text(), " ") - if !found { - return nil, nil, fmt.Errorf("invalid file format") - } - - l, err := strconv.ParseUint(leftIntStr, 10, 64) - - if err != nil { - return nil, nil, err - } + l, _ := strconv.ParseUint(leftIntStr, 10, 64) rightIntStr := strings.ReplaceAll(spaceAndIntStr, " ", "") - r, err := strconv.ParseUint(rightIntStr, 10, 64) - - if err != nil { - return nil, nil, err - } + r, _ := strconv.ParseUint(rightIntStr, 10, 64) left = append(left, uint(l)) right = append(right, uint(r)) } - return left, right, nil + return left, right } -func Part1(left, right []uint) { - fmt.Printf("Part1: Total Distance = %d\n", getTotalDistance(left, right)) +func Part1(left, right []uint) uint { + sortList(left) + sortList(right) + + return getTotalDistance(left, right) } -func Part2(left, right []uint) { +func Part2(left, right []uint) uint64 { multMap := make(map[uint]uint) for _, v := range left { @@ -98,10 +89,10 @@ func Part2(left, right []uint) { similarityScore = similarityScore + uint64(k)*uint64(v) } - fmt.Printf("Part2: Similarity Score = %d\n", similarityScore) + return similarityScore } -func main() { +func parseInputs() (left, right []uint) { input, err := os.Open(INPUT_FILE) if err != nil { @@ -110,15 +101,16 @@ func main() { defer input.Close() - left, right, err := parseFile(input) + left, right = parseFile(input) + return left, right +} - if err != nil { - panic(err) - } +func main() { - sortList(left) - sortList(right) + left, right := parseInputs() + sol1 := Part1(left, right) + similarityScore := Part2(left, right) - Part1(left, right) - Part2(left, right) + fmt.Printf("Part1: Total Distance = %d\n", sol1) + fmt.Printf("Part2: Similarity Score = %d\n", similarityScore) } diff --git a/D02/benchmark_test.go b/D02/benchmark_test.go new file mode 100644 index 0000000..ebcb109 --- /dev/null +++ b/D02/benchmark_test.go @@ -0,0 +1,44 @@ +package main + +import "testing" + +func BenchmarkPart1(b *testing.B) { + for n := 0; n < b.N; n++ { + b.StopTimer() + lines, err := readDataFileLines() + + if err != nil { + panic(err) + } + + reports, err := ParseLinesToReports(lines) + + if err != nil { + panic(err) + } + + b.StartTimer() + Part1(reports) + } +} + +func BenchmarkPart2(b *testing.B) { + for n := 0; n < b.N; n++ { + b.StopTimer() + lines, err := readDataFileLines() + + if err != nil { + panic(err) + } + + reports, err := ParseLinesToReports(lines) + + if err != nil { + panic(err) + } + + Part1(reports) + b.StartTimer() + Part2(reports) + } +} diff --git a/D02/main.go b/D02/main.go index b68737e..5cf2c22 100644 --- a/D02/main.go +++ b/D02/main.go @@ -114,7 +114,7 @@ func IsReportSafe(report Report) bool { return (allIncreasing || allDecreasing) && adjacentDiffOk } -func Part1(reports []Report) { +func Part1(reports []Report) int { safeCtr := 0 for _, r := range reports { @@ -123,7 +123,7 @@ func Part1(reports []Report) { } } - fmt.Printf("Part 1: Safe reports = %d\n", safeCtr) + return safeCtr } func tryApplyProblemDampener(report Report) bool { @@ -139,7 +139,7 @@ func tryApplyProblemDampener(report Report) bool { return false } -func Part2(reports []Report) { +func Part2(reports []Report) int { safeCtr := 0 for _, report := range reports { @@ -156,7 +156,7 @@ func Part2(reports []Report) { } } - fmt.Printf("Part 2: Safe reports = %d\n", safeCtr) + return safeCtr } func main() { @@ -173,6 +173,8 @@ func main() { panic(err) } - Part1(reports) - Part2(reports) + safeCtr := Part1(reports) + fmt.Printf("Part 1: Safe reports = %d\n", safeCtr) + safeCtr = Part2(reports) + fmt.Printf("Part 2: Safe reports = %d\n", safeCtr) } diff --git a/D04/benchmark_test.go b/D04/benchmark_test.go new file mode 100644 index 0000000..835a636 --- /dev/null +++ b/D04/benchmark_test.go @@ -0,0 +1,26 @@ +package main + +import ( + "testing" +) + +func BenchmarkPart1(b *testing.B) { + for n := 0; n < b.N; n++ { + b.StopTimer() + mat := parseInputs() + + b.StartTimer() + Part1(mat) + } +} + +func BenchmarkPart2(b *testing.B) { + for n := 0; n < b.N; n++ { + b.StopTimer() + mat := parseInputs() + + Part1(mat) + b.StartTimer() + Part2(mat) + } +} diff --git a/D04/main.go b/D04/main.go index 8e62f80..5d81db0 100644 --- a/D04/main.go +++ b/D04/main.go @@ -100,7 +100,7 @@ func countDiagonalMatches(mat Mat2, seq string, addScanReverse bool) int { return matches } -func Part1(mat Mat2) { +func Part1(mat Mat2) int { seq := XMAS matches := countHorizontalMatches(mat, seq, true) @@ -113,7 +113,7 @@ func Part1(mat Mat2) { mat.Reverse() - fmt.Printf("Part1: Found %d matches\n", matches) + return matches } func foundTypeA(mat Mat2, row, col int) bool { @@ -136,7 +136,7 @@ func foundTypeD(mat Mat2, row, col int) bool { return mat[row][col] == 'A' && mat[row-1][col-1] == 'S' && mat[row+1][col-1] == 'M' && mat[row-1][col+1] == 'S' && mat[row+1][col+1] == 'M' } -func Part2(mat Mat2) { +func Part2(mat Mat2) int { nrows, ncols := mat.NumRowsCols() @@ -163,26 +163,31 @@ func Part2(mat Mat2) { } } - fmt.Printf("Part2: Found %d matches\n", matches) + return matches } -func main() { - +func parseInputs() Mat2 { file, err := os.Open(FILE) if err != nil { - fmt.Println(err) - return + panic(err) } defer file.Close() - mat := parseFileAsMatrix(file) + return parseFileAsMatrix(file) +} + +func main() { + + mat := parseInputs() if rows, cols := mat.NumRowsCols(); rows != cols { panic("Cannot handle non quadratic search matrices") } - Part1(mat) - Part2(mat) + matches := Part1(mat) + fmt.Printf("Part1: Found %d matches\n", matches) + matches = Part2(mat) + fmt.Printf("Part2: Found %d matches\n", matches) } diff --git a/D05/benchmark_test.go b/D05/benchmark_test.go new file mode 100644 index 0000000..1117d79 --- /dev/null +++ b/D05/benchmark_test.go @@ -0,0 +1,12 @@ +package main + +import "testing" + +func BenchmarkPart1And2(b *testing.B) { + for n := 0; n < b.N; n++ { + b.StopTimer() + updates, rules := parseInputs() + b.StartTimer() + Part1And2(updates, rules) + } +} diff --git a/D05/main.go b/D05/main.go index dd5ce1d..5c02872 100644 --- a/D05/main.go +++ b/D05/main.go @@ -5,7 +5,6 @@ import ( "fmt" "os" "slices" - "sort" "strconv" "strings" ) @@ -13,7 +12,6 @@ import ( const ( FILE = "../inputs/D05/input" TEST_FILE = "../inputs/D05/input_test" - EN_DBG = false ) func getFileLines(f *os.File) []string { @@ -152,14 +150,11 @@ func findMiddlePageNumber(update []int) int { return update[len(update)/2] } -func Part1And2(updates [][]int, rules []Rule) { - newUpdates := [][]int{} +func Part1And2(updates [][]int, rules []Rule) (sumCorrect, sumIncorrect int) { sumOfCorrectMiddlePageNrs, sumOfIncorrectMiddlePageNrs := 0, 0 for _, update := range updates { newUpdate, updateWasAlreadyCorrect := applyRulesToUpdate(update, rules) - newUpdates = append(newUpdates, newUpdate) - middlePageNum := findMiddlePageNumber(newUpdate) if updateWasAlreadyCorrect { @@ -169,42 +164,10 @@ func Part1And2(updates [][]int, rules []Rule) { } } - if EN_DBG { - fmt.Println("### Rules:") - fmt.Println("-------------------------------------") - sort.Slice(rules, func(i, j int) bool { - return rules[i].page < rules[j].page - }) - - for _, rule := range rules { - sort.Slice(rule.mustBeBeforePages, func(i, j int) bool { - return rule.mustBeBeforePages[i] < rule.mustBeBeforePages[j] - }) - } - - for _, rule := range rules { - fmt.Printf("%+v\n", rule) - } - - fmt.Println("### Updates:") - fmt.Println("-------------------------------------") - for _, update := range updates { - fmt.Printf("%+v\n", update) - } - - fmt.Println("### New Updates:") - fmt.Println("-------------------------------------") - for _, update := range newUpdates { - fmt.Printf("%+v\n", update) - } - } - - fmt.Println("Part1: ", sumOfCorrectMiddlePageNrs) - fmt.Println("Part2: ", sumOfIncorrectMiddlePageNrs) + return sumOfCorrectMiddlePageNrs, sumOfIncorrectMiddlePageNrs } -func main() { - +func parseInputs() (updates [][]int, rules []Rule) { file, err := os.Open(FILE) if err != nil { @@ -214,12 +177,14 @@ func main() { defer file.Close() ruleLines, updateLines := parseRuleAndUpdateLinesFromLines(getFileLines(file)) - if ruleLines == nil || updateLines == nil { - panic("Read no lines from file or newline separator not found") - } + return parseUpdates(updateLines), parseRules(ruleLines) +} + +func main() { - rules := parseRules(ruleLines) - updates := parseUpdates(updateLines) + updates, rules := parseInputs() + sumCorrect, sumIncorrect := Part1And2(updates, rules) - Part1And2(updates, rules) + fmt.Println("Part1: ", sumCorrect) + fmt.Println("Part2: ", sumIncorrect) } diff --git a/README.md b/README.md index 6af9471..b5b2a5e 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,11 @@ cd D01 go run . ``` +To benchmark, run +```bash +go test -bench=. -benchmem +``` + ## Day 02 [(Code)](./D02/main.go) For [day two](https://adventofcode.com/2024/day/2), run the go app via @@ -40,6 +45,11 @@ cd D02 go run . ``` +To benchmark, run +```bash +go test -bench=. -benchmem +``` + ## Day 03 [(Code)](./D03/calc.sh) For [day three](https://adventofcode.com/2024/day/3), run the bash script via @@ -62,6 +72,11 @@ Here some crude drawings detailing (really badly) what math i came up with * [assets/D4/01.jpg](./assets/D04/1%20(Mittel).jpg) * [assets/D4/02.jpg](./assets/D04/2%20(Mittel).jpg) +To benchmark, run +```bash +go test -bench=. -benchmem +``` + ## Day 05 [(Code)](./D05/main.go) For [day five](https://adventofcode.com/2024/day/5), run the go app via @@ -70,6 +85,11 @@ cd D05 go run . ``` +To benchmark, run +```bash +go test -bench=. -benchmem +``` + ## Day 06 [(Code)](./D06/main.go) For [day six](https://adventofcode.com/2024/day/6), run the go app via