diff --git a/snail.c b/snail.c new file mode 100644 index 0000000..88981d8 --- /dev/null +++ b/snail.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include + +size_t max(const size_t*, const size_t*); + +void snail(int* xss, int* yss, size_t h, size_t w) { + if (h == 0 || w == 0) + return; + + int b, c, r, i = 0; + + for (b = 0; b <= (int)max(&h, &w); b++) { + int ex = (w - b - 1), ey = (h - b - 1); + + for (c = b; c <= ex; c++) yss[i++] = xss[b * w + c]; + for (r = b + 1; r <= ey; r++) yss[i++] = xss[r * w + ex]; + + if (ex == b || ey == b) return; + + for (c = ex - 1; c >= b; c--) yss[i++] = xss[ey * w + c]; + for (r = ey - 1; r > b; r--) yss[i++] = xss[r * w + b]; + } +} + +size_t max(const size_t *a, const size_t *b) { return (*a < *b ? *b : *a); } + +bool validate(int* res, int* exp, size_t len) { + bool valid = true; + for (size_t i = 0; i < len; i++) { + if (res[i] != exp[i]) { + valid = false; + break; + } + } + printf(valid ? "true\n" : "false\n"); + return valid; +} + +int main(void) { + bool all_valid = true; + + int initial1[3*3] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + int expected1[sizeof(initial1)] = {1, 2, 3, 6, 9, 8, 7, 4, 5}; + int* result = malloc(sizeof(initial1)); + snail(initial1, result, 3, 3); + all_valid &= validate(result, expected1, sizeof(initial1) / sizeof(int)); + free(result); + + int initial2[3 * 4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; + int expected2[3 * 4] = {1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7}; + result = malloc(sizeof(initial2)); + snail(initial2, result, 3, 4); + all_valid &= validate(result, expected2, sizeof(initial2) / sizeof(int)); + free(result); + + int initial3[5 * 3] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; + int expected3[5 * 3] = {1, 2, 3, 6, 9, 12, 15, 14, 13, 10, 7, 4, 5, 8, 11}; + result = malloc(sizeof(initial3)); + snail(initial3, result, 5, 3); + all_valid &= validate(result, expected3, sizeof(initial3) / sizeof(int)); + free(result); + + printf(all_valid ? "all tests passed.\n" : "tests failed.\n"); + + return 0; +}