This commit is contained in:
Paul-Henri Froidmont 2022-12-11 08:57:43 +01:00
parent 4b2867b1c7
commit 8ec25ab651
Signed by: phfroidmont
GPG key ID: BE948AFD7E7873BE
2 changed files with 136 additions and 0 deletions

View file

@ -0,0 +1,55 @@
Monkey 0:
Starting items: 61
Operation: new = old * 11
Test: divisible by 5
If true: throw to monkey 7
If false: throw to monkey 4
Monkey 1:
Starting items: 76, 92, 53, 93, 79, 86, 81
Operation: new = old + 4
Test: divisible by 2
If true: throw to monkey 2
If false: throw to monkey 6
Monkey 2:
Starting items: 91, 99
Operation: new = old * 19
Test: divisible by 13
If true: throw to monkey 5
If false: throw to monkey 0
Monkey 3:
Starting items: 58, 67, 66
Operation: new = old * old
Test: divisible by 7
If true: throw to monkey 6
If false: throw to monkey 1
Monkey 4:
Starting items: 94, 54, 62, 73
Operation: new = old + 1
Test: divisible by 19
If true: throw to monkey 3
If false: throw to monkey 7
Monkey 5:
Starting items: 59, 95, 51, 58, 58
Operation: new = old + 3
Test: divisible by 11
If true: throw to monkey 0
If false: throw to monkey 4
Monkey 6:
Starting items: 87, 69, 92, 56, 91, 93, 88, 73
Operation: new = old + 8
Test: divisible by 3
If true: throw to monkey 5
If false: throw to monkey 2
Monkey 7:
Starting items: 71, 57, 86, 67, 96, 95
Operation: new = old + 7
Test: divisible by 17
If true: throw to monkey 3
If false: throw to monkey 1

81
aoc/src/Day11.scala Normal file
View 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