@@ -6,18 +6,17 @@ object Day20:
66 def parse (input : Seq [Int ], key : Long ): Seq [Node ] =
77 val nodes = input.map(n => Node (n * key, null , null ))
88 nodes.zipWithIndex.foreach { (node, i) =>
9- node.prev = nodes(if i > 0 then i - 1 else input .size - 1 )
10- node.next = nodes(if i + 1 < input .size then i + 1 else 0 )
9+ node.prev = nodes((i - 1 + nodes .size) % nodes.size )
10+ node.next = nodes(( i + 1 ) % nodes .size)
1111 }
1212 nodes
1313
1414 def mix (nodes : Seq [Node ]): Unit =
1515 for node <- nodes do
16- val move = (node.value % (nodes.size - 1 )).toInt
17- for _ <- 1 to move.abs do
18- val (a, b, c, d) =
19- if (move > 0 ) (node.prev, node, node.next, node.next.next)
20- else (node.prev.prev, node.prev, node, node.next)
16+ val remainder = (node.value % (nodes.size - 1 )).toInt
17+ val move = if remainder >= 0 then remainder else remainder + nodes.size - 1
18+ for _ <- 1 to move do
19+ val (a, b, c, d) = (node.prev, node, node.next, node.next.next)
2120 a.next = c
2221 b.prev = c
2322 b.next = d
@@ -27,12 +26,13 @@ object Day20:
2726 end for
2827 end for
2928
29+ def skip (start : Node ): Node = Iterator .iterate(start)(_.next).drop(1000 ).next()
30+
3031 def decrypt (input : Seq [Int ], key : Long , rounds : Int ): Long =
3132 val nodes = parse(input, key)
3233 for _ <- 1 to rounds do mix(nodes)
33- val zero = nodes.find(_.value == 0 ).get
34- def next (start : Node ): Node = Iterator .iterate(start)(_.next).drop(1000 ).next()
35- Iterator .iterate(zero)(next).drop(1 ).take(3 ).map(_.value).sum
34+ val start = nodes.find(_.value == 0 ).get
35+ Iterator .iterate(start)(skip).drop(1 ).take(3 ).map(_.value).sum
3636
3737 def part1 (input : Seq [Int ]): Long = decrypt(input, 1 , 1 )
3838
0 commit comments