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();
+ }
+
+}