Refactor parsing of digits to handle errors and convert strings to integers

This commit is contained in:
Luna 2023-12-18 16:23:11 +01:00
parent da6a330f7a
commit 6c29a1abc1

View file

@ -1,14 +1,13 @@
package main package main
import ( import (
"bufio"
"errors" "errors"
"fmt" "fmt"
"io" "io"
"log" "log"
"os" "os"
"regexp" "regexp"
"strconv"
"strings"
) )
func readInput() string { func readInput() string {
@ -21,64 +20,103 @@ func readInput() string {
return str return str
} }
func parseDigit(input string) (string, error) { func readFile() string {
digits := map[string]string{ file, err := os.ReadFile("input.txt")
"one": "1", if err != nil {
"two": "2", panic(err)
"three": "3", }
"four": "4", str := string(file)
"five": "5", return str
"six": "6", }
"seven": "7",
"eight": "8", func readFileLineByLine() []string {
"nine": "9", var lines []string
"1": "1", file, err := os.Open("input.txt")
"2": "2", if err != nil {
"3": "3", log.Fatal(err)
"4": "4", }
"5": "5", defer file.Close()
"6": "6",
"7": "7", scanner := bufio.NewScanner(file)
"8": "8", // optionally, resize scanner's capacity for lines over 64K, see next example
"9": "9", for scanner.Scan() {
lines = append(lines, scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
return lines
}
func parseDigit(input string) (int, error) {
digits := map[string]int{
"one": 1,
"two": 2,
"three": 3,
"four": 4,
"five": 5,
"six": 6,
"seven": 7,
"eight": 8,
"nine": 9,
"1": 1,
"2": 2,
"3": 3,
"4": 4,
"5": 5,
"6": 6,
"7": 7,
"8": 8,
"9": 9,
} }
i, ok := digits[input] i, ok := digits[input]
if ok == false { if ok == false {
return "", errors.New("No spelled digit") return 0, errors.New("err")
} }
return i, nil return i, nil
} }
func addDStrings(input1 string, input2 string) string { // func addDStrings(input1 string, input2 string) string {
num1, err := parseDigit(input1) // num1, err := parseDigit(input1)
if err != nil { // if err != nil {
num1 = input1 // num1 = input1
} // log.Fatalln(err)
num2, err := parseDigit(input2) // }
if err != nil { // num2, err := parseDigit(input2)
num2 = input2 // if err != nil {
} // num2 = input2
num_str := num1 + num2 // log.Fatalln(err)
return num_str // }
} // num_str := num1 + num2
// println(num_str)
// return num_str
// }
func main() { func main() {
lines := strings.Split(readInput(), "\n") // lines := strings.Split(readFile(), "\n")
lines := readFileLineByLine()
re := regexp.MustCompile(`(one|two|three|four|five|six|seven|eight|nine|\d)`) re := regexp.MustCompile(`(one|two|three|four|five|six|seven|eight|nine|\d)`)
var answer int var answer int
for _, l := range lines { for _, l := range lines {
matches := re.FindAllString(l, -1) matches := re.FindAllString(l, -1)
matches_len := len(matches) matches_len := len(matches)
if matches_len == 0 { if matches_len == 0 {
continue break
} }
first := matches[0] first := matches[0]
last := matches[matches_len-1] last := matches[matches_len-1]
num_str := addDStrings(first, last) num_f, err := parseDigit(first)
num, err := strconv.Atoi(num_str)
if err != nil { if err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
num_l, err := parseDigit(last)
// num_str := addDStrings(first, last)
// num, err := strconv.Atoi(num_str)
if err != nil {
log.Fatalln(err)
}
num := (num_f * 10) + num_l
answer = answer + num answer = answer + num
fmt.Println(l, first, last, num) fmt.Println(l, first, last, num)
} }