Advertisement
mgla

Advent of Code 2022 - Day 13

Dec 13th, 2022
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.80 KB | None | 0 0
  1. using System.Text.Json.Nodes;
  2.  
  3. var input = await File.ReadAllTextAsync(Path.GetFullPath("..\\..\\..\\..\\..\\inputs\\13.txt"));
  4.  
  5. var pairs = input.Split("\r\n\r\n");
  6. var pairIndex = 0;
  7. var correctPairs = 0;
  8.  
  9. foreach (var pair in pairs)
  10. {
  11.     pairIndex++;
  12.  
  13.     var splitPair = pair.Split("\r\n");
  14.     var left = splitPair[0];
  15.     var right = splitPair[1];
  16.     var jsonLeft = JsonNode.Parse(left);
  17.     var jsonRight = JsonNode.Parse(right);
  18.     var isCorrect = Compare(jsonLeft, jsonRight);
  19.     if (isCorrect == true) correctPairs += pairIndex;
  20. }
  21.  
  22. Console.WriteLine($"Part 1: {correctPairs}");
  23.  
  24. var allPackets = input.Split("\r\n").Where(l => !string.IsNullOrEmpty(l)).Select(l => JsonNode.Parse(l)).ToList();
  25. var x = JsonNode.Parse("[[2]]");
  26. var y = JsonNode.Parse("[[6]]");
  27.  
  28. allPackets.Add(x);
  29. allPackets.Add(y);
  30.  
  31. allPackets.Sort((left, right) => Compare(left, right) == true ? -1 : 1);
  32.  
  33. Console.WriteLine($"Part 2: {(allPackets.IndexOf(x) + 1) * (allPackets.IndexOf(y) + 1)}");
  34.  
  35. bool? Compare(JsonNode left, JsonNode right)
  36. {
  37.     if (left is JsonValue leftVal && right is JsonValue rightVal)
  38.     {
  39.         var leftInt = leftVal.GetValue<int>();
  40.         var rightInt = rightVal.GetValue<int>();
  41.         return leftInt == rightInt ? null : leftInt < rightInt;
  42.     }
  43.  
  44.     if (left is not JsonArray leftArray) leftArray = new JsonArray(left.GetValue<int>());
  45.     if (right is not JsonArray rightArray) rightArray = new JsonArray(right.GetValue<int>());
  46.  
  47.     for (var i = 0; i < Math.Min(leftArray.Count, rightArray.Count); i++)
  48.     {
  49.         var res = Compare(leftArray[i], rightArray[i]);
  50.         if (res.HasValue) { return res.Value; }
  51.     }
  52.  
  53.     if (leftArray.Count < rightArray.Count) { return true; }
  54.     if (leftArray.Count > rightArray.Count) { return false; }
  55.  
  56.     return null;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement