diff --git a/AdventOfCode/AdventOfCode.csproj b/AdventOfCode/AdventOfCode.csproj
index 33915d4..42d6c2c 100644
--- a/AdventOfCode/AdventOfCode.csproj
+++ b/AdventOfCode/AdventOfCode.csproj
@@ -26,6 +26,8 @@
+
+
@@ -34,4 +36,9 @@
+
+
+
+
+
diff --git a/AdventOfCode/Problems/AOC2022/Day5/SupplyStacks.cs b/AdventOfCode/Problems/AOC2022/Day5/SupplyStacks.cs
new file mode 100644
index 0000000..5b3f0bb
--- /dev/null
+++ b/AdventOfCode/Problems/AOC2022/Day5/SupplyStacks.cs
@@ -0,0 +1,131 @@
+using AdventOfCode.Runner.Attributes;
+
+using Superpower;
+using Superpower.Parsers;
+
+using System.Diagnostics;
+using System.Text.RegularExpressions;
+
+namespace AdventOfCode.Problems.AOC2022.Day5;
+
+[ProblemInfo(2022, 5, "Supply Stacks")]
+internal partial class SupplyStacks : Problem
+{
+ private List[] _stacksPart1 = Array.Empty>();
+ private List[] _stacksPart2 = Array.Empty>();
+ private TextParser<(int, int, int)> _moveParser = from move in Character.Letter.Or(Character.WhiteSpace).Many()
+ from stack in Character.Digit.Many()
+ from frm in Character.Letter.Or(Character.WhiteSpace).Many()
+ from source in Character.Digit.Many()
+ from to in Character.Letter.Or(Character.WhiteSpace).Many()
+ from dst in Character.Digit.Many()
+ select (int.Parse(stack), int.Parse(source), int.Parse(dst));
+
+ private List<(int stack, int from, int to)> _moves = new ();
+
+ public override void CalculatePart1()
+ {
+ foreach (var move in _moves)
+ {
+ PerformBasicMove(_stacksPart1, move);
+ }
+ Part1 = new string(_stacksPart1.Select(b => b.Last()).ToArray());
+ }
+
+ private void PerformBasicMove(List[] data, (int stack, int from, int to) move)
+ {
+ var from = data[move.from-1];
+ var to = data[move.to-1];
+ for (int i = 0; i < move.stack; i++)
+ {
+ var item = from[^1];
+ from.RemoveAt(from.Count-1);
+ to.Add(item);
+ }
+ }
+
+ private void PerformMove(List[] data, (int stack, int from, int to) move)
+ {
+ var from = data[move.from - 1];
+ var to = data[move.to - 1];
+ var items = from.Skip(from.Count - move.stack);
+ to.AddRange(items);
+ from.RemoveRange(from.Count - move.stack, move.stack);
+ }
+
+ public override void CalculatePart2()
+ {
+ foreach (var move in _moves)
+ {
+ PerformMove(_stacksPart2, move);
+ }
+ Part2 = new string(_stacksPart2.Select(b => b.Last()).ToArray());
+ }
+
+ public override void LoadInput()
+ {
+ var lines = ReadInputLines("input.txt");
+ var readMoves = false;
+
+ var buffers = new List>();
+ var moves = new List<(int stack, int from, int to)>();
+ foreach (var line in lines)
+ {
+ if (string.IsNullOrWhiteSpace(line))
+ {
+ readMoves = true;
+ continue;
+ }
+
+ if (readMoves)
+ {
+ moves.Add(ParseMoveLineRegex(line));
+ }
+ else
+ {
+ var crates = ParseCrateLine(line);
+ for (int i = 0; i < crates.Count; i++)
+ {
+ var crate = crates[i];
+ if (buffers.Count == i)
+ buffers.Add(crate == ' ' ? new() : new List() { crate });
+ else if (crate != ' ')
+ buffers[i].Add(crate);
+ }
+ }
+ }
+ _stacksPart1 = buffers.Select(b => b.Take(b.Count - 1).Reverse().ToList()).ToArray();
+ _stacksPart2 = buffers.Select(b => b.Take(b.Count - 1).Reverse().ToList()).ToArray();
+ _moves = moves;
+ }
+
+ //Way slower
+ private (int stack, int from, int to) ParseMoveLine(string line)
+ {
+ return _moveParser.Parse(line);
+ }
+
+ private (int stack, int from, int to) ParseMoveLineRegex(string line)
+ {
+ var r = MoveParser().Matches(line);
+ var items = r.First()
+ .Groups.Values.Skip(1)
+ .Select(v => int.Parse(v.ValueSpan))
+ .ToArray();
+ return (items[0], items[1], items[2]);
+ }
+
+ private List ParseCrateLine(string line)
+ {
+ var result = new List(line.Length / 4);
+ for (int i = 1; i < line.Length; i += 4)
+ {
+ var c = line[i];
+ result.Add(c);
+ }
+ return result;
+ }
+
+ [GeneratedRegex("move (\\d+) from (\\d+) to (\\d+)")]
+ private static partial Regex MoveParser();
+}
\ No newline at end of file
diff --git a/AdventOfCode/Problems/AOC2022/Day5/input.txt b/AdventOfCode/Problems/AOC2022/Day5/input.txt
new file mode 100644
index 0000000..3808c06
--- /dev/null
+++ b/AdventOfCode/Problems/AOC2022/Day5/input.txt
@@ -0,0 +1,512 @@
+ [M] [S] [S]
+ [M] [N] [L] [T] [Q]
+[G] [P] [C] [F] [G] [T]
+[B] [J] [D] [P] [V] [F] [F]
+[D] [D] [G] [C] [Z] [H] [B] [G]
+[C] [G] [Q] [L] [N] [D] [M] [D] [Q]
+[P] [V] [S] [S] [B] [B] [Z] [M] [C]
+[R] [H] [N] [P] [J] [Q] [B] [C] [F]
+ 1 2 3 4 5 6 7 8 9
+
+move 1 from 7 to 4
+move 3 from 4 to 7
+move 4 from 3 to 4
+move 5 from 6 to 9
+move 1 from 8 to 1
+move 2 from 3 to 2
+move 3 from 4 to 6
+move 1 from 3 to 6
+move 9 from 7 to 1
+move 1 from 2 to 4
+move 3 from 4 to 9
+move 4 from 9 to 8
+move 6 from 8 to 2
+move 1 from 8 to 6
+move 1 from 4 to 1
+move 11 from 1 to 7
+move 1 from 4 to 7
+move 7 from 2 to 5
+move 5 from 6 to 3
+move 2 from 4 to 3
+move 2 from 5 to 9
+move 1 from 8 to 6
+move 3 from 1 to 5
+move 2 from 6 to 9
+move 1 from 4 to 8
+move 2 from 2 to 1
+move 7 from 5 to 9
+move 6 from 3 to 6
+move 1 from 2 to 5
+move 1 from 3 to 8
+move 12 from 7 to 3
+move 1 from 1 to 8
+move 2 from 1 to 9
+move 20 from 9 to 5
+move 1 from 1 to 7
+move 5 from 5 to 3
+move 1 from 8 to 7
+move 2 from 8 to 3
+move 2 from 6 to 5
+move 1 from 6 to 4
+move 18 from 3 to 2
+move 1 from 4 to 2
+move 1 from 7 to 9
+move 1 from 1 to 9
+move 1 from 6 to 1
+move 8 from 5 to 2
+move 1 from 1 to 6
+move 19 from 5 to 2
+move 5 from 2 to 6
+move 2 from 9 to 7
+move 20 from 2 to 1
+move 1 from 9 to 4
+move 8 from 6 to 2
+move 5 from 1 to 3
+move 27 from 2 to 1
+move 34 from 1 to 7
+move 1 from 2 to 6
+move 2 from 3 to 1
+move 1 from 4 to 9
+move 1 from 2 to 6
+move 2 from 1 to 7
+move 1 from 6 to 7
+move 1 from 9 to 3
+move 2 from 6 to 3
+move 1 from 6 to 4
+move 5 from 3 to 4
+move 5 from 4 to 2
+move 4 from 1 to 4
+move 4 from 1 to 4
+move 2 from 3 to 6
+move 1 from 6 to 9
+move 25 from 7 to 5
+move 1 from 6 to 4
+move 17 from 5 to 2
+move 14 from 7 to 6
+move 1 from 7 to 3
+move 1 from 9 to 3
+move 10 from 2 to 3
+move 2 from 2 to 9
+move 12 from 3 to 5
+move 18 from 5 to 8
+move 1 from 4 to 2
+move 5 from 2 to 1
+move 1 from 5 to 3
+move 3 from 2 to 1
+move 1 from 2 to 7
+move 2 from 2 to 6
+move 9 from 6 to 7
+move 16 from 8 to 2
+move 6 from 7 to 3
+move 2 from 8 to 9
+move 1 from 1 to 8
+move 16 from 2 to 6
+move 1 from 8 to 3
+move 2 from 1 to 2
+move 1 from 9 to 3
+move 7 from 4 to 1
+move 7 from 3 to 7
+move 9 from 7 to 8
+move 1 from 5 to 6
+move 2 from 9 to 7
+move 1 from 9 to 5
+move 11 from 6 to 8
+move 1 from 3 to 1
+move 1 from 4 to 2
+move 2 from 8 to 5
+move 3 from 5 to 8
+move 2 from 1 to 9
+move 5 from 1 to 4
+move 3 from 4 to 1
+move 1 from 3 to 2
+move 3 from 2 to 1
+move 1 from 9 to 1
+move 1 from 2 to 5
+move 2 from 4 to 7
+move 20 from 8 to 5
+move 1 from 9 to 7
+move 11 from 6 to 1
+move 17 from 1 to 5
+move 1 from 8 to 2
+move 7 from 5 to 8
+move 1 from 4 to 5
+move 2 from 1 to 2
+move 2 from 8 to 4
+move 4 from 7 to 6
+move 2 from 6 to 8
+move 2 from 1 to 2
+move 1 from 1 to 4
+move 4 from 8 to 9
+move 2 from 1 to 9
+move 3 from 8 to 1
+move 25 from 5 to 2
+move 23 from 2 to 1
+move 1 from 7 to 1
+move 6 from 9 to 8
+move 6 from 8 to 3
+move 3 from 6 to 2
+move 10 from 1 to 2
+move 1 from 6 to 3
+move 2 from 3 to 6
+move 2 from 3 to 2
+move 2 from 6 to 8
+move 1 from 4 to 6
+move 14 from 1 to 9
+move 2 from 3 to 4
+move 14 from 2 to 4
+move 1 from 6 to 9
+move 17 from 4 to 3
+move 1 from 8 to 6
+move 2 from 7 to 2
+move 1 from 4 to 2
+move 1 from 5 to 9
+move 9 from 2 to 4
+move 17 from 3 to 7
+move 3 from 4 to 2
+move 1 from 8 to 3
+move 4 from 5 to 7
+move 1 from 3 to 6
+move 1 from 4 to 5
+move 14 from 7 to 9
+move 2 from 1 to 9
+move 3 from 2 to 1
+move 1 from 2 to 5
+move 1 from 3 to 7
+move 4 from 1 to 2
+move 2 from 6 to 7
+move 3 from 9 to 8
+move 4 from 2 to 4
+move 17 from 9 to 7
+move 1 from 2 to 8
+move 8 from 9 to 6
+move 1 from 8 to 2
+move 19 from 7 to 9
+move 9 from 4 to 2
+move 5 from 7 to 3
+move 3 from 5 to 9
+move 6 from 2 to 5
+move 1 from 9 to 4
+move 3 from 2 to 9
+move 25 from 9 to 5
+move 1 from 3 to 6
+move 2 from 5 to 8
+move 6 from 6 to 7
+move 1 from 3 to 4
+move 2 from 3 to 4
+move 1 from 8 to 2
+move 2 from 2 to 9
+move 2 from 8 to 3
+move 5 from 7 to 6
+move 3 from 7 to 9
+move 7 from 5 to 8
+move 2 from 3 to 5
+move 1 from 3 to 5
+move 1 from 6 to 2
+move 6 from 9 to 5
+move 1 from 9 to 2
+move 1 from 6 to 9
+move 2 from 5 to 6
+move 2 from 9 to 8
+move 11 from 8 to 1
+move 2 from 5 to 9
+move 3 from 6 to 5
+move 1 from 4 to 7
+move 5 from 5 to 7
+move 1 from 4 to 8
+move 7 from 7 to 2
+move 12 from 5 to 2
+move 10 from 1 to 8
+move 1 from 9 to 6
+move 3 from 8 to 1
+move 1 from 1 to 6
+move 10 from 2 to 3
+move 8 from 8 to 7
+move 1 from 9 to 8
+move 2 from 3 to 5
+move 14 from 5 to 8
+move 1 from 3 to 2
+move 3 from 8 to 1
+move 3 from 8 to 4
+move 3 from 2 to 4
+move 5 from 6 to 4
+move 8 from 7 to 9
+move 6 from 8 to 7
+move 1 from 5 to 7
+move 6 from 2 to 9
+move 4 from 4 to 6
+move 4 from 4 to 9
+move 3 from 9 to 3
+move 1 from 8 to 6
+move 1 from 5 to 6
+move 2 from 7 to 2
+move 1 from 3 to 4
+move 3 from 4 to 1
+move 3 from 4 to 3
+move 5 from 6 to 4
+move 4 from 3 to 8
+move 1 from 6 to 4
+move 8 from 3 to 2
+move 2 from 8 to 5
+move 11 from 9 to 7
+move 9 from 1 to 9
+move 2 from 7 to 3
+move 1 from 6 to 8
+move 1 from 6 to 5
+move 5 from 9 to 8
+move 3 from 9 to 7
+move 2 from 9 to 1
+move 2 from 3 to 7
+move 12 from 7 to 1
+move 2 from 8 to 9
+move 5 from 4 to 5
+move 4 from 9 to 4
+move 1 from 1 to 3
+move 7 from 1 to 3
+move 7 from 5 to 6
+move 1 from 9 to 1
+move 1 from 5 to 1
+move 5 from 7 to 8
+move 4 from 6 to 7
+move 5 from 1 to 8
+move 1 from 4 to 3
+move 12 from 8 to 7
+move 2 from 2 to 4
+move 2 from 8 to 9
+move 3 from 8 to 2
+move 2 from 6 to 7
+move 4 from 7 to 8
+move 1 from 6 to 8
+move 4 from 3 to 2
+move 15 from 7 to 8
+move 1 from 7 to 6
+move 3 from 3 to 5
+move 2 from 3 to 4
+move 5 from 2 to 5
+move 3 from 1 to 5
+move 4 from 5 to 6
+move 4 from 5 to 9
+move 1 from 5 to 7
+move 4 from 9 to 4
+move 2 from 2 to 9
+move 2 from 5 to 2
+move 2 from 2 to 1
+move 3 from 4 to 9
+move 2 from 9 to 4
+move 2 from 8 to 5
+move 2 from 5 to 2
+move 8 from 2 to 4
+move 2 from 1 to 3
+move 2 from 3 to 5
+move 3 from 6 to 9
+move 2 from 6 to 1
+move 2 from 1 to 4
+move 1 from 2 to 4
+move 1 from 5 to 7
+move 2 from 2 to 7
+move 18 from 4 to 2
+move 1 from 5 to 9
+move 2 from 7 to 9
+move 18 from 8 to 4
+move 1 from 7 to 8
+move 22 from 4 to 8
+move 6 from 2 to 6
+move 3 from 6 to 8
+move 3 from 6 to 4
+move 3 from 4 to 7
+move 3 from 7 to 1
+move 14 from 2 to 3
+move 10 from 3 to 2
+move 27 from 8 to 1
+move 1 from 7 to 6
+move 1 from 3 to 7
+move 2 from 2 to 8
+move 2 from 9 to 8
+move 18 from 1 to 4
+move 6 from 1 to 5
+move 10 from 4 to 7
+move 1 from 3 to 7
+move 4 from 7 to 2
+move 3 from 9 to 7
+move 1 from 6 to 5
+move 1 from 2 to 7
+move 2 from 5 to 6
+move 2 from 6 to 5
+move 3 from 5 to 1
+move 6 from 1 to 3
+move 4 from 5 to 9
+move 11 from 2 to 9
+move 2 from 1 to 6
+move 3 from 4 to 6
+move 5 from 7 to 3
+move 2 from 6 to 1
+move 2 from 1 to 5
+move 1 from 8 to 2
+move 1 from 1 to 8
+move 1 from 6 to 4
+move 2 from 4 to 5
+move 4 from 5 to 9
+move 11 from 3 to 6
+move 1 from 3 to 6
+move 8 from 6 to 5
+move 1 from 3 to 5
+move 4 from 4 to 8
+move 21 from 9 to 6
+move 2 from 9 to 5
+move 1 from 9 to 3
+move 1 from 2 to 6
+move 7 from 8 to 6
+move 12 from 6 to 5
+move 1 from 8 to 2
+move 10 from 6 to 7
+move 15 from 7 to 2
+move 2 from 7 to 3
+move 13 from 6 to 8
+move 9 from 5 to 1
+move 12 from 5 to 3
+move 1 from 2 to 3
+move 1 from 9 to 7
+move 9 from 3 to 4
+move 3 from 4 to 6
+move 1 from 7 to 6
+move 6 from 4 to 1
+move 2 from 5 to 2
+move 6 from 1 to 8
+move 9 from 8 to 6
+move 7 from 3 to 2
+move 1 from 2 to 9
+move 9 from 6 to 1
+move 13 from 1 to 7
+move 4 from 8 to 5
+move 2 from 7 to 1
+move 3 from 6 to 4
+move 3 from 5 to 8
+move 3 from 2 to 6
+move 1 from 5 to 3
+move 1 from 3 to 4
+move 1 from 9 to 8
+move 3 from 8 to 7
+move 12 from 2 to 9
+move 10 from 7 to 4
+move 5 from 8 to 4
+move 1 from 8 to 5
+move 11 from 4 to 7
+move 8 from 9 to 7
+move 1 from 6 to 2
+move 8 from 2 to 6
+move 1 from 5 to 8
+move 4 from 1 to 5
+move 4 from 9 to 6
+move 3 from 1 to 3
+move 2 from 8 to 4
+move 1 from 7 to 6
+move 1 from 2 to 7
+move 2 from 3 to 7
+move 4 from 4 to 9
+move 11 from 6 to 9
+move 10 from 7 to 8
+move 1 from 3 to 4
+move 1 from 6 to 4
+move 4 from 5 to 7
+move 6 from 7 to 4
+move 1 from 8 to 7
+move 4 from 6 to 7
+move 12 from 4 to 8
+move 12 from 8 to 1
+move 1 from 8 to 2
+move 10 from 1 to 7
+move 2 from 4 to 1
+move 8 from 8 to 3
+move 4 from 1 to 6
+move 8 from 7 to 6
+move 2 from 6 to 5
+move 2 from 5 to 2
+move 13 from 9 to 3
+move 3 from 2 to 5
+move 8 from 3 to 4
+move 7 from 6 to 7
+move 1 from 9 to 2
+move 1 from 9 to 1
+move 2 from 6 to 4
+move 3 from 4 to 8
+move 1 from 1 to 7
+move 4 from 4 to 6
+move 3 from 8 to 7
+move 1 from 2 to 9
+move 1 from 5 to 2
+move 1 from 2 to 5
+move 2 from 4 to 5
+move 1 from 7 to 2
+move 13 from 3 to 4
+move 7 from 4 to 3
+move 4 from 5 to 9
+move 1 from 4 to 7
+move 5 from 6 to 3
+move 3 from 9 to 7
+move 10 from 7 to 8
+move 3 from 4 to 8
+move 1 from 5 to 4
+move 2 from 3 to 1
+move 3 from 7 to 4
+move 4 from 8 to 6
+move 2 from 9 to 3
+move 2 from 4 to 5
+move 4 from 4 to 3
+move 8 from 8 to 3
+move 3 from 6 to 8
+move 1 from 2 to 6
+move 5 from 7 to 9
+move 1 from 4 to 3
+move 3 from 7 to 5
+move 3 from 8 to 4
+move 7 from 7 to 5
+move 3 from 7 to 8
+move 1 from 9 to 8
+move 3 from 4 to 1
+move 1 from 5 to 8
+move 3 from 7 to 1
+move 6 from 8 to 3
+move 3 from 9 to 5
+move 2 from 6 to 5
+move 2 from 1 to 6
+move 16 from 3 to 8
+move 4 from 5 to 8
+move 4 from 3 to 8
+move 1 from 9 to 5
+move 1 from 6 to 5
+move 3 from 3 to 7
+move 6 from 1 to 6
+move 1 from 5 to 4
+move 3 from 5 to 2
+move 2 from 7 to 4
+move 1 from 2 to 8
+move 6 from 8 to 1
+move 2 from 4 to 5
+move 2 from 2 to 3
+move 7 from 8 to 7
+move 1 from 4 to 6
+move 3 from 6 to 4
+move 3 from 4 to 9
+move 3 from 6 to 3
+move 11 from 8 to 6
+move 12 from 5 to 4
+move 5 from 6 to 1
+move 9 from 3 to 2
+move 7 from 6 to 1
+move 7 from 7 to 8
+move 5 from 8 to 3
+move 2 from 3 to 6
+move 2 from 8 to 1
+move 1 from 7 to 2
+move 7 from 3 to 8
+move 1 from 9 to 1
+move 14 from 1 to 3
+move 9 from 2 to 8
+move 11 from 3 to 4
+move 22 from 4 to 1
+move 2 from 3 to 1
+move 16 from 8 to 4
+move 1 from 9 to 2
+move 3 from 6 to 9
+move 3 from 9 to 5
+move 1 from 2 to 6
+move 1 from 5 to 7
\ No newline at end of file
diff --git a/AdventOfCode/Problems/AOC2022/Day5/test.txt b/AdventOfCode/Problems/AOC2022/Day5/test.txt
new file mode 100644
index 0000000..3dfad93
--- /dev/null
+++ b/AdventOfCode/Problems/AOC2022/Day5/test.txt
@@ -0,0 +1,9 @@
+ [D]
+[N] [C]
+[Z] [M] [P]
+ 1 2 3
+
+move 1 from 2 to 1
+move 3 from 1 to 3
+move 2 from 2 to 1
+move 1 from 1 to 2
\ No newline at end of file
diff --git a/AdventOfCode/Runner/AOCRunner.cs b/AdventOfCode/Runner/AOCRunner.cs
index 359f4f4..e101f66 100644
--- a/AdventOfCode/Runner/AOCRunner.cs
+++ b/AdventOfCode/Runner/AOCRunner.cs
@@ -128,12 +128,12 @@ public class AOCRunner
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Not Implemented");
}
- catch (Exception e)
- {
- Console.ForegroundColor = ConsoleColor.Red;
- Console.WriteLine("Failed");
- Console.WriteLine(e);
- }
+ //catch (Exception e)
+ //{
+ // Console.ForegroundColor = ConsoleColor.Red;
+ // Console.WriteLine("Failed");
+ // Console.WriteLine(e);
+ //}
finally
{
sw.Stop();