Day 2: Gift Shop
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465


First I tried to to part 2 with a very poor regex strategy and the performance was abysmal. Switched to plain substrings and boom, instant result.
Golang
func part1() { ranges := readInput() invalidSum := 0 for _, r := range ranges { parts := strings.Split(r, "-") start, _ := strconv.Atoi(parts[0]) end, _ := strconv.Atoi(parts[1]) for num := start; num <= end; num++ { current := strconv.Itoa(num) n := len(current) if n%2 != 0 { continue } left := current[:n/2] right := current[n/2:] if left == right { invalidSum += num } } } fmt.Println(invalidSum) } func part2() { ranges := readInput() invalidSum := 0 for _, r := range ranges { parts := strings.Split(r, "-") start, _ := strconv.Atoi(parts[0]) end, _ := strconv.Atoi(parts[1]) for num := start; num <= end; num++ { current := strconv.Itoa(num) n := len(current) for index := 1; index <= n/2; index++ { if n%index != 0 { continue } left := 0 right := index prefix := current[left:right] isRepeated := true for left < n && right < n { left = right right = right + index next := current[left:right] if next != prefix { isRepeated = false break } } if isRepeated { invalidSum += num break } } } } fmt.Println(invalidSum) }