65日目 FizzBuzzと文字列ポインタ
いまさらFizzBuzzなど - hogelogの日記 - ハチロク世代
ずいぶん昔に*1id:hogelogにif分岐無しでFizzBuzz教えてもらったのだが、その時はなぜそう書けるのかわかってなかった。
じゃんけんゲームを改変したときのashitanoのアドバイスを思い出したので、ようやく文字列ポインタを理解することにした。
まずね、!2が0になることにおどろいた。
#include <stdio.h> int main() { printf("!2: %d", !1); return 0; }
これがフラグってやつか、とはじめて気付いた。いや、まだ違うかもだけど。
#include <stdio.h> #define NUM 10 int main() { int i; for(i = 1; i < NUM+1; i++) printf("%2d: %d\n", i, !(i%3)); //3で割れるフラグ return 0; }
フラグは0,1だけじゃなくてもいい。(4進なら4通りの分岐が表せる)
#include <stdio.h> #define NUM 20 int main() { int i; for(i = 1; i < NUM+1; i++) printf("%2d: %d\n", i, !(i%3)+!(i%5)*2); // 0,1,2,3の場合分け(3 = 1 + 2) return 0; }
そしたら数字とFizz, Buzz, FizzBuzzに当てはめるだけじゃん…
と思ったがprintfでの数字表示がちょっと面倒だった。とりあえず0を表示。
#include <stdio.h> #define NUM 20 int main() { int i; char *str[]={"0", "Fizz", "Buzz", "FizzBuzz"}; //「文字列の配列を表すポインタ」 for(i = 1; i < NUM+1; i++) printf("%2d: %s\n", i, str[!(i%3)+!(i%5)*2]); return 0; }
たどりついたのはこんなところ。ほとんどコピぺですが。
#include <stdio.h> #define NUM 20 int main() { int i; char *str[]={"%d\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"}; for(i = 1; i < NUM+1; i++) printf(str[!(i%3)+!(i%5)*2], i); //何番目かが表示できなくなって悲しい ってか""いらんのかprintf return 0; }
文字列配列の中に%d入れても、printfで読み込んでくれるってのが裏技的だな。
もちょっと追記する。
*1:約二ヶ月前だった