56 lines
1.5 KiB
C#
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
|