Advertisement
Guest User

Advent of Code 2022 Day 21 C# Solution

a guest
Dec 25th, 2022
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.97 KB | Source Code | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6.  
  7. namespace AdventOfCode2022_Task_Library
  8. {
  9.     public class Task21 //--- Day 21: Monkey Math ---
  10.     {
  11.         public static void Part01and02()
  12.         {
  13.             Stopwatch sw = new Stopwatch();
  14.             sw.Start();
  15.  
  16.             var input = File.ReadAllLines(@"..\..\..\Inputs\Day21.txt");
  17.             List<Monkey> monkeys = new List<Monkey>();
  18.  
  19.             for (int i = 0; i < input.Length; i++)
  20.             {
  21.                 var splits = input[i].Split(':');
  22.                 string name = splits[0];
  23.                 Int64 number = 0;
  24.                 string[] monkeyNames = new string[2];
  25.                 var operation = "";
  26.  
  27.                 if (splits[1].Count() > 4)
  28.                 {
  29.                     var data = splits[1].Trim().Split(' ');
  30.                     monkeyNames = new string[] { data[0], data[2] };
  31.                     operation = data[1];
  32.                 }
  33.                 else
  34.                 {
  35.                     number = Int64.Parse(splits[1].Trim());
  36.                 }
  37.  
  38.                 if (number != 0)
  39.                 {
  40.                     Monkey monkey = new Monkey(name, number);
  41.                     monkeys.Add(monkey);
  42.                 }
  43.                 else
  44.                 {
  45.                     Monkey monkey = new Monkey(name, monkeyNames, operation);
  46.                     monkeys.Add(monkey);
  47.                 }
  48.             }
  49.  
  50.             List<Monkey> helperMonkeys = new List<Monkey>(monkeys);
  51.  
  52.             foreach (var monkey in helperMonkeys)
  53.                 GetNumber(ref monkeys, monkey);
  54.  
  55.             var root = monkeys.Find(e => e.Name == "root");
  56.             Int64 rootNumber = root.Number;
  57.  
  58.             var newHumnNumber = GetHumnNumber(monkeys);
  59.            
  60.             sw.Stop();
  61.             Console.WriteLine($"The monkey named \"root\" will yell: {rootNumber}\nThe new humn number is: {newHumnNumber}\nTime elapsed: {sw.Elapsed.Milliseconds}ms.\n\n");
  62.             Console.ReadKey();
  63.         }
  64.  
  65.         internal static Int64 GetNumber(ref List<Monkey> monkeys, Monkey monkey)
  66.         {
  67.             if (monkey.Number != 0) return monkey.Number;
  68.             else
  69.             {
  70.                 Int64 number1 = 0;
  71.                 Int64 number2 = 0;
  72.                 Int64 number = 0;
  73.                 var monkeyNames = monkey.MonkeyNames;
  74.                 var monkey1 = monkeys.Find(e => e.Name == monkeyNames[0]);
  75.                 var monkey2 = monkeys.Find(e => e.Name == monkeyNames[1]);
  76.  
  77.                 if (monkey1.Number != 0)
  78.                     number1 = monkey1.Number;
  79.                 else
  80.                     number1 = GetNumber(ref monkeys, monkey1);
  81.  
  82.                 if (monkey2.Number != 0)
  83.                     number2 = monkey2.Number;
  84.                 else
  85.                     number2 = GetNumber(ref monkeys, monkey2);
  86.  
  87.                 monkey.OperationValues = new Int64[] { number1, number2 };
  88.  
  89.                 switch (monkey.Operation)
  90.                 {
  91.                     case "+":
  92.                         number = number1 + number2;
  93.                         break;
  94.                     case "*":
  95.                         number = number1 * number2;
  96.                         break;
  97.                     case "-":
  98.                         number = number1 - number2;
  99.                         break;
  100.                     case "/":
  101.                         number = number1 / number2;
  102.                         break;
  103.                     default:
  104.                         throw new Exception();
  105.                 }
  106.  
  107.                 monkey.Number = number;
  108.                 return number;
  109.             }
  110.         }
  111.  
  112.         internal static Int64 GetHumnNumber(List<Monkey> monkeys)
  113.         {
  114.             var name = "humn";            
  115.             var humnParents = new List<(string name, int level)>();
  116.             var counter = 1;
  117.             humnParents.Add((name, counter));
  118.  
  119.             while (monkeys.Find(e => e.MonkeyNames.Contains(name)).Name != "root")
  120.             {
  121.                 name = monkeys.Find(e => e.MonkeyNames.Contains(name)).Name;
  122.                 counter++;
  123.                 humnParents.Add((name, counter));
  124.             }
  125.  
  126.             var root = monkeys.Find(e => e.Name == "root");
  127.             var rootChild2Name = root.MonkeyNames.FirstOrDefault(e => e != name);
  128.             var rootChild2 = monkeys.Find(e => e.Name == rootChild2Name);
  129.             var numberToMatch = rootChild2.Number;
  130.             Int64 newNumber = 0;
  131.  
  132.             for (int i = humnParents.Count - 1; i > 0; i--)
  133.             {
  134.                 var parent = monkeys.Find(e => e.Name == humnParents[i].name);
  135.                 var parentNumber = parent.Number;
  136.                 var childNumber = monkeys.Find(e => e.Name == humnParents[i - 1].name).Number;
  137.                 Int64 otherChildNumber = 0;
  138.                 var number1 = parent.OperationValues[0];
  139.                 var number2 = parent.OperationValues[1];
  140.                 var opFlag = true;
  141.  
  142.                 if (childNumber == number1)
  143.                 {
  144.                     otherChildNumber = number2;
  145.                 }
  146.                 else if (childNumber == number2)
  147.                 {
  148.                     otherChildNumber = number1;
  149.                     opFlag = false;
  150.                 }
  151.  
  152.                 switch (parent.Operation)
  153.                 {
  154.                     case "+":
  155.                         newNumber = numberToMatch - otherChildNumber;
  156.                         break;
  157.                     case "*":
  158.                         newNumber = numberToMatch / otherChildNumber;
  159.                         break;
  160.                     case "-":
  161.                         if (opFlag) newNumber = numberToMatch + otherChildNumber;
  162.                         else newNumber = otherChildNumber - numberToMatch;
  163.                         break;
  164.                     case "/":
  165.                         if (opFlag) newNumber = numberToMatch * otherChildNumber;
  166.                         else newNumber = otherChildNumber / numberToMatch;
  167.                         break;
  168.                     default:
  169.                         throw new Exception();
  170.                 }
  171.  
  172.                 numberToMatch = newNumber;
  173.             }
  174.  
  175.             return numberToMatch;
  176.         }
  177.  
  178.         internal class Monkey
  179.         {
  180.             public string Name { get; }
  181.  
  182.             public Int64 Number { get; set; }
  183.  
  184.             public string Operation { get; set; }
  185.  
  186.             public Int64[] OperationValues { get; set; }
  187.  
  188.             public string[] MonkeyNames { get; set; } = new string[2] { "", "" };
  189.  
  190.             public Monkey(string name, Int64 number)
  191.             {
  192.                 Name = name;
  193.                 Number = number;
  194.             }
  195.  
  196.             public Monkey(string name, string[] monkeyNames, string operation)
  197.             {
  198.                 Name = name;
  199.                 MonkeyNames = monkeyNames;
  200.                 Operation = operation;
  201.             }
  202.         }
  203.     }
  204. }
  205.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement