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:
parent
b8dba2d4e4
commit
5e2efe6688
2 changed files with 35 additions and 40 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue