package day1 import ( "strconv" ) func calibrate(lines []string) int { result := 0 for _, line := range lines { first, second := -1, -1 for _, c := range line { if c >= '1' && c <= '9' { val, _ := strconv.Atoi(string(c)) if first == -1 { first = int(val) } else { second = int(val) } } } if second == -1 { second = first } result += first*10 + second } return result } func calibrate2(lines []string) int { result := 0 for _, line := range lines { first, second := -1, -1 for i := 0; i < len(line); i++ { c := line[i] if c >= '1' && c <= '9' { val, _ := strconv.Atoi(string(c)) if first == -1 { first = int(val) } else { second = int(val) } } else { // parse one, two, three, four, five, six, seven, eight, and nine val := -1 switch c { case 'o': if i+2 < len(line) && line[i+1] == 'n' && line[i+2] == 'e' { val = 1 } case 't': if i+2 < len(line) && line[i+1] == 'w' && line[i+2] == 'o' { val = 2 } else if i+4 < len(line) && line[i+1] == 'h' && line[i+2] == 'r' && line[i+3] == 'e' && line[i+4] == 'e' { val = 3 } case 'f': if i+3 < len(line) && line[i+1] == 'i' && line[i+2] == 'v' && line[i+3] == 'e' { val = 5 } else if i+3 < len(line) && line[i+1] == 'o' && line[i+2] == 'u' && line[i+3] == 'r' { val = 4 } case 's': if i+4 < len(line) && line[i+1] == 'e' && line[i+2] == 'v' && line[i+3] == 'e' && line[i+4] == 'n' { val = 7 } else if i+2 < len(line) && line[i+1] == 'i' && line[i+2] == 'x' { val = 6 } case 'e': if i+4 < len(line) && line[i+1] == 'i' && line[i+2] == 'g' && line[i+3] == 'h' && line[i+4] == 't' { val = 8 } case 'n': if i+3 < len(line) && line[i+1] == 'i' && line[i+2] == 'n' && line[i+3] == 'e' { val = 9 } } if val > -1 { if first == -1 { first = int(val) } else { second = int(val) } } } } if second == -1 { second = first } if first > -1 { lineVal := first*10 + second result += lineVal } } return result }