You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
2.1 KiB
Go

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
}