diff --git a/AdventOfCode.Solutions/2023/Day 03/Day03.cs b/AdventOfCode.Solutions/2023/Day 03/Day03.cs index a9bf1c3..80e8b05 100644 --- a/AdventOfCode.Solutions/2023/Day 03/Day03.cs +++ b/AdventOfCode.Solutions/2023/Day 03/Day03.cs @@ -26,21 +26,27 @@ namespace AdventOfCode.Solutions._2023 public async Task GetSolutionPart1() { - List parts = []; - int row = 0; - await foreach (string line in _inputReader.ReadAsStringLine()) - { - row++; - MatchCollection matchCollection = FindPartItems().Matches(line); - parts.AddRange(matchCollection.Select(match => new PartNumber { X = match.Index + 1, Y = row, Section = match.Value })); - } - - List numbers = parts.Where(p => p.IsDigit()).Select(number => new Rectangle(new Point(number.X - 1, number.Y - 1), new Point(number.X + number.Length, number.Y + 1), number.Section)).ToList(); - List symbols = parts.Where(p => p.IsPartSymbol()).Select(symbol => new Point(symbol.X, symbol.Y, symbol.Section)).ToList(); - return numbers.Where(number => symbols.Any(s => number.Intersect(s))).Select(num => int.Parse(num.Value)).Sum().ToString(); + var (Numbers, Symbols) = await GetNumbersAndSymbols(); + return Numbers + .Where(number => Symbols.Any(s => number.Intersect(s))) + .Select(num => int.Parse(num.Value)) + .Sum() + .ToString(); } public async Task GetSolutionPart2() + { + var (Numbers, Symbols) = await GetNumbersAndSymbols(); + return Symbols + .Where(s => s.Value == "*") + .Select(g => Numbers.Where(n => n.Intersect(g))) + .Where(n => n.Count() == 2) + .Select(num => int.Parse(num.First().Value) * int.Parse(num.Last().Value)) + .Sum() + .ToString(); + } + + private async Task<(List Numbers, List Symbols)> GetNumbersAndSymbols() { List parts = []; int row = 0; @@ -52,13 +58,9 @@ namespace AdventOfCode.Solutions._2023 } List numbers = parts.Where(p => p.IsDigit()).Select(number => new Rectangle(new Point(number.X - 1, number.Y - 1), new Point(number.X + number.Length, number.Y + 1), number.Section)).ToList(); - List gears = parts.Where(p => p.IsPartSymbol() && p.Section == "*").Select(symbol => new Point(symbol.X, symbol.Y, symbol.Section)).ToList(); + List symbols = parts.Where(p => p.IsPartSymbol()).Select(symbol => new Point(symbol.X, symbol.Y, symbol.Section)).ToList(); - return gears.Select(g => numbers.Where(n => n.Intersect(g))) - .Where(n => n.Count() == 2) - .Select(num => int.Parse(num.First().Value) * int.Parse(num.Last().Value)) - .Sum() - .ToString(); + return (numbers, symbols); } [GeneratedRegex("(\\d+)", RegexOptions.Compiled)]