Day 22
This commit is contained in:
@@ -23,7 +23,8 @@ val solvers = Map[Int, Solver](
|
|||||||
18 -> Day18,
|
18 -> Day18,
|
||||||
19 -> Day19,
|
19 -> Day19,
|
||||||
20 -> Day20,
|
20 -> Day20,
|
||||||
21 -> Day21
|
21 -> Day21,
|
||||||
|
22 -> Day22
|
||||||
)
|
)
|
||||||
|
|
||||||
def runSolver(solver: Solver, input: os.Path): Unit =
|
def runSolver(solver: Solver, input: os.Path): Unit =
|
||||||
|
|||||||
60
aoc/src/dev/ctsk/aoc/days/Day22.scala
Normal file
60
aoc/src/dev/ctsk/aoc/days/Day22.scala
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
package dev.ctsk.aoc.days
|
||||||
|
|
||||||
|
import dev.ctsk.aoc.*
|
||||||
|
import scala.collection.mutable
|
||||||
|
|
||||||
|
object Day22 extends Solver(22):
|
||||||
|
inline def hash(n: Long): Long =
|
||||||
|
var secret = n
|
||||||
|
secret ^= (secret << 6)
|
||||||
|
secret &= 0xffffff
|
||||||
|
secret ^= (secret >> 5)
|
||||||
|
secret &= 0xffffff
|
||||||
|
secret ^= (secret << 11)
|
||||||
|
secret &= 0xffffff
|
||||||
|
secret
|
||||||
|
|
||||||
|
def hash(n: Long, count: Int): Long =
|
||||||
|
Iterator.iterate(n)(hash).drop(count).next()
|
||||||
|
|
||||||
|
def part1(initial: Seq[Long]): Long = initial.map(hash(_, 2000)).sum
|
||||||
|
|
||||||
|
def part2(initial: Seq[Long]): Long =
|
||||||
|
inline def update(hash: Int, next: Int): Int =
|
||||||
|
((hash << 5) & 0xfffff) | (next + 10)
|
||||||
|
|
||||||
|
val maxHash = Seq(9, 9, 9, 9).fold(0)(update)
|
||||||
|
val bananas = Array.fill(maxHash)(0)
|
||||||
|
val seen = mutable.BitSet(maxHash)
|
||||||
|
|
||||||
|
initial.foreach { value =>
|
||||||
|
seen.clear()
|
||||||
|
val it = Iterator.iterate(value)(hash).map(_.toInt % 10)
|
||||||
|
var last = it.next()
|
||||||
|
var window = 0
|
||||||
|
|
||||||
|
for v <- it.take(3) do
|
||||||
|
val diff = v - last
|
||||||
|
last = v
|
||||||
|
window = update(window, diff)
|
||||||
|
|
||||||
|
for v <- it.take(2000 - 3) do
|
||||||
|
val diff = v - last
|
||||||
|
last = v
|
||||||
|
window = update(window, diff)
|
||||||
|
if !seen(window) then
|
||||||
|
seen += window
|
||||||
|
bananas(window) += v
|
||||||
|
}
|
||||||
|
|
||||||
|
bananas.max
|
||||||
|
|
||||||
|
override def run(input: os.ReadablePath): (Timings, Solution) =
|
||||||
|
val initial = os.read.lines(input).map(_.toLong)
|
||||||
|
val (p1_time, p1_solution) = timed { part1(initial) }
|
||||||
|
val (p2_time, p2_solution) = timed { part2(initial) }
|
||||||
|
|
||||||
|
(
|
||||||
|
Timings(0, p1_time, p2_time),
|
||||||
|
Solution(Long.box(p1_solution), Long.box(p2_solution))
|
||||||
|
)
|
||||||
2
data/22.ans
Normal file
2
data/22.ans
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
16894083306
|
||||||
|
1925
|
||||||
2002
data/22.in
Normal file
2002
data/22.in
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user