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