-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay9.cs
70 lines (60 loc) · 1.96 KB
/
Day9.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
namespace AoC2023;
public class Day9 : IDay<IEnumerable<string>, long>
{
public static long SolvePart1(IEnumerable<string> input) =>
input.Aggregate(
(long)0,
(acc, line) =>
{
var numbers = line.Split(' ').Select(long.Parse).ToList();
return acc += Extrapolate(BuildHistory(numbers), ExtrapolateDirection.Right);
}
);
public static long SolvePart2(IEnumerable<string> input) =>
input.Aggregate(
(long)0,
(acc, line) =>
{
var numbers = line.Split(' ').Select(long.Parse).ToList();
return acc += Extrapolate(BuildHistory(numbers), ExtrapolateDirection.Left);
}
);
private static List<long> ParseLine(string line) => line.Split(' ').Select(long.Parse).ToList();
private static Stack<List<long>> BuildHistory(List<long> numbers)
{
Stack<List<long>> history = [];
var lastDiffs = numbers;
while (lastDiffs.Any(d => d != 0))
{
history.Push(lastDiffs);
List<long> newDiffs = [];
for (int i = 0; i < lastDiffs.Count - 1; i++)
{
var diff = lastDiffs[i + 1] - lastDiffs[i];
newDiffs.Add(diff);
}
lastDiffs = newDiffs;
}
return history;
}
private static long Extrapolate(Stack<List<long>> history, ExtrapolateDirection direction)
{
long lastNum = 0;
while (history.Count > 0)
{
var el = direction switch
{
ExtrapolateDirection.Right => history.Pop().Last(),
ExtrapolateDirection.Left => history.Pop().First(),
_ => throw new Exception("NEVER")
};
lastNum = el + (long)direction * lastNum;
}
return lastNum;
}
enum ExtrapolateDirection
{
Left = -1,
Right = 1
}
}