2021aoc/Day17.cs

56 lines
1.5 KiB
C#

// #define Day17
#if Day17
using System.Text.RegularExpressions;
var line = File.ReadAllText("day17/input");
var regex = new Regex(@"target area: x=(?<x1>-?\d+)\.\.(?<x2>-?\d+), y=(?<y1>-?\d+)\.\.(?<y2>-?\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