fix: read from input once

Refactored the code for the Day 2 solutions so that the input file is
only read once.
This commit is contained in:
Dan Anglin 2023-12-02 17:46:44 +00:00
parent b8dba2d4e4
commit 5e2efe6688
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
2 changed files with 35 additions and 40 deletions

View file

@ -3,7 +3,6 @@ package main
import ( import (
"bufio" "bufio"
"fmt" "fmt"
"io"
"log" "log"
"os" "os"
) )
@ -11,26 +10,19 @@ import (
func main() { func main() {
filename := "2023/day-2/files/input" filename := "2023/day-2/files/input"
file1, err := os.Open(filename) games, err := readFile(filename)
if err != nil { if err != nil {
log.Fatalf("ERROR: unable to open %s, %v\n", filename, err) log.Fatalf("ERROR: unable to read from %s, %v\n", filename, err)
} }
defer file1.Close()
sumOfIDs, err := sumOfGameIDs(file1) sumOfIDs, err := sumOfGameIDs(games)
if err != nil { if err != nil {
log.Fatalf("ERROR: unable to calculate the sum of the IDs of the valid games; %v\n", err) log.Fatalf("ERROR: unable to calculate the sum of the IDs of the valid games; %v\n", err)
} }
fmt.Printf("Total sum of the IDs of the valid games: %d\n", sumOfIDs) fmt.Printf("Total sum of the IDs of the valid games: %d\n", sumOfIDs)
file2, err := os.Open(filename) sumOfPower, err := sumOfThePowerOfTheCubes(games)
if err != nil {
log.Fatalf("ERROR: unable to open %s, %v\n", filename, err)
}
defer file2.Close()
sumOfPower, err := sumOfThePowerOfTheCubes(file2)
if err != nil { if err != nil {
log.Fatalf("ERROR: unable to calculate the sum of the power of cubes; %v\n", err) log.Fatalf("ERROR: unable to calculate the sum of the power of cubes; %v\n", err)
} }
@ -39,19 +31,15 @@ func main() {
} }
// sumOfGameIDs solves Part 1 // sumOfGameIDs solves Part 1
func sumOfGameIDs(r io.Reader) (int, error) { func sumOfGameIDs(content []string) (int, error) {
scanner := bufio.NewScanner(r)
sum := 0 sum := 0
for scanner.Scan() { for i := range content {
line := scanner.Text() if len(content[i]) == 0 {
if len(line) == 0 {
continue continue
} }
game, err := parseGame(line) game, err := parseGame(content[i])
if err != nil { if err != nil {
return 0, fmt.Errorf("unable to parse %q; %w", game, err) return 0, fmt.Errorf("unable to parse %q; %w", game, err)
} }
@ -59,29 +47,22 @@ func sumOfGameIDs(r io.Reader) (int, error) {
if validGame(game.Sets) { if validGame(game.Sets) {
sum = sum + game.ID sum = sum + game.ID
} }
}
if err := scanner.Err(); err != nil {
return 0, fmt.Errorf("received an error after scanning file; %w", err)
} }
return sum, nil return sum, nil
} }
// sumOfThePowerOfTheCubes solves Part 2 // sumOfThePowerOfTheCubes solves Part 2
func sumOfThePowerOfTheCubes(r io.Reader) (int, error) { func sumOfThePowerOfTheCubes(content []string) (int, error) {
scanner := bufio.NewScanner(r)
sum := 0 sum := 0
for scanner.Scan() { for i := range content {
line := scanner.Text() if len(content[i]) == 0 {
if len(line) == 0 {
continue continue
} }
game, err := parseGame(line) game, err := parseGame(content[i])
if err != nil { if err != nil {
return 0, fmt.Errorf("unable to parse %q; %w", game, err) return 0, fmt.Errorf("unable to parse %q; %w", game, err)
} }
@ -91,10 +72,6 @@ func sumOfThePowerOfTheCubes(r io.Reader) (int, error) {
sum = sum + (fewestCubeSet.Red * fewestCubeSet.Green * fewestCubeSet.Blue) sum = sum + (fewestCubeSet.Red * fewestCubeSet.Green * fewestCubeSet.Blue)
} }
if err := scanner.Err(); err != nil {
return 0, fmt.Errorf("received an error after scanning file; %w", err)
}
return sum, nil return sum, nil
} }
@ -138,3 +115,21 @@ func fewestSet(sets []Set) Set {
return result return result
} }
func readFile(filename string) ([]string, error) {
file, err := os.Open(filename)
if err != nil {
return nil, fmt.Errorf("unable to open %s, %w", filename, err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
var content []string
for scanner.Scan() {
content = append(content, scanner.Text())
}
return content, nil
}

View file

@ -1,7 +1,7 @@
package main package main
import ( import (
"bytes" "strings"
"testing" "testing"
) )
@ -14,9 +14,9 @@ Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
` `
func TestSumOfGameIDs(t *testing.T) { func TestSumOfGameIDs(t *testing.T) {
buf := bytes.NewBufferString(testStr) games := strings.Split(testStr, "\n")
got, err := sumOfGameIDs(buf) got, err := sumOfGameIDs(games)
if err != nil { if err != nil {
t.Fatalf("Received an error after running sumOfGameIDs(); %v\n", err) t.Fatalf("Received an error after running sumOfGameIDs(); %v\n", err)
} }
@ -29,9 +29,9 @@ func TestSumOfGameIDs(t *testing.T) {
} }
func TestSumOfThePowerOfTheCubes(t *testing.T) { func TestSumOfThePowerOfTheCubes(t *testing.T) {
buf := bytes.NewBufferString(testStr) games := strings.Split(testStr, "\n")
got, err := sumOfThePowerOfTheCubes(buf) got, err := sumOfThePowerOfTheCubes(games)
if err != nil { if err != nil {
t.Fatalf("Received an error after running sumOfThePowerOfTheCubes(); %v\n", err) t.Fatalf("Received an error after running sumOfThePowerOfTheCubes(); %v\n", err)
} }