aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas Ransan <lucas@ransan.tk>2021-07-31 18:51:04 +0200
committerLucas Ransan <lucas@ransan.tk>2021-07-31 18:53:01 +0200
commit860d54daef008ec53ab7f49045835d1ebcbb24e3 (patch)
tree58047b1309954a41abea1db1e1edcd65c349a0fb
parent9e306daa9f2883883b3b47bb0ddd4f819cd3c305 (diff)
downloadperlweeklychallenge-club-860d54daef008ec53ab7f49045835d1ebcbb24e3.tar.gz
perlweeklychallenge-club-860d54daef008ec53ab7f49045835d1ebcbb24e3.tar.bz2
perlweeklychallenge-club-860d54daef008ec53ab7f49045835d1ebcbb24e3.zip
C3 week 123 task 2
-rw-r--r--challenge-123/luc65r/c3/ch-2.c368
1 files changed, 68 insertions, 0 deletions
diff --git a/challenge-123/luc65r/c3/ch-2.c3 b/challenge-123/luc65r/c3/ch-2.c3
new file mode 100644
index 0000000000..05ee05296f
--- /dev/null
+++ b/challenge-123/luc65r/c3/ch-2.c3
@@ -0,0 +1,68 @@
+import std::io;
+
+extern func float strtof(char* str, char** str_end);
+
+struct Point {
+ float x, y;
+}
+
+func void Point.add(Point *a, Point b) {
+ a.x += b.x;
+ a.y += b.y;
+}
+
+func void Point.sub(Point *a, Point b) {
+ a.x -= b.x;
+ a.y -= b.y;
+}
+
+macro abs(x) {
+ return x < 0 ? -x : x;
+}
+
+const float EPSILON = 0.00001;
+
+macro bool eq(a, b) {
+ return @abs(a - b) < EPSILON;
+}
+
+func bool Point.eq(Point *a, Point b) {
+ return @eq(a.x, b.x) && @eq(a.y, b.y);
+}
+
+func int main(int argc, char** argv) {
+ if (argc != 9) return 1;
+
+ Point[4] pts = void;
+ for (int i; i < 8; i++) {
+ (*(float[8]*)(&pts))[i] = strtof(argv[i + 1], null);
+ }
+
+ Point center;
+ foreach (p : pts) center.add(p);
+ center.x /= 4;
+ center.y /= 4;
+
+ Point[4] v = void;
+ v[0] = pts[0];
+ v[0].sub(center);
+ v[1] = { v[0].x, -v[0].y };
+ v[2] = { -v[0].x, v[0].y };
+ v[3] = { -v[0].x, -v[0].y };
+
+ foreach (&x : v) x.add(center);
+
+ bool square = {|
+ for FOUND: (int i; i < 4; i++) {
+ for (int j; j < 4; j++) {
+ if (v[i].eq(pts[j])) continue FOUND;
+ }
+ return false;
+ }
+ return true;
+ |};
+
+ io::printf("%d\n", square);
+
+ return 0;
+}