AdventOfCode2023/01/main.go
2023-12-01 20:51:29 -05:00

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