|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"unicode"
|
|
|
|
)
|
|
|
|
|
|
|
|
func linevalue(digits []rune) int {
|
|
|
|
str := fmt.Sprintf("%c%c", digits[0], digits[len(digits)-1])
|
|
|
|
value, _ := strconv.Atoi(str)
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
|
|
|
func finddigits(line string) []rune {
|
|
|
|
d := make([]rune, 0, 7)
|
|
|
|
for len(line) > 0 {
|
|
|
|
if unicode.IsDigit(rune(line[0])) {
|
|
|
|
d = append(d, rune(line[0]))
|
|
|
|
}
|
|
|
|
line = line[1:]
|
|
|
|
}
|
|
|
|
return d
|
|
|
|
}
|
|
|
|
|
|
|
|
func findtextdigits(line string) []rune {
|
|
|
|
d := make([]rune, 0, 7)
|
|
|
|
for len(line) > 0 {
|
|
|
|
if unicode.IsDigit(rune(line[0])) {
|
|
|
|
d = append(d, rune(line[0]))
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.HasPrefix(line, "one") {
|
|
|
|
d = append(d, '1')
|
|
|
|
line = line[2:]
|
|
|
|
} else if strings.HasPrefix(line, "two") {
|
|
|
|
d = append(d, '2')
|
|
|
|
line = line[2:]
|
|
|
|
} else if strings.HasPrefix(line, "three") {
|
|
|
|
d = append(d, '3')
|
|
|
|
line = line[4:]
|
|
|
|
} else if strings.HasPrefix(line, "four") {
|
|
|
|
d = append(d, '4')
|
|
|
|
line = line[4:] // skip len("four") entirely because no digits start with 'r'
|
|
|
|
} else if strings.HasPrefix(line, "five") {
|
|
|
|
d = append(d, '5')
|
|
|
|
line = line[3:]
|
|
|
|
} else if strings.HasPrefix(line, "six") {
|
|
|
|
d = append(d, '6')
|
|
|
|
line = line[3:] // skip len("six") entirely because no digits start with 'x'
|
|
|
|
} else if strings.HasPrefix(line, "seven") {
|
|
|
|
d = append(d, '7')
|
|
|
|
line = line[4:]
|
|
|
|
} else if strings.HasPrefix(line, "eight") {
|
|
|
|
d = append(d, '8')
|
|
|
|
line = line[4:]
|
|
|
|
} else if strings.HasPrefix(line, "nine") {
|
|
|
|
d = append(d, '9')
|
|
|
|
line = line[3:]
|
|
|
|
} else {
|
|
|
|
line = line[1:]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return d
|
|
|
|
}
|
|
|
|
|
|
|
|
type day01 struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d day01) solve1(r io.Reader) string {
|
|
|
|
var (
|
|
|
|
total int
|
|
|
|
scanner = bufio.NewScanner(r)
|
|
|
|
)
|
|
|
|
|
|
|
|
for scanner.Scan() {
|
|
|
|
digits := finddigits(scanner.Text())
|
|
|
|
total += linevalue(digits)
|
|
|
|
}
|
|
|
|
return fmt.Sprintf("%d", total)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d day01) solve2(r io.Reader) (ans string) {
|
|
|
|
var (
|
|
|
|
total int
|
|
|
|
scanner = bufio.NewScanner(r)
|
|
|
|
)
|
|
|
|
|
|
|
|
for scanner.Scan() {
|
|
|
|
digits := findtextdigits(scanner.Text())
|
|
|
|
total += linevalue(digits)
|
|
|
|
}
|
|
|
|
|
|
|
|
return fmt.Sprintf("%d", total)
|
|
|
|
}
|