package main import "fmt" func main() { fmt.Println(run([]int{5,1,9,18,13,8,0}, 2020)) fmt.Println(runPart2([]int{5,1,9,18,13,8,0}, 30000000)) } func run(startingNumber []int, length int) int{ var band []int band = append(band, startingNumber...) for i := len(startingNumber); i < length; i++ { currentNumber := band[i-1] index := findIndex(currentNumber,band) if index == -1 { band = append(band, 0) }else { band = append(band, i-1-index) } } return band[len(band)-1] } func runPart2(startingNumber []int, length int) int{ var band = make (map[int][]int) for i, val := range startingNumber { band[val] = []int{i,i} } lastNumber := startingNumber[len(startingNumber)-1] for i := len(startingNumber); i < length; i++ { currentNumber := lastNumber indexes := band[currentNumber] diffIndexes := indexes[1]-indexes[0] if diffIndexes == 0 { lastNumber = 0 band[0] = []int{band[0][1],i} }else { lastNumber = diffIndexes if len(band[diffIndexes]) != 0 { band[diffIndexes] = []int{band[diffIndexes][1],i} }else { band[diffIndexes] = []int{i,i} } } } return lastNumber } func findIndex(number int, band []int) int{ for i := len(band)-2; i >= 0; i-- { if band[i] == number { return i } } return -1 }