From 8ec25ab651ef6ba27b0283a7805813d4dde7e381 Mon Sep 17 00:00:00 2001 From: Paul-Henri Froidmont Date: Sun, 11 Dec 2022 08:57:43 +0100 Subject: [PATCH] Day 11 --- aoc/resources/day11Input.txt | 55 ++++++++++++++++++++++++ aoc/src/Day11.scala | 81 ++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 aoc/resources/day11Input.txt create mode 100644 aoc/src/Day11.scala diff --git a/aoc/resources/day11Input.txt b/aoc/resources/day11Input.txt new file mode 100644 index 0000000..fffbaec --- /dev/null +++ b/aoc/resources/day11Input.txt @@ -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 \ No newline at end of file diff --git a/aoc/src/Day11.scala b/aoc/src/Day11.scala new file mode 100644 index 0000000..1c81ddb --- /dev/null +++ b/aoc/src/Day11.scala @@ -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