Day 11
This commit is contained in:
parent
4b2867b1c7
commit
8ec25ab651
2 changed files with 136 additions and 0 deletions
81
aoc/src/Day11.scala
Normal file
81
aoc/src/Day11.scala
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
import scala.io.Source
|
||||
|
||||
object Day11 extends App:
|
||||
|
||||
val input = Source
|
||||
.fromURL(getClass.getResource("day11Input.txt"))
|
||||
.mkString
|
||||
.split('\n')
|
||||
.toList
|
||||
|
||||
final case class Monkey(
|
||||
operation: Long => Long,
|
||||
testDiv: Long,
|
||||
targetTrue: Int,
|
||||
targetFalse: Int,
|
||||
items: List[Long],
|
||||
inspected: Int = 0)
|
||||
|
||||
val monkeys = input
|
||||
.grouped(7)
|
||||
.toList
|
||||
.map(_.filter(_.nonEmpty))
|
||||
.map(lines =>
|
||||
Monkey(
|
||||
lines(2).split(" ").takeRight(3) match
|
||||
case Array("old", "*", "old") => old => old * old
|
||||
case Array("old", "+", "old") => old => old + old
|
||||
case Array("old", "+", value) => _ + value.toInt
|
||||
case Array("old", "*", value) => _ * value.toInt
|
||||
,
|
||||
lines(3).split(" ").last.toInt,
|
||||
lines(4).split(" ").last.toInt,
|
||||
lines(5).split(" ").last.toInt,
|
||||
lines(1).split(": ").last.split(", ").map(_.toInt).toList.map(_.toLong)
|
||||
)
|
||||
).toList
|
||||
|
||||
val part1 = (0 until (monkeys.length * 20))
|
||||
.map(_ % (monkeys.length))
|
||||
.foldLeft(monkeys)((monkeys, i) =>
|
||||
val m = monkeys(i)
|
||||
m.items
|
||||
.foldLeft(monkeys) { case (monkeys, item) =>
|
||||
val newItem = m.operation(item)
|
||||
val receiver = if (newItem / 3) % m.testDiv == 0 then m.targetTrue else m.targetFalse
|
||||
val rm = monkeys(receiver)
|
||||
monkeys.updated(receiver, rm.copy(items = rm.items.appended(newItem / 3)))
|
||||
}
|
||||
.updated(i, m.copy(items = List(), inspected = m.inspected + m.items.length))
|
||||
)
|
||||
.map(_.inspected)
|
||||
.sorted
|
||||
.takeRight(2)
|
||||
.product
|
||||
println("Part 1:")
|
||||
println(part1)
|
||||
|
||||
val modulus = monkeys.map(_.testDiv).product
|
||||
|
||||
val part2 = (0 until (monkeys.length * 10000))
|
||||
.map(_ % (monkeys.length))
|
||||
.foldLeft(monkeys)((monkeys, i) =>
|
||||
val m = monkeys(i)
|
||||
m.items
|
||||
.foldLeft(monkeys) { case (monkeys, item) =>
|
||||
val newItem = m.operation(item) % modulus
|
||||
val receiver = if newItem % m.testDiv == 0 then m.targetTrue else m.targetFalse
|
||||
val rm = monkeys(receiver)
|
||||
|
||||
monkeys.updated(receiver, rm.copy(items = rm.items.appended(newItem)))
|
||||
}
|
||||
.updated(i, m.copy(items = List(), inspected = m.inspected + m.items.length))
|
||||
)
|
||||
.map(_.inspected)
|
||||
.sorted
|
||||
.takeRight(2)
|
||||
.map(_.toLong)
|
||||
.product
|
||||
println("Part 2:")
|
||||
println(part2)
|
||||
end Day11
|
||||
Loading…
Add table
Add a link
Reference in a new issue