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:
parent
bd36605f3e
commit
86fd297d5b
7 changed files with 136 additions and 133 deletions
16
2023/day-1/main.go
Normal file
16
2023/day-1/main.go
Normal 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
50
2023/day-1/main_test.go
Normal 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)
|
||||
}
|
||||
}
|
|
@ -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]
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -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
55
2023/day-1/part_one.go
Normal 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
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in a new issue