Completed both parts of Day 1 puzzle

main
oabrivard 2 years ago
parent 7966166942
commit aa7a4df79b

@ -0,0 +1,111 @@
package day1
import (
"strconv"
)
func calibrate(lines []string) int {
result := 0
for _, line := range lines {
first, second := -1, -1
for _, c := range line {
if c >= '1' && c <= '9' {
val, _ := strconv.Atoi(string(c))
if first == -1 {
first = int(val)
} else {
second = int(val)
}
}
}
if second == -1 {
second = first
}
result += first*10 + second
}
return result
}
func calibrate2(lines []string) int {
result := 0
for _, line := range lines {
first, second := -1, -1
for i := 0; i < len(line); i++ {
c := line[i]
if c >= '1' && c <= '9' {
val, _ := strconv.Atoi(string(c))
if first == -1 {
first = int(val)
} else {
second = int(val)
}
} else {
// parse one, two, three, four, five, six, seven, eight, and nine
val := -1
switch c {
case 'o':
if i+2 < len(line) && line[i+1] == 'n' && line[i+2] == 'e' {
val = 1
}
case 't':
if i+2 < len(line) && line[i+1] == 'w' && line[i+2] == 'o' {
val = 2
} else if i+4 < len(line) && line[i+1] == 'h' && line[i+2] == 'r' && line[i+3] == 'e' && line[i+4] == 'e' {
val = 3
}
case 'f':
if i+3 < len(line) && line[i+1] == 'i' && line[i+2] == 'v' && line[i+3] == 'e' {
val = 5
} else if i+3 < len(line) && line[i+1] == 'o' && line[i+2] == 'u' && line[i+3] == 'r' {
val = 4
}
case 's':
if i+4 < len(line) && line[i+1] == 'e' && line[i+2] == 'v' && line[i+3] == 'e' && line[i+4] == 'n' {
val = 7
} else if i+2 < len(line) && line[i+1] == 'i' && line[i+2] == 'x' {
val = 6
}
case 'e':
if i+4 < len(line) && line[i+1] == 'i' && line[i+2] == 'g' && line[i+3] == 'h' && line[i+4] == 't' {
val = 8
}
case 'n':
if i+3 < len(line) && line[i+1] == 'i' && line[i+2] == 'n' && line[i+3] == 'e' {
val = 9
}
}
if val > -1 {
if first == -1 {
first = int(val)
} else {
second = int(val)
}
}
}
}
if second == -1 {
second = first
}
if first > -1 {
lineVal := first*10 + second
result += lineVal
}
}
return result
}

@ -0,0 +1,70 @@
package day1
import (
"strings"
"testing"
"gitea.paas.celticinfo.fr/oabrivard/aoc2023/utils"
)
func TestCalibrate(t *testing.T) {
lines := []string{"1abc2", "pqr3stu8vwx", "a1b2c3d4e5f", "treb7uchet"}
result := calibrate(lines)
if result != 142 {
t.Fatalf("expected 142, got %d", result)
}
}
func TestCalibrateWithInput(t *testing.T) {
lines := utils.ReadLines("input.txt")
result := calibrate(lines)
if result != 53921 {
t.Fatalf("expected 53921, got %d", result)
}
}
func TestCalibrate2(t *testing.T) {
lines := strings.Split(`two1nine
eightwothree
abcone2threexyz
xtwone3four
4nineeightseven2
zoneight234
7pqrstsixteen`, "\n")
result := calibrate2(lines)
if result != 281 {
t.Fatalf("expected 281, got %d", result)
}
}
func TestCalibrate2tmp(t *testing.T) {
lines := strings.Split(`one
two
three
four
five
six
seven
eight
nine`, "\n")
result := calibrate2(lines)
if result != 495 {
t.Fatalf("expected 495, got %d", result)
}
}
func TestCalibrate2WithInput(t *testing.T) {
lines := utils.ReadLines("input.txt")
result := calibrate2(lines)
if result != 54676 {
t.Fatalf("expected 54676, got %d", result)
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,3 @@
module gitea.paas.celticinfo.fr/oabrivard/aoc2023
go 1.21.4

@ -0,0 +1,27 @@
package utils
import (
"bufio"
"log"
"os"
)
func ReadLines(fileName string) []string {
result := []string{}
file, err := os.Open(fileName)
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
result = append(result, scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
return result
}
Loading…
Cancel
Save