package day12 func FastRunGeneration(plants []byte, rules map[string]byte, rootIndex int) ([]byte, int) { newGen := make([]byte, len(plants), len(plants)+4) for i := 0; i < len(plants); i++ { newGen[i] = rules[getKey(plants, i)] } result1 := rules[getKey(plants, -2)] result2 := rules[getKey(plants, -1)] if result1 == '#' || result2 == '#' { newGen = append([]byte{result1, result2}, newGen...) rootIndex += 2 } result1 = rules[getKey(plants, len(plants))] result2 = rules[getKey(plants, len(plants)+1)] if result1 == '#' || result2 == '#' { newGen = append(newGen, result1, result2) } return newGen, rootIndex } func getKey(plants []byte, i int) string { if i < 2 { key := "" for j := 0; j < 2-i; j++ { key += "." } key += string(plants[0 : i+2]) return key } if i > len(plants)-2 { key := string(plants[i-2 : len(plants)-1]) for j := 0; j < len(plants)-1-i; j++ { key += "." } key += string(plants[0 : i+2]) return key } return string(plants[i-2 : i+2]) } func FastSumPlants(plants []byte, rootIndex int) int { sum := 0 for index, value := range plants { if value == '#' { sum += index - rootIndex } } return sum }