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 (
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue