AdventOfCode/Advent Of Code Library/2022/Day 11/Monkey.cs
2022-12-15 22:56:10 +01:00

126 lines
3.5 KiB
C#

namespace AdventOfCodeLibrary._2022.Day_11
{
internal class Monkey
{
internal int MonkeyId;
internal long TotalInspections = 0;
internal List<int> Items;
private int TestDevision;
private int WorryDevision;
private OperationEnum Operation;
private int? OperationValue = null;
private Monkey ThrowTrueMonkey;
private Monkey ThrowFalseMonkey;
internal Monkey (int monkeyId, int worryDivirdNumber, string[] monkeyData)
{
MonkeyId = monkeyId;
WorryDevision = worryDivirdNumber;
Items = monkeyData[1].Split(':')[^1].Split(',').Select(s => Convert.ToInt32(s.Trim())).ToList();
string[] operation = monkeyData[2].Split(' ');
SetOperation(operation[^2][0], operation[^1]);
SetTestValue(Convert.ToInt32(monkeyData[3].Split(' ')[^1]));
}
internal void DoTurn()
{
if (!Items.Any())
return;
for (int worryIndex = 0; worryIndex < Items.Count; worryIndex++)
{
int item = Items[worryIndex];
item = GetNewWorry(item);
ThrowToMonkey(item);
TotalInspections++;
}
Items.Clear();
}
internal int GetNewWorry(int oldWorry)
{
int secondValue = OperationValue ?? oldWorry;
switch (Operation)
{
case OperationEnum.Add:
secondValue = oldWorry + secondValue;
break;
case OperationEnum.Subtract:
secondValue = oldWorry - secondValue;
break;
case OperationEnum.Divide:
secondValue = oldWorry / secondValue;
break;
case OperationEnum.Multiply:
secondValue = oldWorry * secondValue;
break;
}
return secondValue / WorryDevision;
}
internal void ThrowToMonkey(int worry)
{
if (worry % TestDevision == 0)
{
ThrowTrueMonkey.Items.Add(worry);
}
else
{
ThrowFalseMonkey.Items.Add(worry);
}
}
internal void SetOperation(char operation, string value)
{
switch (operation)
{
case '+': Operation = OperationEnum.Add;
break;
case '-':
Operation = OperationEnum.Subtract;
break;
case '/':
Operation = OperationEnum.Divide;
break;
case '*':
Operation = OperationEnum.Multiply;
break;
}
if (!value.Equals("old"))
{
OperationValue = Convert.ToInt32(value);
}
}
internal void SetTestValue(int value)
{
TestDevision = value;
}
internal void SetThrowTargets(Monkey trueMonkey, Monkey falseMonkey)
{
ThrowTrueMonkey = trueMonkey;
ThrowFalseMonkey = falseMonkey;
}
}
internal enum OperationEnum
{
Add,
Subtract,
Multiply,
Divide
}
}