package main import ( "fmt" "log" "os" "strconv" ) func main() { inp := 301 tgt := 50000000 if len(os.Args) > 2 { inp = Atoi(os.Args[1]) tgt = Atoi(os.Args[2]) } else if len(os.Args) > 1 { fmt.Println("Usage: day17 [skip] [target]") fmt.Println("If you provide one argument, you must provide both") } spinLock := []int{0} var addPos int for i := 1; i <= tgt; i++ { addPos = (addPos + inp) % len(spinLock) // Unless we're adding it after the 0, we don't care, just append it. if addPos == 0 { addPos++ spinLock = Insert(spinLock, i, addPos) } else { addPos++ spinLock = append(spinLock, i) } } fmt.Println(spinLock[0:0+5], "...") } func Insert(slice []int, val, at int) []int { var ret []int pt1 := slice[:at] pt2 := slice[at:] for i := 0; i < len(pt1); i++ { ret = append(ret, pt1[i]) } ret = append(ret, val) for i := 0; i < len(pt2); i++ { ret = append(ret, pt2[i]) } return ret } func Atoi(i string) int { var ret int var err error if ret, err = strconv.Atoi(i); err != nil { log.Fatal("Invalid Atoi") } return ret }