// #define Day17 #if Day17 using System.Text.RegularExpressions; var line = File.ReadAllText("day17/input"); var regex = new Regex(@"target area: x=(?-?\d+)\.\.(?-?\d+), y=(?-?\d+)\.\.(?-?\d+)"); var m = regex.Match(line); var xTarget = new Distance(int.Parse(m.Groups["x1"].Value), int.Parse(m.Groups["x2"].Value)); var yTarget = new Distance(int.Parse(m.Groups["y1"].Value), int.Parse(m.Groups["y2"].Value)); var maxYVelocity = yTarget.start * -1 - 1; Console.WriteLine(SumFormulae(maxYVelocity)); var count = Check(1, xTarget.end, yTarget.start, maxYVelocity); Console.WriteLine(count); // 1440 too low long Check(int minX, int maxX, int minY, int maxY) { long count = 0; for (int x = minX; x <= maxX; x++) { for (int y = minY; y <= maxY; y++) { if (LandsInTarget(x, y, new Position(0, 0))) { count += 1; Console.WriteLine($"{x}, {y}"); } } } return count; } bool LandsInTarget(int x, int y, Position cur) { while (cur.x <= xTarget.end && cur.y >= yTarget.start) { if (InTarget(cur)) { return true; } cur = new Position(cur.x + x, cur.y + y); x += x > 0 ? -1 : 0; y += -1; } return false; } bool InTarget(Position cur) { return cur.x >= xTarget.start && cur.x <= xTarget.end && cur.y >= yTarget.start && cur.y <= yTarget.end; } long SumFormulae(long v) => (v * (v + 1)) / 2; record Distance(int start, int end); record Position(int x, int y); #endif