1から100までFizz Buzz

現実逃避。1から100までFizz Buzzを表示するというよくあるやつ。

#include <stdio.h>
#include <stdlib.h>

char *x[] = {
    "Fizz",
    "Buzz",
    "Fizz Buzz"
};
int y[][5]={
    {2, -2, -2, -2, -2},
    {-1, 0, -1,-1, -2},
    {-2, 1, 0, -1, -2},
    {2, -2, 1, 0, -1}
};
char z[100][4];

char *f(int a, int b, int c)
{
    if (a == 1)
        return "1";
    if (!c || y[abs(y[3][b])][abs(c) - 1] == -2) {
        b = (b + 1) % 5;
        c = y[3][b] < 0 ? -4 : 1;
    }
    while (y[abs(y[3][b])][abs(c) - 1] == -2)
        c++;
    puts(f(a - 1, b, c + 1));
    return y[abs(y[3][b])][abs(c) - 1] == -1 ?
        sprintf(z[a - 1], "%d", a), z[a - 1] :
        x[y[abs(y[3][b])][abs(c) - 1]];
}

int main(void)
{
    puts(f(100, -1, 0));
    return 0;
}