diff --git a/AdvendOfCode.Runner/Program.cs b/AdvendOfCode.Runner/Program.cs index 15726af..4fe815f 100644 --- a/AdvendOfCode.Runner/Program.cs +++ b/AdvendOfCode.Runner/Program.cs @@ -4,12 +4,12 @@ using AdventOfCode.Core; InputReader inputReader = new() { - //IsDebug = true + IsDebug = true }; -inputReader.SetInputByChallange(2); +inputReader.SetInputByChallange(3); -IChallange challange = new Day02(inputReader); +IChallange challange = new Day03(inputReader); Console.WriteLine($"Part 1: {await challange.GetSolutionPart1()}"); diff --git a/AdventOfCode.Solutions/2023/Day 03/Day03.cs b/AdventOfCode.Solutions/2023/Day 03/Day03.cs index 5588bac..89db641 100644 --- a/AdventOfCode.Solutions/2023/Day 03/Day03.cs +++ b/AdventOfCode.Solutions/2023/Day 03/Day03.cs @@ -7,12 +7,6 @@ namespace AdventOfCode.Solutions._2023 { private InputReader _inputReader = reader; - private struct Point - { - public int X { get; set; } - public int Y { get; set; } - } - private class PartNumber { public int X { get; set; } @@ -27,6 +21,10 @@ namespace AdventOfCode.Solutions._2023 public bool IsPartSymbol() => !IsDigit(); + public List XRange => Enumerable.Range(X, Length).ToList(); + + public List YRange => Enumerable.Range(Y - 1, 3).ToList(); + public override string ToString() { return $"[{Y},{X}] {Section}"; @@ -48,11 +46,18 @@ namespace AdventOfCode.Solutions._2023 List numbers = parts.Where(p => p.IsDigit()).ToList(); List symbols = parts.Where(p => p.IsPartSymbol()).ToList(); - var intersected = numbers.Where(number => IsPointInAnyBox(symbols, number)).ToList(); - - //var intersected = numbers.Where(number => GetSection(symbols, number.X - 1, number.Y - 1, number.X + number.Length, number.Y + 1).Any()).ToList(); - - total = numbers.Where(number => GetSection(symbols, number.X - 1, number.Y - 1, number.X + number.Length, number.Y + 1).Any()).Sum(number => int.Parse(number.Section)); + foreach(PartNumber number in numbers) + { + var yfilter = symbols.Where(symbol => number.YRange.Contains(symbol.Y)); + var xfilter = yfilter.Where(symbol => number.XRange.Intersect(symbol.XRange).Any()); + bool isPartNumber = xfilter.Any(); + if(isPartNumber) + { + Console.WriteLine("Adding " + number.ToString()); + total += int.Parse(number.Section); + Console.WriteLine("Total: " + total.ToString()); + } + } //Grid grid = await _inputReader.ReadToGrid(); //int row = 0; @@ -94,67 +99,19 @@ namespace AdventOfCode.Solutions._2023 foreach (PartNumber gear in gears) { // check if there are 2 numbers around - List ratios = GetSection(numbers, gear).ToList(); + //List ratios = GetSection(numbers, gear).ToList(); - if (ratios.Count != 2) - continue; + //if (ratios.Count != 2) + // continue; - int totalRatio = int.Parse(ratios[0].Section) * int.Parse(ratios[1].Section); + //int totalRatio = int.Parse(ratios[0].Section) * int.Parse(ratios[1].Section); - total += totalRatio; + //total += totalRatio; } return total.ToString(); } - private IEnumerable GetSection(List toSearch, int fromX, int fromY, int toX, int toY) - { - return toSearch.Where(node => node.X >= fromX && node.X + node.Length <= toX && node.Y >= fromY && node.Y <= toY); - } - - private bool IsPointInAnyBox(List targets, PartNumber source) - { - return targets.Any(target => IsPointInBox(target, source)); - } - - private bool IsPointInBox(PartNumber target, PartNumber source) - { - Point targetA = new Point { X = target.X, Y = target.Y }, targetB = new Point { X = target.X + target.Length - 1, Y = target.Y }; - Point sourceA = new Point { X = source.X, Y = source.Y }; - return IsPointInBox(targetA, targetB, sourceA); - } - - private bool DoBoxesOverlap(List targets, PartNumber source) - { - return targets.Any(target => DoBoxesOverlap(target, source)); - } - - private bool DoBoxesOverlap(PartNumber target, PartNumber source) - { - Point targetA = new Point { X = target.X, Y = target.Y }, targetB = new Point { X = target.X + target.Length - 1, Y = target.Y }; - Point sourceA = new Point { X = source.X - 1, Y = source.Y - 1 }, sourceB = new Point { X = source.X + source.Length, Y = source.Y + 1 }; - return IsPointInBox(targetA, targetB, sourceA) && IsPointInBox(targetA, targetB, sourceB); - } - - - - private bool IsPointInBox(Point boxPointA, Point boxPointB, Point pointSource) - { - return pointSource.X >= boxPointA.X && - pointSource.X <= boxPointB.X && - pointSource.Y >= boxPointA.Y && - pointSource.Y <= boxPointB.Y; - } - - private IEnumerable GetSection(List toSearch, PartNumber source) - { - return toSearch.Where(target => - target.X >= source.X - 1 && - target.X + target.Length <= source.X && - target.Y >= source.Y - 1 && - target.Y <= source.Y + 1); - } - [GeneratedRegex("(\\d+)", RegexOptions.Compiled)] private static partial Regex FindDigits(); diff --git a/AdventOfCode.Solutions/day-00-input.txt b/AdventOfCode.Solutions/day-00-input.txt index 71f208a..624ea4f 100644 --- a/AdventOfCode.Solutions/day-00-input.txt +++ b/AdventOfCode.Solutions/day-00-input.txt @@ -1,6 +1,10 @@ -Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53 -Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19 -Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1 -Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83 -Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36 -Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11 \ No newline at end of file +467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.. \ No newline at end of file