aboutsummaryrefslogtreecommitdiff
path: root/src/2019/day10/aoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2019/day10/aoc.cpp')
-rw-r--r--src/2019/day10/aoc.cpp61
1 files changed, 14 insertions, 47 deletions
diff --git a/src/2019/day10/aoc.cpp b/src/2019/day10/aoc.cpp
index 60de3ea..2104343 100644
--- a/src/2019/day10/aoc.cpp
+++ b/src/2019/day10/aoc.cpp
@@ -1,6 +1,7 @@
#include "aoc.h"
#include <algorithm>
#include <vector>
+#include <math.h>
namespace aoc2019 {
@@ -10,47 +11,20 @@ struct posd {
int count = 0;
};
-enum dim {
- xe0yl0,
- xg0yl0,
- xg0ye0,
- xg0yg0,
- xe0yg0,
- xl0yg0,
- xl0ye0,
- xl0yl0
-};
-
-dim dimention(belt::distance d) {
- if (d.dx == 0 && d.dy < 0) return xe0yl0;
- if (d.dx > 0 && d.dy < 0) return xg0yl0;
- if (d.dx > 0 && d.dy == 0) return xg0ye0;
- if (d.dx > 0 && d.dy > 0) return xg0yg0;
- if (d.dx == 0 && d.dy > 0) return xe0yg0;
- if (d.dx < 0 && d.dy > 0) return xl0yg0;
- if (d.dx < 0 && d.dy == 0) return xl0ye0;
- return xl0yl0;
-}
-
-bool dimcmp(dim m, belt::distance d1, belt::distance d2) {
- int x1 = std::abs(d1.dx);
- int y1 = std::abs(d1.dy);
- int x2 = std::abs(d2.dx);
- int y2 = std::abs(d2.dy);
-
- switch (m) {
- case xe0yl0: return y1 < y2;
- case xg0yl0: return y1 > y2 ? true : y1 < y2 ? false : x1 < x2;
- case xg0ye0: return x1 < x2;
- case xg0yg0: return y1 < y2 ? true : y1 > y2 ? false : x1 < x2;
- case xe0yg0: return y1 < y2;
- case xl0yg0: return y1 > y2 ? true : y1 < y2 ? false : x1 < x2;
- case xl0ye0: return x1 < x2;
- case xl0yl0: return y1 < y2 ? true : y1 > y2 ? false : x1 < x2;
+float angle(int x, int y) {
+ auto a = std::atan2(y, x);
+ auto r = a * 180 / M_PI;
+ if (r > 360) {
+ r -= 360;
}
- return false;
+ if (r < 0) {
+ r += 360;
+ }
+ r += 90;
+ return r >= 360 ? r - 360 : r;
}
+
belt::pos vaporize(belt b, belt::pos& m, std::vector<posd>& ps, int* count) {
belt bx = b;
for (auto& dp : ps) {
@@ -58,7 +32,7 @@ belt::pos vaporize(belt b, belt::pos& m, std::vector<posd>& ps, int* count) {
dp.count = 1;
b.get(dp.p) = '.';
*count += 1;
- printf("%d asteroid to be vaporized is at (%d, %d)\n", *count, dp.p.x, dp.p.y);
+ // printf("%d asteroid to be vaporized is at (%d, %d)\n", *count, dp.p.x, dp.p.y);
if (*count == 200) {
return dp.p;
}
@@ -98,14 +72,7 @@ std::pair<int, int> day10(line_view file) {
}
std::sort(ps.begin(), ps.end(), [](const posd& d1, const posd& d2) {
- dim m1 = dimention(d1.d);
- dim m2 = dimention(d2.d);
- if (m1 == m2) {
- return dimcmp(m1, d1.d, d2.d);
- }
- else {
- return (int) m1 < (int) m2;
- }
+ return angle(d1.d.dx, d1.d.dy) < angle(d2.d.dx, d2.d.dy);
});
int count{0};