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();