day 9 complete

This commit is contained in:
2023-12-09 13:06:50 -05:00
parent 4cc5d64f3a
commit 478604706f
2 changed files with 90 additions and 0 deletions

View File

@@ -57,6 +57,9 @@
<None Remove="problems\aoc2023\day7\sara.txt" /> <None Remove="problems\aoc2023\day7\sara.txt" />
<None Remove="problems\aoc2023\day8\input.txt" /> <None Remove="problems\aoc2023\day8\input.txt" />
<None Remove="problems\aoc2023\day8\sample.txt" /> <None Remove="problems\aoc2023\day8\sample.txt" />
<None Remove="problems\aoc2023\day9\input.txt" />
<None Remove="problems\aoc2023\day9\sample.txt" />
<None Remove="problems\aoc2023\day9\sara.txt" />
</ItemGroup> </ItemGroup>

View File

@@ -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<long, long>
{
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<List<long>>
{
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<List<long>> 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();
}
}