From 6c29a1abc13b4a45b4abdd753f052ba2c7659ed1 Mon Sep 17 00:00:00 2001 From: Luna Komorebi Date: Mon, 18 Dec 2023 16:23:11 +0100 Subject: [PATCH] Refactor parsing of digits to handle errors and convert strings to integers --- day1/part2.go | 116 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 39 deletions(-) diff --git a/day1/part2.go b/day1/part2.go index 456cb2f..3a8f370 100644 --- a/day1/part2.go +++ b/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) }