refactor(Day 1): Updated code structure for Day 1

- Moved parts 1 and 2 under one directory.
- Updated test suite for Day 1.
This commit is contained in:
Dan Anglin 2023-12-04 18:43:57 +00:00
parent bd36605f3e
commit 86fd297d5b
Signed by: dananglin
GPG key ID: 0C1D44CFBEE68638
7 changed files with 136 additions and 133 deletions

16
2023/day-1/main.go Normal file
View file

@ -0,0 +1,16 @@
package main
import (
"fmt"
"log"
)
func main() {
document, err := calibrationDocument("2023/day-1/files/input")
if err != nil {
log.Fatalf("Error: Unable to retrieve the calibration document; %v", err)
}
fmt.Printf("[Part 1] Total sum of calibration values: %d\n", partOneCalculateSumCalibrationValues(document))
fmt.Printf("[Part 2] Total sum of calibration values: %d\n", partTwoCalculateSumCalibrationValues(document))
}

50
2023/day-1/main_test.go Normal file
View file

@ -0,0 +1,50 @@
package main
import (
"strings"
"testing"
)
func TestDay1Trebuchet(t *testing.T) {
t.Run("Test the solution for Part 1", testPartOneCalculateSumCalibrationValues)
t.Run("Test the solution for Part 2", testPartTwoCalculateSumCalibrationValues)
}
func testPartOneCalculateSumCalibrationValues(t *testing.T) {
testStr := `
1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet
`
document := strings.Split(testStr, "\n")
got := partOneCalculateSumCalibrationValues(document)
want := 142
if want != got {
t.Errorf("Unexpected value returned from partOneCalculateSumCalibrationValues(); want %d, got %d", want, got)
}
}
func testPartTwoCalculateSumCalibrationValues(t *testing.T) {
testStr := `
two1nine
eightwothree
abcone2threexyz
xtwone3four
4nineeightseven2
zoneight234
7pqrstsixteen
`
document := strings.Split(testStr, "\n")
got := partTwoCalculateSumCalibrationValues(document)
want := 281
if want != got {
t.Errorf("Unexpected value returned from calculateSumCalibrationValues(); want %d, got %d", want, got)
}
}

View file

@ -1,49 +0,0 @@
package main
import (
"bufio"
"fmt"
"io"
"log"
"os"
)
func main() {
file, err := os.Open("2023/day-1/files/input")
if err != nil {
log.Fatalf("Error: %v", err)
}
defer file.Close()
fmt.Printf("Sum total: %d\n", calculateSumCalibrationValues(file))
}
func calculateSumCalibrationValues(r io.Reader) int {
scanner := bufio.NewScanner(r)
sum := 0
for scanner.Scan() {
line := scanner.Text()
sum = sum + calibrationValue(line)
}
return sum
}
func calibrationValue(line string) int {
var digits []int
for _, r := range []rune(line) {
if (r >= '0') && (r <= '9') {
digits = append(digits, int(r-'0'))
}
}
if len(digits) == 0 {
return 0
}
return (10 * digits[0]) + digits[len(digits)-1]
}

View file

@ -1,24 +0,0 @@
package main
import (
"bytes"
"testing"
)
func TestCalculateSumCalibrationValues(t *testing.T) {
testStr := `
1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet
`
buf := bytes.NewBuffer([]byte(testStr))
want := 142
got := calculateSumCalibrationValues(buf)
if want != got {
t.Errorf("Unexpected value returned from calculateSumCalibrationValues(); want %d, got %d", want, got)
}
}

View file

@ -1,27 +0,0 @@
package main
import (
"bytes"
"testing"
)
func TestCalculateSumCalibrationValues(t *testing.T) {
testStr := `
two1nine
eightwothree
abcone2threexyz
xtwone3four
4nineeightseven2
zoneight234
7pqrstsixteen
`
buf := bytes.NewBuffer([]byte(testStr))
want := 281
got := calculateSumCalibrationValues(buf)
if want != got {
t.Errorf("Unexpected value returned from calculateSumCalibrationValues(); want %d, got %d", want, got)
}
}

55
2023/day-1/part_one.go Normal file
View file

