102 lines
1.5 KiB
Go
102 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
|
)
|
|
|
|
type Node struct {
|
|
value int
|
|
prev *Node
|
|
next *Node
|
|
}
|
|
|
|
func main() {
|
|
inp := h.StdinToStringSlice()
|
|
part1(inp)
|
|
part2(inp)
|
|
}
|
|
|
|
func part1(inp []string) {
|
|
var list []*Node
|
|
var first *Node
|
|
for i := range inp {
|
|
n := &Node{value: h.Atoi(inp[i])}
|
|
if n.value == 0 {
|
|
first = n
|
|
}
|
|
list = append(list, n)
|
|
}
|
|
initList(list)
|
|
mixAll(list)
|
|
fmt.Println("# Part 1")
|
|
fmt.Println(getCoords(first))
|
|
}
|
|
|
|
func part2(inp []string) {
|
|
key := 811589153
|
|
var list []*Node
|
|
var first *Node
|
|
for i := range inp {
|
|
n := &Node{value: h.Atoi(inp[i]) * key}
|
|
if n.value == 0 {
|
|
first = n
|
|
}
|
|
list = append(list, n)
|
|
}
|
|
initList(list)
|
|
for i := 0; i < 10; i++ {
|
|
mixAll(list)
|
|
}
|
|
fmt.Println("# Part 2")
|
|
fmt.Println(getCoords(first))
|
|
}
|
|
|
|
func initList(list []*Node) {
|
|
list[0].prev = list[len(list)-1]
|
|
list[len(list)-1].next = list[0]
|
|
for i := 1; i < len(list); i++ {
|
|
list[i].prev = list[i-1]
|
|
list[i-1].next = list[i]
|
|
}
|
|
}
|
|
|
|
func move(n *Node, count int) *Node {
|
|
for count < 0 {
|
|
n = n.prev
|
|
count++
|
|
}
|
|
for count > 0 {
|
|
n = n.next
|
|
count--
|
|
}
|
|
return n
|
|
}
|
|
|
|
func mix(n *Node, listLen int) {
|
|
t := n.prev
|
|
n.prev.next = n.next
|
|
n.next.prev = n.prev
|
|
t = move(t, n.value%(listLen-1))
|
|
n.prev = t
|
|
n.next = t.next
|
|
n.prev.next = n
|
|
n.next.prev = n
|
|
}
|
|
|
|
func mixAll(list []*Node) {
|
|
for _, n := range list {
|
|
mix(n, len(list))
|
|
}
|
|
}
|
|
|
|
func getCoords(first *Node) int {
|
|
var res int
|
|
for i, n := 0, first; i < 3; i++ {
|
|
n = move(n, 1000)
|
|
res += n.value
|
|
}
|
|
return res
|
|
}
|