65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
inputFile = flag.String("input", "input.txt", "input filename")
|
|
digRegex = regexp.MustCompile(`(?m)\d+`)
|
|
)
|
|
|
|
func NearSymbols(line string, lineLen int, pos []int) (symbols int) {
|
|
// fmt.Printf("looking at %s, line-length=%d\n", line[pos[0]:pos[1]], lineLen)
|
|
for i := pos[0] + lineLen - 1; i < (pos[1] + lineLen + 1); i++ {
|
|
if i < 0 || i >= len(line) {
|
|
// fmt.Printf("skipped invalid index %d (len=%d)\n", i, len(line))
|
|
continue
|
|
}
|
|
|
|
// fmt.Println("looking at " + string(line[i]))
|
|
|
|
if line[i] != '.' && line[i] != '\n' && (line[i] < 48 || line[i] > 57) {
|
|
fmt.Printf("found %s\n", string(line[i]))
|
|
symbols++
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
input, err := os.ReadFile(*inputFile)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
var sum int
|
|
strIn := string(input)
|
|
lineLen := strings.Index(strIn, "\n") + 1
|
|
allNumbers := digRegex.FindAllStringIndex(strIn, -1)
|
|
|
|
for _, numMatch := range allNumbers {
|
|
symbols := 0
|
|
symbols += NearSymbols(strIn, lineLen*-1, numMatch)
|
|
symbols += NearSymbols(strIn, 0, numMatch)
|
|
symbols += NearSymbols(strIn, lineLen, numMatch)
|
|
|
|
if symbols > 0 {
|
|
numberAsInt, err := strconv.Atoi(strIn[numMatch[0]:numMatch[1]])
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
sum += numberAsInt
|
|
fmt.Printf("%d matched with %d symbols\n", numberAsInt, symbols)
|
|
}
|
|
}
|
|
|
|
fmt.Printf("sum: %d\n", sum)
|
|
}
|