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
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
|
|
}
|