80 lines
1.6 KiB
Go
80 lines
1.6 KiB
Go
package day01
|
|
|
|
import (
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
func Part1(input string) uint {
|
|
lines := strings.Split(input, "\n")
|
|
sum := uint(0)
|
|
for i := 0; i < len(lines); i++ {
|
|
line := lines[i]
|
|
for j := 0; j < len(line); j++ {
|
|
if unicode.IsNumber(rune(line[j])) {
|
|
sum = sum + uint(line[j]-'0')*10
|
|
break
|
|
}
|
|
}
|
|
for j := len(line) - 1; j >= 0; j-- {
|
|
if unicode.IsNumber(rune(line[j])) {
|
|
sum = sum + uint(line[j]-'0')
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
return sum
|
|
}
|
|
|
|
func Part2(input string) uint {
|
|
lines := strings.Split(input, "\n")
|
|
sum := uint(0)
|
|
for i := 0; i < len(lines); i++ {
|
|
line := lines[i]
|
|
for j := 0; j < len(line); j++ {
|
|
n, found := writtenNumberAt(line, j)
|
|
if found {
|
|
sum = sum + n*10
|
|
break
|
|
}
|
|
}
|
|
for j := len(line) - 1; j >= 0; j-- {
|
|
n, found := writtenNumberAt(line, j)
|
|
if found {
|
|
sum = sum + n
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
return sum
|
|
}
|
|
|
|
func writtenNumberAt(line string, i int) (n uint, found bool) {
|
|
|
|
if unicode.IsNumber(rune(line[i])) {
|
|
return uint(line[i] - '0'), true
|
|
} else if strings.HasPrefix(line[i:], "one") {
|
|
return 1, true
|
|
} else if strings.HasPrefix(line[i:], "two") {
|
|
return 2, true
|
|
} else if strings.HasPrefix(line[i:], "three") {
|
|
return 3, true
|
|
} else if strings.HasPrefix(line[i:], "four") {
|
|
return 4, true
|
|
} else if strings.HasPrefix(line[i:], "five") {
|
|
return 5, true
|
|
} else if strings.HasPrefix(line[i:], "six") {
|
|
return 6, true
|
|
} else if strings.HasPrefix(line[i:], "seven") {
|
|
return 7, true
|
|
} else if strings.HasPrefix(line[i:], "eight") {
|
|
return 8, true
|
|
} else if strings.HasPrefix(line[i:], "nine") {
|
|
return 9, true
|
|
} else {
|
|
return 0, false
|
|
}
|
|
}
|