#define Day5 #define PartTwo #if Day5 using System.Text.RegularExpressions; Regex regex = new Regex(@"^(?\d+),(?\d+) -> (?\d+),(?\d+)$"); var lines = File.ReadAllLines("day5/input") .Select(l => { var match = regex.Match(l); return new Line( new Point( int.Parse(match.Groups["x1"].Value), int.Parse(match.Groups["y1"].Value)), new Point( int.Parse(match.Groups["x2"].Value), int.Parse(match.Groups["y2"].Value)) ); }).ToList(); var vents = new Dictionary(); foreach (var line in lines) { IEnumerable points; if (line.start.x == line.end.x) { points = Enumerable.Range(Math.Min(line.start.y, line.end.y), Math.Abs(line.start.y - line.end.y) + 1) .Select(y => new Point(line.start.x, y)); } else if (line.start.y == line.end.y) { points = Enumerable.Range(Math.Min(line.start.x, line.end.x), Math.Abs(line.start.x - line.end.x) + 1) .Select(x => new Point(x, line.start.y)); } else { #if PartTwo Point smallerX; Point largerX; bool increasingY; if (line.start.x < line.end.x) { smallerX = line.start; largerX = line.end; } else { smallerX = line.end; largerX = line.start; } increasingY = smallerX.y < largerX.y; points = Enumerable.Range(0, largerX.x - smallerX.x + 1) .Select(i => new Point(smallerX.x + i, smallerX.y + (increasingY ? i : (i*(-1))))); #else points = new List(); #endif } foreach (var p in points) { if (vents.ContainsKey(p)) { vents[p] += 1; } else { vents[p] = 1; } } } Console.WriteLine(vents.Count(v => v.Value > 1)); record Line(Point start, Point end); record Point(int x, int y); #endif