-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay8.cs
59 lines (53 loc) · 1.72 KB
/
Day8.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
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Godot;
public partial class DayUI
{
IEnumerator Day8(string inputfile)
{
// var lines = ReadLines("test.txt");
var lines = ReadLinesSkipEmpty(inputfile);
long r1 = 0;
long r2 = 1;
var steps = lines[0];
int displayEvery = steps.Length;
static int nodeNum(string node) { return ((node[0] - 'A') * 30 + (node[1] - 'A')) * 30 + node[2] - 'A'; }
(int l, int r)[] nodes = new (int, int)[30 * 30 * 30];
List<int> starterNodes = new();
foreach (var l in lines.Skip(1))
{
var g = l.Split(new char[] { '=', '(', ')', ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
nodes[nodeNum(g[0])] = (nodeNum(g[1]), nodeNum(g[2]));
if (g[0][2] == 'A') starterNodes.Add(nodeNum(g[0]));
}
// Part 1
int distance(int from, int to)
{
int d = 0;
for (int i = 0; from != to; ++d, i = (i + 1) % steps.Length)
{
var (l, r) = nodes[from];
from = steps[i] == 'L' ? l : r;
}
return d;
}
r1 = distance(nodeNum("AAA"), nodeNum("ZZZ"));
// Part 2
int distanceZ(int from)
{
int d = 0;
for (int i = 0; from % 30 != ('Z' - 'A'); ++d, i = (i + 1) % steps.Length)
{
var (l, r) = nodes[from];
from = steps[i] == 'L' ? l : r;
}
return d;
}
r2 = starterNodes.Aggregate(1L, (acc, n) => LCM(acc, distanceZ(n)));
yield return null;
Result(r1, r2);
}
}