Day 8
This commit is contained in:
@@ -55,6 +55,8 @@
|
||||
<None Remove="problems\aoc2023\day7\input.txt" />
|
||||
<None Remove="problems\aoc2023\day7\sample.txt" />
|
||||
<None Remove="problems\aoc2023\day7\sara.txt" />
|
||||
<None Remove="problems\aoc2023\day8\input.txt" />
|
||||
<None Remove="problems\aoc2023\day8\sample.txt" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
|
||||
74
AdventOfCode/Problems/AOC2023/Day8/HauntedWasteland.cs
Normal file
74
AdventOfCode/Problems/AOC2023/Day8/HauntedWasteland.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using AdventOfCode.Runner.Attributes;
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AdventOfCode.Problems.AOC2023.Day8;
|
||||
|
||||
[ProblemInfo(2023, 8, "Haunted Wasteland")]
|
||||
internal class HauntedWasteland : Problem<int, long>
|
||||
{
|
||||
private string _path = string.Empty;
|
||||
private Dictionary<string, (string left, string right)> _nodes = [];
|
||||
|
||||
public override void LoadInput()
|
||||
{
|
||||
var data = ReadInputLines();
|
||||
_path = data[0];
|
||||
|
||||
for (int i = 2; i < data.Length; i++)
|
||||
{
|
||||
var curLine = data[i].Split('=');
|
||||
var node = curLine[0].TrimEnd();
|
||||
var branches = curLine[1][2..^1].Split(", ");
|
||||
_nodes.Add(node, (branches[0], branches[1]));
|
||||
}
|
||||
}
|
||||
|
||||
public override void CalculatePart1()
|
||||
{
|
||||
var curPos = "AAA";
|
||||
var i = 0;
|
||||
var steps = 0;
|
||||
do
|
||||
{
|
||||
curPos = _path[i] switch
|
||||
{
|
||||
'L' => _nodes[curPos].left,
|
||||
'R' => _nodes[curPos].right,
|
||||
_ => throw new Exception("Something went horribly wrong")
|
||||
};
|
||||
i = (i + 1) % _path.Length;
|
||||
steps++;
|
||||
} while (curPos != "ZZZ");
|
||||
Part1 = steps;
|
||||
}
|
||||
|
||||
public override void CalculatePart2()
|
||||
{
|
||||
var curPos = _nodes.Keys.Where(n => n[^1] == 'A').ToArray();
|
||||
var len = new long[curPos.Length];
|
||||
var i = 0;
|
||||
do
|
||||
{
|
||||
for (int j = 0; j < curPos.Length; j++)
|
||||
{
|
||||
if (curPos[j][^1] == 'Z')
|
||||
continue;
|
||||
len[j]++;
|
||||
curPos[j] = _path[i] switch
|
||||
{
|
||||
'L' => _nodes[curPos[j]].left,
|
||||
'R' => _nodes[curPos[j]].right,
|
||||
_ => throw new Exception("Something went horribly wrong")
|
||||
};
|
||||
}
|
||||
i = (i + 1) % _path.Length;
|
||||
} while (curPos.Any(n => n[^1] != 'Z'));
|
||||
|
||||
Part2 = len.LCM();
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
@@ -15,4 +16,15 @@ public static class Extensions
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
public static T LCM<T>(this IEnumerable<T> values) where T : INumber<T>
|
||||
{
|
||||
var a = values.First();
|
||||
values = values.Skip(1);
|
||||
foreach (var item in values)
|
||||
{
|
||||
a = a.LCM(item);
|
||||
}
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
26
AdventOfCode/Runner/ExtraMath.cs
Normal file
26
AdventOfCode/Runner/ExtraMath.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace AdventOfCode.Runner;
|
||||
public static class ExtraMath
|
||||
{
|
||||
public static T GCF<T>(this T a, T b) where T : INumber<T>
|
||||
{
|
||||
while (!b.Equals(T.Zero))
|
||||
{
|
||||
var t = b;
|
||||
b = a % b;
|
||||
a = t;
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
public static T LCM<T>(this T a, T b) where T: INumber<T>
|
||||
{
|
||||
return (a / GCF(a, b)) * b;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user