diff options
| author | Lucas Ransan <lucas@ransan.tk> | 2021-07-31 18:51:04 +0200 |
|---|---|---|
| committer | Lucas Ransan <lucas@ransan.tk> | 2021-07-31 18:53:01 +0200 |
| commit | 860d54daef008ec53ab7f49045835d1ebcbb24e3 (patch) | |
| tree | 58047b1309954a41abea1db1e1edcd65c349a0fb | |
| parent | 9e306daa9f2883883b3b47bb0ddd4f819cd3c305 (diff) | |
| download | perlweeklychallenge-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.c3 | 68 |
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; +} |
