面白そうなお題があったので、試しに書いてみた。

#include	

int main()
{
int a=0;
int b=3;
int c=5;
int f=0;

while(a < 100){
a++;
b--;
c--;
if(b == 0){
printf("Fizz");
b=3;
f=1;
}
if(c == 0){
printf("Buzz");
c=5;
f=1;
}
if(f == 0) printf("%d",a);
printf("\n");
f=0;
}
}

 普通に書いた答はあちこちにあって面白くないのでヒネクレてみた(笑)

 「3の倍数」とか「5の倍数」というお題なのに割り算が無い。その代わり、3進カウンタと5進カウンタを用意してループ1回ごとに1づつ減算していき、0になったらそれぞれに応じた文を表示する。ただしそのときに数字が出てしまってはまずいので、変数fを使って表示を抑制している。

 割り算をわざと使わないで書いてみた。CのソースだがZ-80のマシン語で書き直すのも比較的容易だろう。変数のインクリメント・デクリメントや0との比較は8ビットレジスタで4クロックと高速なので、積極的に使っている。変数fの扱いがいまひとつ美しくないので書き直してみた。

#include	

int main()
{
int a=0;
int b=3;
int c=5;

while(a < 100){
a++;
b--;
c--;
printf("%d",a);
if(b == 0){
printf("\b\b\bFizz ");
b=3;
}
if(c == 0){
printf("\b\b\bBuzz");
c=5;
}
printf("\n");
}
}

先にprintf()で数字を表示させてしまっているのは間違いではない。その後に出てくるprintf()の「¥b¥b¥b」という文字列によって、不要なときには消している。なので、出力先によってはメタ処理されずに表示されてしまうかもしれない。cygwinbashでは問題なかった。

 「%」演算子を使えばものの数分で書けてしまうネタだが、こういったヒネた答えを出すような学生がいまのところ周りには見当たらないのが残念。