-
Notifications
You must be signed in to change notification settings - Fork 0
/
15.linq
42 lines (34 loc) · 873 Bytes
/
15.linq
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
<Query Kind="Program">
<RuntimeVersion>5.0</RuntimeVersion>
</Query>
#load ".\shared"
void Main()
{
string input = Utils.ParseStrings("15.txt").First();
int[] startingNumbers = input.Split(',').Select(n => int.Parse(n)).ToArray();
Dictionary<int, (int, int)> lastSeens = new();
for (int i = 0; i < startingNumbers.Length; i++)
{
lastSeens.Add(startingNumbers[i], (-1, i+1));
}
int lastSeen = startingNumbers.Last();
int count = startingNumbers.Length;
while (count < 30000000)
{
int next;
if (lastSeens[lastSeen].Item1 < 0)
{
next = 0;
}
else
{
next = count-lastSeens[lastSeen].Item1;
}
count++;
int n = lastSeens.ContainsKey(next) ? lastSeens[next].Item2 : -1;
lastSeens[next] = (n, count);
lastSeen = next;
if (count == 2020) $"P1: {lastSeen}".Dump();
else if (count == 30000000) $"P2: {lastSeen}".Dump();
}
}