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 (
"bufio"
"fmt"
"io"
"log"
"os"
)
@ -11,26 +10,19 @@ import (
func main() {
filename := "2023/day-2/files/input"
file1, err := os.Open(filename)
games, err := readFile(filename)
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 {
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)
file2, err := os.Open(filename)
if err != nil {
log.Fatalf("ERROR: unable to open %s, %v\n", filename, err)
}
defer file2.Close()
sumOfPower, err := sumOfThePowerOfTheCubes(file2)
sumOfPower, err := sumOfThePowerOfTheCubes(games)
if err != nil {
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
func sumOfGameIDs(r io.Reader) (int, error) {
scanner := bufio.NewScanner(r)
func sumOfGameIDs(content []string) (int, error) {
sum := 0
for scanner.Scan() {
line := scanner.Text()
if len(line) == 0 {
for i := range content {
if len(content[i]) == 0 {
continue
}
game, err := parseGame(line)
game, err := parseGame(content[i])
if err != nil {
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) {
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
}
// sumOfThePowerOfTheCubes solves Part 2
func sumOfThePowerOfTheCubes(r io.Reader) (int, error) {
scanner := bufio.NewScanner(r)
func sumOfThePowerOfTheCubes(content []string) (int, error) {
sum := 0
for scanner.Scan() {
line := scanner.Text()
if len(line) == 0 {
for i := range content {
if len(content[i]) == 0 {
continue
}
game, err := parseGame(line)
game, err := parseGame(content[i])
if err != nil {
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)
}
if err := scanner.Err(); err != nil {
return 0, fmt.Errorf("received an error after scanning file; %w", err)
}
return sum, nil
}
@ -138,3 +115,21 @@ func fewestSet(sets []Set) Set {
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
import (
"bytes"
"strings"
"testing"
)
@ -14,9 +14,9 @@ Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
`
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 {
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) {
buf := bytes.NewBufferString(testStr)
games := strings.Split(testStr, "\n")
got, err := sumOfThePowerOfTheCubes(buf)
got, err := sumOfThePowerOfTheCubes(games)
if err != nil {
t.Fatalf("Received an error after running sumOfThePowerOfTheCubes(); %v\n", err)
}