Day 11
This commit is contained in:
parent
4b2867b1c7
commit
8ec25ab651
2 changed files with 136 additions and 0 deletions
55
aoc/resources/day11Input.txt
Normal file
55
aoc/resources/day11Input.txt
Normal 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
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