diff --git a/AdventOfCode/AdventOfCode.csproj b/AdventOfCode/AdventOfCode.csproj index 8beeaf6..9859b5e 100644 --- a/AdventOfCode/AdventOfCode.csproj +++ b/AdventOfCode/AdventOfCode.csproj @@ -57,6 +57,9 @@ + + + diff --git a/AdventOfCode/Problems/AOC2023/Day9/MirageMaintenance.cs b/AdventOfCode/Problems/AOC2023/Day9/MirageMaintenance.cs new file mode 100644 index 0000000..07af868 --- /dev/null +++ b/AdventOfCode/Problems/AOC2023/Day9/MirageMaintenance.cs @@ -0,0 +1,87 @@ +using AdventOfCode.Runner.Attributes; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdventOfCode.Problems.AOC2023.Day9; +[ProblemInfo(2023, 9, "Mirage Maintenance")] +internal class MirageMaintenance : Problem +{ + private long[][] _history = []; + + public override void LoadInput() + { + _history = ReadInputLines("input.txt").Select(ln => ln.Split(' ').Select(long.Parse).ToArray()).ToArray(); + } + + public long CalculateNumber(long[] values, bool last = true) + { + var diffs = new long[values.Length - 1]; + for (int i = 0; i < values.Length - 1; i++) + diffs[i] = values[i + 1] - values[i]; + + if (diffs.Any(d => d != 0)) + return last ? (values.Last() + CalculateNumber(diffs, last)) : (values.First() - CalculateNumber(diffs, last)); + else + return last ? values.Last() : values.First(); + } + + [Obsolete("Optimize too soon garbage")] + public long GetNextNumber(long[] history) + { + var data = new List> + { + new(history.Reverse()) + }; + CalculateLayer(data, 1, 1); + var sum = data.Select(d => d.First()).Sum(); + Console.WriteLine(); + Console.WriteLine(string.Join(',', history)); + Console.WriteLine(); + + foreach (var item in data) + { + Console.WriteLine(string.Join(" | ", item.Select(n => n.ToString()))); + } + return sum; + } + + [Obsolete("Optimize too soon garbage")] + public void CalculateLayer(List> data, int layer, int pos) + { + while (data.Count <= layer) + data.Add([]); + var lastLayer = layer - 1; + if (layer != 0 && data[lastLayer].Count <= pos) + CalculateLayer(data, lastLayer, pos + 1); + + var right = data[lastLayer][pos - 1]; + var left = data[lastLayer][pos]; + var diff = right - left; + data[layer].Add(diff); + if (diff != 0 && pos == 1) + CalculateLayer(data, layer + 1, 1); + } + + public enum State + { + Diff, + Expand, + Predict + } + + public override void CalculatePart1() + { + //GetNextNumber(_history[2]); + Part1 = _history.Select(c => CalculateNumber(c)).Sum(); + } + + public override void CalculatePart2() + { + Part2 = _history.Select(c => CalculateNumber(c, false)).Sum(); + } + +}