diff --git a/day17/part1.lua b/day17/part1.lua new file mode 100755 index 0000000..a778cc8 --- /dev/null +++ b/day17/part1.lua @@ -0,0 +1,19 @@ +#!/usr/bin/env luajit +require("utils") + +local xmin, xmax, ymin, ymax = string.match(io.open(arg[3]):read("*a"), "target area: x=(.*)%.%.(.*), y=(.*)%.%.(.*)") +xmin, xmax, ymin, ymax = tonumber(xmin), tonumber(xmax), tonumber(ymin), tonumber(ymax) + +local maxdy = 0 + +if ymax > 0 then + maxdy = ymax +end + +if ymin < 0 then + if -ymin - 1 > maxdy then + maxdy = -ymin - 1 + end +end + +print(euler(maxdy)) diff --git a/day17/part2.lua b/day17/part2.lua new file mode 100755 index 0000000..2c1ea3d --- /dev/null +++ b/day17/part2.lua @@ -0,0 +1,34 @@ +#!/usr/bin/env luajit +require("utils") + +local xmin, xmax, ymin, ymax = string.match(io.open(arg[3]):read("*a"), "target area: x=(.*)%.%.(.*), y=(.*)%.%.(.*)") +xmin, xmax, ymin, ymax = tonumber(xmin), tonumber(xmax), tonumber(ymin), tonumber(ymax) + +local mindy = ymin + +local maxdy = 0 +if ymax > 0 then maxdy = ymax end +if ymin < 0 then if -ymin - 1 > maxdy then maxdy = -ymin - 1 end end + +local mindx = 0 +while euler(mindx) < xmin do mindx = mindx + 1 end + +local maxdx = xmax + +local count = 0 +for odx = mindx, maxdx do + for ody = mindy, maxdy do + local x, y, dx, dy = 0, 0, odx, ody + while x <= xmax and y >= math.min(0, ymin) do + x, y = x + dx, y + dy + if xmin <= x and x <= xmax and ymin <= y and y <= ymax then + count = count + 1 + break + end + if dx > 0 then dx = dx - 1 end + dy = dy - 1 + end + end +end + +print(count) diff --git a/utils.lua b/utils.lua index 1f06235..867a0b6 100644 --- a/utils.lua +++ b/utils.lua @@ -84,3 +84,6 @@ function bin2dec(str) return v end +function euler(n) + return n * (n + 1) / 2 +end