2014.01.31 Friday
FizzBuzz問題(2)
うちの猫はものすごく食い意地が張っている。
おからの猫砂なるものを買ってきたときには猫砂まで食べてしまっていた。
びっくりして即処分した。
最近は妻が緑豆(?)を窓際で育てていたのだがむしゃむしゃ食べられてしまった。
猫はご飯を皿に多めに出しておけば自分で適切な量を食べるものだと思っていたのだが、うちの猫は出せば出しただけモリモリ食べるのであっという間に太ってしまった。
今は量を調節して適性体重を何とか保ってます。
***********************************
さて、FizzBuzz問題。
前回の解答はあまりにもひどいのでもう少しまじめにやってみた。
ただ、普通に書くと簡単すぎるのでif文を使わないという条件で書いてみた。
#include <stdio.h>
int main()
{
char str[3][8];
sprintf(str[1],"Fizz");
sprintf(str[2],"Buzz");
str[0][0] = '¥0';
for(int i=1;i<=100;i++)
{
printf("%s%s%c%c%c¥n",str[i%3==0],str[(i%5==0)*2],(i%3!=0)*(i%5!=0)*((i/100)%10+'0'*((i/100)%10!=0)),(i%3!=0)*(i%5!=0)*((i/10)%10+'0'*((i/10)%10!=0)),(i%3!=0)*(i%5!=0)*((i/1)%10+'0'*((i/1)%10!=0)));
}
return 0;
}
C言語の条件式は真のとき1、偽のとき0を返すことを利用している。
例えばi%3==0はiが3の倍数のとき1となる。
printfの後半はもう少しややこしい。
(i/100)%10は100の桁を抜き出している。10の桁なら(i/10)%10とする。
asciiコードでは'0'〜'9'が連続した値で定義されていることを利用する。
桁を抽出した結果に'0'を足すことで数を文字に変換している。
わざわざ文字に変換しているのは、最上位の桁が0のときはnull文字を出力して画面にごみが現れないようにするためだ。
こうしないと1が001などと表示されてしまう。
まあ、これくらいのコードきっと誰かが既に書いているだろうけど。中々面白かった。
ちなみに、前回はC言語のコードを生成するプログラムを作ったが、実は結構そういう使い方をすることは多い。
C言語のコードを生成することはあまりないが、windowsのバッチファイルの生成によく使う。
例えば0.txt、1.txt・・・10.txtに処理を加えるバッチ処理をしたいとする。
バッチファイルの構文にはfor文もあるのだが、構文を記憶していないため調べるのも面倒だ。
そういうときはC言語でちょちょいとバッチファイルを生成するプログラムを書く。
ファイルの中身は汚いが動作は同じだ。
あとは色々なソフトのマクロファイルの作成などにも使う。
プログラミング言語をひとつ覚えておくと何かと便利だ。
おからの猫砂なるものを買ってきたときには猫砂まで食べてしまっていた。
びっくりして即処分した。
最近は妻が緑豆(?)を窓際で育てていたのだがむしゃむしゃ食べられてしまった。
猫はご飯を皿に多めに出しておけば自分で適切な量を食べるものだと思っていたのだが、うちの猫は出せば出しただけモリモリ食べるのであっという間に太ってしまった。
今は量を調節して適性体重を何とか保ってます。
***********************************
さて、FizzBuzz問題。
前回の解答はあまりにもひどいのでもう少しまじめにやってみた。
ただ、普通に書くと簡単すぎるのでif文を使わないという条件で書いてみた。
#include <stdio.h>
int main()
{
char str[3][8];
sprintf(str[1],"Fizz");
sprintf(str[2],"Buzz");
str[0][0] = '¥0';
for(int i=1;i<=100;i++)
{
printf("%s%s%c%c%c¥n",str[i%3==0],str[(i%5==0)*2],(i%3!=0)*(i%5!=0)*((i/100)%10+'0'*((i/100)%10!=0)),(i%3!=0)*(i%5!=0)*((i/10)%10+'0'*((i/10)%10!=0)),(i%3!=0)*(i%5!=0)*((i/1)%10+'0'*((i/1)%10!=0)));
}
return 0;
}
C言語の条件式は真のとき1、偽のとき0を返すことを利用している。
例えばi%3==0はiが3の倍数のとき1となる。
printfの後半はもう少しややこしい。
(i/100)%10は100の桁を抜き出している。10の桁なら(i/10)%10とする。
asciiコードでは'0'〜'9'が連続した値で定義されていることを利用する。
桁を抽出した結果に'0'を足すことで数を文字に変換している。
わざわざ文字に変換しているのは、最上位の桁が0のときはnull文字を出力して画面にごみが現れないようにするためだ。
こうしないと1が001などと表示されてしまう。
まあ、これくらいのコードきっと誰かが既に書いているだろうけど。中々面白かった。
ちなみに、前回はC言語のコードを生成するプログラムを作ったが、実は結構そういう使い方をすることは多い。
C言語のコードを生成することはあまりないが、windowsのバッチファイルの生成によく使う。
例えば0.txt、1.txt・・・10.txtに処理を加えるバッチ処理をしたいとする。
バッチファイルの構文にはfor文もあるのだが、構文を記憶していないため調べるのも面倒だ。
そういうときはC言語でちょちょいとバッチファイルを生成するプログラムを書く。
ファイルの中身は汚いが動作は同じだ。
あとは色々なソフトのマクロファイルの作成などにも使う。
プログラミング言語をひとつ覚えておくと何かと便利だ。