98 lines
1.5 KiB
Go
98 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
|
)
|
|
|
|
func main() {
|
|
inp := h.StdinToStringSlice()
|
|
part1(inp)
|
|
part2(inp)
|
|
}
|
|
|
|
func part1(input []string) {
|
|
var value int
|
|
for _, i := range input {
|
|
value = value + getValue(i, false)
|
|
}
|
|
fmt.Println("# Part 1")
|
|
fmt.Println(value)
|
|
}
|
|
|
|
var nums = []string{
|
|
"zero",
|
|
"one",
|
|
"two",
|
|
"three",
|
|
"four",
|
|
"five",
|
|
"six",
|
|
"seven",
|
|
"eight",
|
|
"nine",
|
|
}
|
|
|
|
func part2(input []string) {
|
|
var value int
|
|
for _, i := range input {
|
|
value = value + getValue(i, true)
|
|
}
|
|
fmt.Println("# Part 2")
|
|
fmt.Println(value)
|
|
}
|
|
|
|
func getValue(wrk string, p2 bool) int {
|
|
return (getFirstValue(wrk, p2) * 10) + getLastValue(wrk, p2)
|
|
}
|
|
func getFirstValue(wrk string, p2 bool) int {
|
|
for j := 0; j < len(wrk); j++ {
|
|
if p2 {
|
|
v := numStringAt(wrk, j)
|
|
if v > -1 {
|
|
return v
|
|
}
|
|
}
|
|
if wrk[j]-'0' >= 0 && wrk[j]-'0' <= 9 {
|
|
return int(wrk[j] - '0')
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
func getLastValue(wrk string, p2 bool) int {
|
|
for j := len(wrk) - 1; j >= 0; j-- {
|
|
if p2 {
|
|
v := numStringAt(wrk, j)
|
|
if v > -1 {
|
|
return v
|
|
}
|
|
}
|
|
if wrk[j]-'0' >= 0 && wrk[j]-'0' <= 9 {
|
|
return int(wrk[j] - '0')
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func numStringAt(haystack string, pos int) int {
|
|
for i := range nums {
|
|
if stringAt(haystack, pos, nums[i]) {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
func stringAt(haystack string, pos int, needle string) bool {
|
|
if len(haystack) < pos+len(needle) {
|
|
return false
|
|
}
|
|
for i := range needle {
|
|
if haystack[pos+i] != needle[i] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|