/*
* We save the spiral in an n x n Matrix using a 2D array
* The number at coordinates (x, y) is in the x-th row and the y-th column
*
* / - - - y
* | 1 2 3 4
* | 12 13 14 5
* | 11 16 15 6
* x 10 9 8 7
*
*/
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
void print(int n, int spiral[n][n]) {
int square = n * n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
printf("%*d ", numDigits
, spiral
[i
][j
]); }
}
}
int main(int argc, char *argv[]) {
bool reverse = argc > 1;
while(1) {
int num = 0;
if(num <= 0) {
// Abort on non positive numbers
break;
}
int spiral[num][num];
/*
* The coordinates in the spiral we are currently at
*/
int x = 0, y = 0;
/*
* For each number we travel on in the direction given by these two variables
* With these initial values we travel from the top left to the right
*/
int xDiff = 0;
int yDiff = 1;
/*
* When walking the spiral this counts how many turns are left until we completed one layer of the spiral
* In the beginning there are three turns after that there are always two turns
*/
int turns = 3;
/*
* Length of edges in the current layer
* The number of steps we can take on an edge before we need to turn depends on what layer we are currently in
* in the beginning it is one less than the side length of the spiral and decreases by one for each layer
*/
int len = num - 1;
/*
* Counts how many steps we have remaining before we need to turn
*/
int lenRemaining = len;
for (int i = 1; i <= num * num; ++i) {
/*
* Just in case
*/
if(x >= num || y >= num || x < 0 || y < 0) {
fprintf(stderr
, "An error occured while walking the spiral\n"); continue;
}
spiral[x][y] = i;
if(lenRemaining == 0) {
/*
* We need to turn
*/
turns--;
/*
* Set the new movement vectors
*/
int xDiffOld = xDiff;
xDiff = yDiff;
yDiff = -xDiffOld;
/*
* If we have no turns left, we have reached a new layer
*/
if(turns == 0) {
len--;
turns = 2;
}
/*
* Reset lenRemaining
*/
lenRemaining = len;
}
/*
* Apply movement vector and decrease remaining steps
*/
x += reverse? yDiff : xDiff;
y += reverse? xDiff : yDiff;
lenRemaining--;
}
print(num, spiral);
}
return 0;
}
LyogCiAqIFdlIHNhdmUgdGhlIHNwaXJhbCBpbiBhbiBuIHggbiBNYXRyaXggdXNpbmcgYSAyRCBhcnJheQogKiBUaGUgbnVtYmVyIGF0IGNvb3JkaW5hdGVzICh4LCB5KSBpcyBpbiB0aGUgeC10aCByb3cgYW5kIHRoZSB5LXRoIGNvbHVtbgogKgogKiAvICAtICAtICAtICB5CiAqIHwgIDEgIDIgIDMgIDQKICogfCAxMiAxMyAxNCAgNQogKiB8IDExIDE2IDE1ICA2CiAqIHggMTAgIDkgIDggIDcKICoKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPG1hdGguaD4KCnZvaWQgcHJpbnQoaW50IG4sIGludCBzcGlyYWxbbl1bbl0pIHsKICAgIGludCBzcXVhcmUgPSBuICogbjsKCiAgICBpbnQgbnVtRGlnaXRzID0gZmxvb3IobG9nMTAoc3F1YXJlKSkgKyAxOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyArK2opIHsKICAgICAgICAgICAgcHJpbnRmKCIlKmQgIiwgbnVtRGlnaXRzLCBzcGlyYWxbaV1bal0pOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CgogICAgcHJpbnRmKCJcbiIpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICBib29sIHJldmVyc2UgPSBhcmdjID4gMTsKCiAgICB3aGlsZSgxKSB7CiAgICAgICAgaW50IG51bSA9IDA7CiAgICAgICAgc2NhbmYoIiVkIiwgJm51bSk7CgogICAgICAgIGlmKG51bSA8PSAwKSB7CiAgICAgICAgICAgIC8vIEFib3J0IG9uIG5vbiBwb3NpdGl2ZSBudW1iZXJzCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaW50IHNwaXJhbFtudW1dW251bV07CgogICAgICAgIC8qCiAgICAgICAgICogVGhlIGNvb3JkaW5hdGVzIGluIHRoZSBzcGlyYWwgd2UgYXJlIGN1cnJlbnRseSBhdAogICAgICAgICAqLwogICAgICAgIGludCB4ID0gMCwgeSA9IDA7CgogICAgICAgIC8qCiAgICAgICAgICogRm9yIGVhY2ggbnVtYmVyIHdlIHRyYXZlbCBvbiBpbiB0aGUgZGlyZWN0aW9uIGdpdmVuIGJ5IHRoZXNlIHR3byB2YXJpYWJsZXMKICAgICAgICAgKiBXaXRoIHRoZXNlIGluaXRpYWwgdmFsdWVzIHdlIHRyYXZlbCBmcm9tIHRoZSB0b3AgbGVmdCB0byB0aGUgcmlnaHQKICAgICAgICAgKi8KICAgICAgICBpbnQgeERpZmYgPSAwOwogICAgICAgIGludCB5RGlmZiA9IDE7CgogICAgICAgIC8qCiAgICAgICAgICogV2hlbiB3YWxraW5nIHRoZSBzcGlyYWwgdGhpcyBjb3VudHMgaG93IG1hbnkgdHVybnMgYXJlIGxlZnQgdW50aWwgd2UgY29tcGxldGVkIG9uZSBsYXllciBvZiB0aGUgc3BpcmFsCiAgICAgICAgICogSW4gdGhlIGJlZ2lubmluZyB0aGVyZSBhcmUgdGhyZWUgdHVybnMgYWZ0ZXIgdGhhdCB0aGVyZSBhcmUgYWx3YXlzIHR3byB0dXJucwogICAgICAgICAqLwogICAgICAgIGludCB0dXJucyA9IDM7CgogICAgICAgIC8qCiAgICAgICAgICogTGVuZ3RoIG9mIGVkZ2VzIGluIHRoZSBjdXJyZW50IGxheWVyCiAgICAgICAgICogVGhlIG51bWJlciBvZiBzdGVwcyB3ZSBjYW4gdGFrZSBvbiBhbiBlZGdlIGJlZm9yZSB3ZSBuZWVkIHRvIHR1cm4gZGVwZW5kcyBvbiB3aGF0IGxheWVyIHdlIGFyZSBjdXJyZW50bHkgaW4KICAgICAgICAgKiBpbiB0aGUgYmVnaW5uaW5nIGl0IGlzIG9uZSBsZXNzIHRoYW4gdGhlIHNpZGUgbGVuZ3RoIG9mIHRoZSBzcGlyYWwgYW5kIGRlY3JlYXNlcyBieSBvbmUgZm9yIGVhY2ggbGF5ZXIKICAgICAgICAgKi8KICAgICAgICBpbnQgbGVuID0gbnVtIC0gMTsKCiAgICAgICAgLyoKICAgICAgICAgKiBDb3VudHMgaG93IG1hbnkgc3RlcHMgd2UgaGF2ZSByZW1haW5pbmcgYmVmb3JlIHdlIG5lZWQgdG8gdHVybgogICAgICAgICAqLwogICAgICAgIGludCBsZW5SZW1haW5pbmcgPSBsZW47CgogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG51bSAqIG51bTsgKytpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEp1c3QgaW4gY2FzZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYoeCA+PSBudW0gfHwgeSA+PSBudW0gfHwgeCA8IDAgfHwgeSA8IDApIHsKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQW4gZXJyb3Igb2NjdXJlZCB3aGlsZSB3YWxraW5nIHRoZSBzcGlyYWxcbiIpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNwaXJhbFt4XVt5XSA9IGk7CgogICAgICAgICAgICBpZihsZW5SZW1haW5pbmcgPT0gMCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFdlIG5lZWQgdG8gdHVybgogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgdHVybnMtLTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogU2V0IHRoZSBuZXcgbW92ZW1lbnQgdmVjdG9ycwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpbnQgeERpZmZPbGQgPSB4RGlmZjsKICAgICAgICAgICAgICAgIHhEaWZmID0geURpZmY7CiAgICAgICAgICAgICAgICB5RGlmZiA9IC14RGlmZk9sZDsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogSWYgd2UgaGF2ZSBubyB0dXJucyBsZWZ0LCB3ZSBoYXZlIHJlYWNoZWQgYSBuZXcgbGF5ZXIKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYodHVybnMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGxlbi0tOwogICAgICAgICAgICAgICAgICAgIHR1cm5zID0gMjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogUmVzZXQgbGVuUmVtYWluaW5nCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGxlblJlbWFpbmluZyA9IGxlbjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogQXBwbHkgbW92ZW1lbnQgdmVjdG9yIGFuZCBkZWNyZWFzZSByZW1haW5pbmcgc3RlcHMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHggKz0gcmV2ZXJzZT8geURpZmYgOiB4RGlmZjsKICAgICAgICAgICAgeSArPSByZXZlcnNlPyB4RGlmZiA6IHlEaWZmOwogICAgICAgICAgICBsZW5SZW1haW5pbmctLTsKICAgICAgICB9CgogICAgICAgIHByaW50KG51bSwgc3BpcmFsKTsKICAgIH0KICAgIHJldHVybiAwOwp9