From 048868fc4be9c6b033d711cc78b55d35765d1960 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Sun, 4 Dec 2022 22:04:48 -0500 Subject: [PATCH] couldn't get it to work with Utf8JsonReader pulled out the trusty newtonsoft.json --- AOC.Test/Test2015.cs | 2 +- AOC2015/AOC2015.csproj | 4 ++++ AOC2015/Day12.cs | 48 +++++++++++++++++------------------------- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/AOC.Test/Test2015.cs b/AOC.Test/Test2015.cs index 33ebb4c..672ae51 100644 --- a/AOC.Test/Test2015.cs +++ b/AOC.Test/Test2015.cs @@ -17,7 +17,7 @@ public class Test2015 [DataRow(typeof(Day09), "117", "909")] [DataRow(typeof(Day10), "492982", "6989950")] [DataRow(typeof(Day11), "hepxxyzz", "heqaabcc")] - [DataRow(typeof(Day12), "111754", "")] + [DataRow(typeof(Day12), "111754", "65402")] public void CheckAllDays(Type dayType, string part1, string part2) { Common.CheckDay(dayType, part1, part2); diff --git a/AOC2015/AOC2015.csproj b/AOC2015/AOC2015.csproj index c50dad5..2ab4738 100644 --- a/AOC2015/AOC2015.csproj +++ b/AOC2015/AOC2015.csproj @@ -26,4 +26,8 @@ + + + + diff --git a/AOC2015/Day12.cs b/AOC2015/Day12.cs index 62d9394..a4061fa 100644 --- a/AOC2015/Day12.cs +++ b/AOC2015/Day12.cs @@ -1,4 +1,5 @@ -using System.Text.Json; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace AOC2015; @@ -10,7 +11,7 @@ public sealed partial class Day12 : Day public Day12() : base(2015, 12, "JSAbacusFramework.io") { } - + [GeneratedRegex(@"-?\d+")] private static partial Regex Digits(); @@ -19,31 +20,20 @@ public sealed partial class Day12 : Day public override object Part2() { - var reader = new Utf8JsonReader(File.ReadAllBytes(FileName)); - var sum = 0; - bool redObject = false, insideObject = false; - - while (reader.Read()) - { - switch (reader.TokenType) - { - case JsonTokenType.StartObject: - insideObject = true; - break; - case JsonTokenType.EndObject: - insideObject = false; - redObject = false; - break; - case JsonTokenType.String: - if (insideObject && reader.GetString()! == "red") - redObject = true; - break; - case JsonTokenType.Number: - if (!redObject) sum += reader.GetInt32(); - break; - } - } - - return sum; + dynamic j = JsonConvert.DeserializeObject(Input.First())!; + return GetSum(j, "red"); } -} + + private long GetSum(JObject o, string? avoid = null) + { + var shouldAvoid = o.Properties() + .Select(a => a.Value).OfType() + .Select(v => v.Value).Contains(avoid); + + return shouldAvoid ? 0 : o.Properties().Sum((dynamic a) => (long)GetSum(a.Value, avoid)); + } + + private long GetSum(JArray arr, string avoid) => arr.Sum((dynamic a) => (long)GetSum(a, avoid)); + + private long GetSum(JValue val, string avoid) => val.Type == JTokenType.Integer ? (long)(val.Value ?? 0L) : 0; +} \ No newline at end of file