Refactor parsing of digits to handle errors and convert strings to integers
This commit is contained in:
parent
da6a330f7a
commit
6c29a1abc1
1 changed files with 77 additions and 39 deletions
116
day1/part2.go
116
day1/part2.go
|
@ -1,14 +1,13 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func readInput() string {
|
||||
|
@ -21,64 +20,103 @@ func readInput() string {
|
|||
return str
|
||||
}
|
||||
|
||||
func parseDigit(input string) (string, error) {
|
||||
digits := map[string]string{
|
||||
"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",
|
||||
func readFile() string {
|
||||
file, err := os.ReadFile("input.txt")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
str := string(file)
|
||||
return str
|
||||
}
|
||||
|
||||
func readFileLineByLine() []string {
|
||||
var lines []string
|
||||
file, err := os.Open("input.txt")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
// optionally, resize scanner's capacity for lines over 64K, see next example
|
||||
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]
|
||||
if ok == false {
|
||||
return "", errors.New("No spelled digit")
|
||||
return 0, errors.New("err")
|
||||
}
|
||||
return i, nil
|
||||
}
|
||||
|
||||
func addDStrings(input1 string, input2 string) string {
|
||||
num1, err := parseDigit(input1)
|
||||
if err != nil {
|
||||
num1 = input1
|
||||
}
|
||||
num2, err := parseDigit(input2)
|
||||
if err != nil {
|
||||
num2 = input2
|
||||
}
|
||||
num_str := num1 + num2
|
||||
return num_str
|
||||
}
|
||||
// func addDStrings(input1 string, input2 string) string {
|
||||
// num1, err := parseDigit(input1)
|
||||
// if err != nil {
|
||||
// num1 = input1
|
||||
// log.Fatalln(err)
|
||||
// }
|
||||
// num2, err := parseDigit(input2)
|
||||
// if err != nil {
|
||||
// num2 = input2
|
||||
// log.Fatalln(err)
|
||||
// }
|
||||
// num_str := num1 + num2
|
||||
// println(num_str)
|
||||
// return num_str
|
||||
// }
|
||||
|
||||
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)`)
|
||||
var answer int
|
||||
for _, l := range lines {
|
||||
matches := re.FindAllString(l, -1)
|
||||
matches_len := len(matches)
|
||||
if matches_len == 0 {
|
||||
continue
|
||||
break
|
||||
}
|
||||
first := matches[0]
|
||||
last := matches[matches_len-1]
|
||||
num_str := addDStrings(first, last)
|
||||
num, err := strconv.Atoi(num_str)
|
||||
num_f, err := parseDigit(first)
|
||||
if err != nil {
|
||||
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
|
||||
fmt.Println(l, first, last, num)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue