diff --git a/AdventOfCode/AdventOfCode.csproj b/AdventOfCode/AdventOfCode.csproj index 144fa59..956dcc8 100644 --- a/AdventOfCode/AdventOfCode.csproj +++ b/AdventOfCode/AdventOfCode.csproj @@ -26,6 +26,8 @@ + + diff --git a/AdventOfCode/Problems/AOC2022/Day11/Monkey.cs b/AdventOfCode/Problems/AOC2022/Day11/Monkey.cs new file mode 100644 index 0000000..b93c7d8 --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day11/Monkey.cs @@ -0,0 +1,73 @@ +using System.Numerics; + +namespace AdventOfCode.Problems.AOC2022.Day11; + +internal class Monkey +{ + public int MonkeyNumber { get; set; } + public int InspectionCount { get; private set; } + public List Items { get; set; } + + private MonkeyOperator _operator; + private uint _operand; + private uint _divisor; + private int _trueTarget; + private int _falseTarget; + + public Monkey(string[] lines) + { + Items = new List(); + MonkeyNumber = int.Parse(lines[0].Split(' ')[^1][0..^1]); + Items = lines[1].Split(": ")[^1].Split(", ").Select(v => BigInteger.Parse(v)).ToList(); + var operation = lines[2].Split("= old ")[^1]; + _operator = operation[0] switch + { + '*' => MonkeyOperator.Multiply, + '+' => MonkeyOperator.Add, + _ => MonkeyOperator.Add + }; + if (!uint.TryParse(operation[1..], out _operand)) + _operator = MonkeyOperator.Power; + + _divisor = uint.Parse(lines[3].Split(' ')[^1]); + _trueTarget = int.Parse(lines[4].Split(' ')[^1]); + _falseTarget = int.Parse(lines[5].Split(' ')[^1]); + } + + public BigInteger Inspect(BigInteger value, uint worryOffset = 3) + { + InspectionCount++; + value = Operate(value); + if(worryOffset != 0) + value /= worryOffset; + return value; + } + + public int GetThrowTarget(BigInteger value) + { + return value % _divisor == 0 ? _trueTarget : _falseTarget; + } + + private BigInteger Operate(BigInteger value) + { + return _operator switch + { + MonkeyOperator.Multiply => value * _operand, + MonkeyOperator.Add => value + _operand, + MonkeyOperator.Power => value * value, + _ => value + }; + } + + private enum MonkeyOperator + { + Multiply, + Add, + Power + } + + public override string ToString() + { + return $"{MonkeyNumber}: ({InspectionCount}) [{string.Join(", ",Items)}]"; + } +} \ No newline at end of file diff --git a/AdventOfCode/Problems/AOC2022/Day11/MonkeyInTheMiddle.cs b/AdventOfCode/Problems/AOC2022/Day11/MonkeyInTheMiddle.cs new file mode 100644 index 0000000..1bfdf4d --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day11/MonkeyInTheMiddle.cs @@ -0,0 +1,67 @@ +using AdventOfCode.Runner.Attributes; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; + +namespace AdventOfCode.Problems.AOC2022.Day11; +[ProblemInfo(2022, 11, "Monkey in the Middle")] +internal class MonkeyInTheMiddle : Problem +{ + private Monkey[] _monkeysPart1 = Array.Empty(); + private Monkey[] _monkeysPart2 = Array.Empty(); + + public override void CalculatePart1() + { + Simulate(_monkeysPart1, 20); + Part1 = _monkeysPart1.OrderByDescending(m => m.InspectionCount) + .Take(2) + .Select(m => m.InspectionCount) + .Aggregate((a, b) => a * b); + } + + public override void CalculatePart2() + { + Simulate(_monkeysPart2, 10000, 0); + Part2 = _monkeysPart2.OrderByDescending(m => m.InspectionCount) + .Take(2) + .Select(m => m.InspectionCount) + .Aggregate((a, b) => a * b); + } + + public override void LoadInput() + { + var lines = ReadInputLines("test.txt").Chunk(7); + _monkeysPart1 = lines.Select(ln => new Monkey(ln)).ToArray(); + _monkeysPart2 = lines.Select(ln => new Monkey(ln)).ToArray(); + + } + + private static void Simulate(Monkey[] monkeys, int rounds, uint worry = 3) + { + for (int i = 0; i < rounds; i++) + { + SimulateRound(monkeys, worry); + } + } + + private static void SimulateRound(Monkey[] monkeys, uint worry = 3) + { + foreach (var monkey in monkeys) + SimulateTurn(monkey, monkeys, worry); + } + + + private static void SimulateTurn(Monkey monkey, Monkey[] monkeys, uint worry = 3) { + for (int i = 0; i < monkey.Items.Count; i++) + { + var item = monkey.Inspect(monkey.Items[i], worry); + var target = monkey.GetThrowTarget(item); + monkeys[target].Items.Add(item); + } + monkey.Items.Clear(); + } +} diff --git a/AdventOfCode/Problems/AOC2022/Day11/input.txt b/AdventOfCode/Problems/AOC2022/Day11/input.txt new file mode 100644 index 0000000..7919fb6 --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day11/input.txt @@ -0,0 +1,55 @@ +Monkey 0: + Starting items: 80 + Operation: new = old * 5 + Test: divisible by 2 + If true: throw to monkey 4 + If false: throw to monkey 3 + +Monkey 1: + Starting items: 75, 83, 74 + Operation: new = old + 7 + Test: divisible by 7 + If true: throw to monkey 5 + If false: throw to monkey 6 + +Monkey 2: + Starting items: 86, 67, 61, 96, 52, 63, 73 + Operation: new = old + 5 + Test: divisible by 3 + If true: throw to monkey 7 + If false: throw to monkey 0 + +Monkey 3: + Starting items: 85, 83, 55, 85, 57, 70, 85, 52 + Operation: new = old + 8 + Test: divisible by 17 + If true: throw to monkey 1 + If false: throw to monkey 5 + +Monkey 4: + Starting items: 67, 75, 91, 72, 89 + Operation: new = old + 4 + Test: divisible by 11 + If true: throw to monkey 3 + If false: throw to monkey 1 + +Monkey 5: + Starting items: 66, 64, 68, 92, 68, 77 + Operation: new = old * 2 + Test: divisible by 19 + If true: throw to monkey 6 + If false: throw to monkey 2 + +Monkey 6: + Starting items: 97, 94, 79, 88 + Operation: new = old * old + Test: divisible by 5 + If true: throw to monkey 2 + If false: throw to monkey 7 + +Monkey 7: + Starting items: 77, 85 + Operation: new = old + 6 + Test: divisible by 13 + If true: throw to monkey 4 + If false: throw to monkey 0 \ No newline at end of file diff --git a/AdventOfCode/Problems/AOC2022/Day11/test.txt b/AdventOfCode/Problems/AOC2022/Day11/test.txt new file mode 100644 index 0000000..e888add --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day11/test.txt @@ -0,0 +1,27 @@ +Monkey 0: + Starting items: 79, 98 + Operation: new = old * 19 + Test: divisible by 23 + If true: throw to monkey 2 + If false: throw to monkey 3 + +Monkey 1: + Starting items: 54, 65, 75, 74 + Operation: new = old + 6 + Test: divisible by 19 + If true: throw to monkey 2 + If false: throw to monkey 0 + +Monkey 2: + Starting items: 79, 60, 97 + Operation: new = old * old + Test: divisible by 13 + If true: throw to monkey 1 + If false: throw to monkey 3 + +Monkey 3: + Starting items: 74 + Operation: new = old + 3 + Test: divisible by 17 + If true: throw to monkey 0 + If false: throw to monkey 1 \ No newline at end of file