@ -0,0 +1,55 @@
package main
import (
"bufio"
"fmt"
"os"
)
func partOneCalculateSumCalibrationValues(document []string) int {
sum := 0
for _, line := range document {
sum = sum + calibrationValue(line)
}
return sum
}
func calibrationValue(line string) int {
var digits []int
for _, r := range []rune(line) {
if (r >= '0') && (r <= '9') {
digits = append(digits, int(r-'0'))
}
}
if len(digits) == 0 {
return 0
}
return (10 * digits[0]) + digits[len(digits)-1]
}
func calibrationDocument(filename string) ([]string, error){
file, err := os.Open(filename)
if err != nil {
return nil, fmt.Errorf("unable to open %q; %w", filename, err)
}
defer file.Close()
var lines []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err := scanner.Err(); err != nil {
return nil, fmt.Errorf("error scanning %q; %w", filename, err)
}
return lines, nil
}

View file

@ -1,11 +1,6 @@
package main
import (
"bufio"
"fmt"
"io"
"log"
"os"
"strings"
)
@ -21,76 +16,63 @@ const (
nine = "nine"
)
func main() {
file, err := os.Open("2023/day-1/files/input")
if err != nil {
log.Fatalf("ERROR: %v\n", err)
}
defer file.Close()
fmt.Printf("Sum total: %d\n", calculateSumCalibrationValues(file))
}
func calculateSumCalibrationValues(r io.Reader) int {
scanner := bufio.NewScanner(r)
func partTwoCalculateSumCalibrationValues(document []string) int {
var (
digits []int
sum int
)
for scanner.Scan() {
line := scanner.Text()
sum = sum + calibrationValue(line, digits)
for _, line := range document {
sum = sum + partTwoCalibrationValue(line, digits)
}
return sum
}
func calibrationValue(line string, digits []int) int {
func partTwoCalibrationValue(line string, digits []int) int {
if len(line) > 0 {
switch {
case (line[0] >= '0') && (line[0] <= '9'):
digits = append(digits, int(line[0]-'0'))
return calibrationValue(line[1:], digits)
return partTwoCalibrationValue(line[1:], digits)
case strings.HasPrefix(line, one):
digits = append(digits, 1)
trimLength := len(one) - 1
return calibrationValue(line[trimLength:], digits)
return partTwoCalibrationValue(line[trimLength:], digits)
case strings.HasPrefix(line, two):
digits = append(digits, 2)
trimLength := len(two) - 1
return calibrationValue(line[trimLength:], digits)
return partTwoCalibrationValue(line[trimLength:], digits)
case strings.HasPrefix(line, three):
digits = append(digits, 3)
trimLength := len(three) - 1
return calibrationValue(line[trimLength:], digits)
return partTwoCalibrationValue(line[trimLength:], digits)
case strings.HasPrefix(line, four):
digits = append(digits, 4)
trimLength := len(four) - 1
return calibrationValue(line[trimLength:], digits)
return partTwoCalibrationValue(line[trimLength:], digits)
case strings.HasPrefix(line, five):
digits = append(digits, 5)
trimLength := len(five) - 1
return calibrationValue(line[trimLength:], digits)
return partTwoCalibrationValue(line[trimLength:], digits)
case strings.HasPrefix(line, six):
digits = append(digits, 6)
trimLength := len(six) - 1
return calibrationValue(line[trimLength:], digits)
return partTwoCalibrationValue(line[trimLength:], digits)
case strings.HasPrefix(line, seven):
digits = append(digits, 7)
trimLength := len(seven) - 1
return calibrationValue(line[trimLength:], digits)
return partTwoCalibrationValue(line[trimLength:], digits)
case strings.HasPrefix(line, eight):
digits = append(digits, 8)
trimLength := len(eight) - 1
return calibrationValue(line[trimLength:], digits)
return partTwoCalibrationValue(line[trimLength:], digits)
case strings.HasPrefix(line, nine):
digits = append(digits, 9)
trimLength := len(nine) - 1
return calibrationValue(line[trimLength:], digits)
return partTwoCalibrationValue(line[trimLength:], digits)
default:
return calibrationValue(line[1:], digits)
return partTwoCalibrationValue(line[1:], digits)
}
}