90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
package day11
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func Part1(input string) int {
|
|
stones := ParseInput(input)
|
|
return len(blinkTimes(stones, 25))
|
|
}
|
|
|
|
func Part2(input string) int {
|
|
stones := ParseInput(input)
|
|
return getNumStones(stones, 75)
|
|
}
|
|
|
|
func ParseInput(input string) []int {
|
|
strStones := strings.Split(strings.TrimSpace(input), " ")
|
|
stones := make([]int, 0, len(strStones))
|
|
for _, s := range strStones {
|
|
num, _ := strconv.Atoi(s)
|
|
stones = append(stones, num)
|
|
}
|
|
return stones
|
|
}
|
|
|
|
// Part 1 initial thought of recursion
|
|
func blinkTimes(stones []int, times int) []int {
|
|
if times <= 0 {
|
|
return stones
|
|
}
|
|
result := blink(stones)
|
|
return blinkTimes(result, times-1)
|
|
}
|
|
|
|
func blink(stones []int) []int {
|
|
result := make([]int, 0)
|
|
for _, stone := range stones {
|
|
strStone := strconv.Itoa(stone)
|
|
if stone == 0 {
|
|
result = append(result, 1)
|
|
} else if len(strStone)%2 == 0 {
|
|
mid := len(strStone) / 2
|
|
firstHalf, _ := strconv.Atoi(strStone[:mid])
|
|
secondHalf, _ := strconv.Atoi(strStone[mid:])
|
|
result = append(result, firstHalf, secondHalf)
|
|
} else {
|
|
result = append(result, stone*2024)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
// Part 2 with maps since blinkTimes(75) would set my computer on fire
|
|
func getNumStones(s []int, times int) int {
|
|
stoneMap := make(map[int]int)
|
|
for _, stone := range s {
|
|
stoneMap[stone] = stoneMap[stone] + 1
|
|
}
|
|
|
|
for i := 0; i < times; i++ {
|
|
stoneMap2 := make(map[int]int)
|
|
for stone, count := range stoneMap {
|
|
stones := make([]int, 0)
|
|
strStone := strconv.Itoa(stone)
|
|
if stone == 0 {
|
|
stones = append(stones, 1)
|
|
} else if len(strStone)%2 == 0 {
|
|
mid := len(strStone) / 2
|
|
firstHalf, _ := strconv.Atoi(strStone[:mid])
|
|
secondHalf, _ := strconv.Atoi(strStone[mid:])
|
|
stones = append(stones, firstHalf, secondHalf)
|
|
} else {
|
|
stones = append(stones, stone*2024)
|
|
}
|
|
for _, newStone := range stones {
|
|
stoneMap2[newStone] = stoneMap2[newStone] + count
|
|
}
|
|
}
|
|
stoneMap = stoneMap2
|
|
}
|
|
|
|
result := 0
|
|
for _, count := range stoneMap {
|
|
result += count
|
|
}
|
|
return result
|
|
}
|