diff --git a/2023/day-1/main.go b/2023/day-1/main.go new file mode 100644 index 0000000..5b5e1af --- /dev/null +++ b/2023/day-1/main.go @@ -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)) +} diff --git a/2023/day-1/main_test.go b/2023/day-1/main_test.go new file mode 100644 index 0000000..f10f7c3 --- /dev/null +++ b/2023/day-1/main_test.go @@ -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) + } +} diff --git a/2023/day-1/part-1/main.go b/2023/day-1/part-1/main.go deleted file mode 100644 index 54a74cd..0000000 --- a/2023/day-1/part-1/main.go +++ /dev/null @@ -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] -} diff --git a/2023/day-1/part-1/main_test.go b/2023/day-1/part-1/main_test.go deleted file mode 100644 index 5e8a11c..0000000 --- a/2023/day-1/part-1/main_test.go +++ /dev/null @@ -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) - } -} diff --git a/2023/day-1/part-2/main_test.go b/2023/day-1/part-2/main_test.go deleted file mode 100644 index 7def2f0..0000000 --- a/2023/day-1/part-2/main_test.go +++ /dev/null @@ -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) - } -} diff --git a/2023/day-1/part_one.go b/2023/day-1/part_one.go new file mode 100644 index 0000000..0c1840d --- /dev/null +++ b/2023/day-1/part_one.go @@ -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 +} diff --git a/2023/day-1/part-2/main.go b/2023/day-1/part_two.go similarity index 56% rename from 2023/day-1/part-2/main.go rename to 2023/day-1/part_two.go index 022543d..03ab1fd 100644 --- a/2023/day-1/part-2/main.go +++ b/2023/day-1/part_two.go @@ -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) } }