119 lines
2.2 KiB
Go
119 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
func lookahead(line string, i, peek int) string {
|
|
if len(line) > i+peek-1 {
|
|
return line[i : i+peek]
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func main() {
|
|
start := time.Now()
|
|
partOne()
|
|
duration := time.Since(start)
|
|
partTwo()
|
|
duration2 := time.Since(start)
|
|
fmt.Printf("p1: %s, p2: %s\n", duration, duration2-duration)
|
|
}
|
|
|
|
func makeScanner(test bool) *bufio.Scanner {
|
|
var f *os.File
|
|
if test {
|
|
f, _ = os.Open("inputs/testinput")
|
|
} else {
|
|
f, _ = os.Open("inputs/input")
|
|
}
|
|
reader := bufio.NewReader(f)
|
|
return bufio.NewScanner(reader)
|
|
}
|
|
|
|
func partOne() {
|
|
scanner := makeScanner(false)
|
|
|
|
sum := 0
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
var first, last rune
|
|
for _, c := range line {
|
|
switch c {
|
|
case '1', '2', '3', '4', '5', '6', '7', '8', '9':
|
|
if first == 0 {
|
|
first = c
|
|
}
|
|
last = c
|
|
}
|
|
}
|
|
sum += 10*(int(first)-48) + int(last) - 48 // direct ASCII translation
|
|
}
|
|
fmt.Println(sum)
|
|
}
|
|
|
|
func partTwo() {
|
|
scanner := makeScanner(false)
|
|
|
|
sum := 0
|
|
for scanner.Scan() {
|
|
line := scanner.Text()
|
|
var first, last rune
|
|
for i, c := range line {
|
|
switch {
|
|
case c == '1' || lookahead(line, i, 3) == "one":
|
|
if first == 0 {
|
|
first = '1'
|
|
}
|
|
last = '1'
|
|
case c == '2' || lookahead(line, i, 3) == "two":
|
|
if first == 0 {
|
|
first = '2'
|
|
}
|
|
last = '2'
|
|
case c == '3' || lookahead(line, i, 5) == "three":
|
|
if first == 0 {
|
|
first = '3'
|
|
}
|
|
last = '3'
|
|
|
|
case c == '4' || lookahead(line, i, 4) == "four":
|
|
if first == 0 {
|
|
first = '4'
|
|
}
|
|
last = '4'
|
|
case c == '5' || lookahead(line, i, 4) == "five":
|
|
if first == 0 {
|
|
first = '5'
|
|
}
|
|
last = '5'
|
|
case c == '6' || lookahead(line, i, 3) == "six":
|
|
if first == 0 {
|
|
first = '6'
|
|
}
|
|
last = '6'
|
|
case c == '7' || lookahead(line, i, 5) == "seven":
|
|
if first == 0 {
|
|
first = '7'
|
|
}
|
|
last = '7'
|
|
case c == '8' || lookahead(line, i, 5) == "eight":
|
|
if first == 0 {
|
|
first = '8'
|
|
}
|
|
last = '8'
|
|
case c == '9' || lookahead(line, i, 4) == "nine":
|
|
if first == 0 {
|
|
first = '9'
|
|
}
|
|
last = '9'
|
|
}
|
|
}
|
|
sum += 10*(int(first)-48) + int(last) - 48
|
|
}
|
|
fmt.Println(sum)
|
|
}
|