58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
|
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
|
||
|
}
|