github.com/agrigoryan/aoc_2023_go@v0.0.0-20231216221323-4ace361ec685/day1/d1p2.go (about)

     1  package day1
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  	"strings"
     7  )
     8  
     9  var digits = map[string]int{
    10  	"one":   1,
    11  	"1":     1,
    12  	"two":   2,
    13  	"2":     2,
    14  	"three": 3,
    15  	"3":     3,
    16  	"four":  4,
    17  	"4":     4,
    18  	"five":  5,
    19  	"5":     5,
    20  	"six":   6,
    21  	"6":     6,
    22  	"seven": 7,
    23  	"7":     7,
    24  	"eight": 8,
    25  	"8":     8,
    26  	"nine":  9,
    27  	"9":     9,
    28  }
    29  
    30  func findSumWithRegexp(lines []string) int {
    31  	sum := 0
    32  	re := regexp.MustCompile(`(\d|one|two|three|four|five|six|seven|eight|nine)`)
    33  	for _, line := range lines {
    34  		matches := re.FindAllString(line, len(line))
    35  		fmt.Println(line, matches)
    36  		d1, d2 := matches[0], matches[len(matches)-1]
    37  		fmt.Println(d1, d2)
    38  		sum += digits[d1]*10 + digits[d2]
    39  	}
    40  	return sum
    41  }
    42  
    43  func findSumBrutally(lines []string) int {
    44  	sum := 0
    45  	for _, line := range lines {
    46  		first_digit, last_digit := 0, 0
    47  		first_idx, last_idx := -1, -1
    48  		for k, v := range digits {
    49  			if i := strings.Index(line, k); i != -1 && (i < first_idx || first_idx == -1) {
    50  				first_idx = i
    51  				first_digit = v
    52  			}
    53  			if i := strings.LastIndex(line, k); i > last_idx || last_idx == -1 {
    54  				last_idx = i
    55  				last_digit = v
    56  			}
    57  		}
    58  		fmt.Println(line, first_digit, last_digit)
    59  		sum += first_digit*10 + last_digit
    60  	}
    61  	return sum
    62  }
    63  
    64  func d1p2(input string) int {
    65  	sum := findSumBrutally(strings.Split(input, "\n"))
    66  	fmt.Println(sum)
    67  	return sum
    68  }