bbz

fizzbuzz

_
previous | next | edit
1: 2007/06/09(Sat) 04:24
fizzbuzz問題というのがある。
非常に初歩的なプログラムなのだが、かけない人が多いという。
私が書きかけたのがこれだ。
2: 2007/06/09(Sat) 04:26

#include <stdio.h>
int main(void) {
for (i=1;i<=100;i++) {
if (mod(i,3)=0) then
printf("Fizz")
else
if (mod(i,5)=0) then
printf("Buzz);
printf(i,"%d")
}

・・・
3: 2007/06/09(Sat) 04:27
まあプログラマではないので・・・
でもくやしかった。

ある人の書いた簡潔なものが下記である・・・・
しかし、これは間違っているんだよね。

main()
{
int i=0;
while(++i<=100){
printf("%3d %s%s\n",i,(i%3)? "":"Fizz",(i%5)?"":"Buzz");
}
}
4: 2007/06/09(Sat) 04:29
「1から100までの数字で、3の倍数ならFizz、5の倍数ならBuzz、3と5の公倍数ならFizzBuzz、それ以外は数字を表示する」というのが問題である。
>>3 は3と5の倍数のときにも数字が表示されているので不正解だ。
きっとこういうものも含まれているんだね、書けない、という人には。
5: 2007/06/09(Sat) 04:34
この問題はそんなに簡単ではないと思う。
さっきの例のように常に数字を表示してもよいなら簡単であるが、
3または5の倍数のときには数字は表示しない、というのがクセモノである。

3の倍数ならFizz
5の倍数ならBuzz

はそのまま並列に聞けばよい。公倍数ならそのままでFizzBuzzになる。


6: 2007/06/09(Sat) 04:34
3と5の公倍数ならFizzBuzz 
 else
  3の倍数ならFizz
   else
    5の倍数なら Buzz
       else
        数字を表示

としても不正解ではないが、ダサい。
7: 2007/06/09(Sat) 04:36
しかし、公倍数かどうかを聞かないと、数字を表示するかどうかの判定が難しい。
そこで私が考えたのがこうだ

n=0
3の倍数なら Fizz, n=n+1
5の倍数なら Buzz, n=n+1

n=0 なら 数字を表示
8: 2007/06/09(Sat) 04:40
まあダサさは大差ないのか。
なんか>>7の方がいいように思えてきた。
数を増やして時間を測ってみればいいのか。
やってみるか?
9: 2007/06/09(Sat) 05:21
公倍数かどうか聞くやつ

[pre]
main()
{
int i=0;
while(++i<=1000000){

if(i%3>0 && i%5>0) {
printf("%d",i);
}
else {
if(i%3==0) printf("Fizz");
if(i%5==0) printf("Buzz");
}

printf("\n");
}
}
10: 2007/06/09(Sat) 05:22
判定用の数値を使うやつ

[pre]
main()
{
int i=0,n=0;
while(++i<=1000000){
if(i%3==0) {
printf("Fizz");
n++;
}
if(i%5==0) {
printf("Buzz");
n++;
}

if(n>0) {
printf("\n");
n=0;
}
else {
printf("%d\n",i);
}
}
}
11: 2007/06/09(Sat) 05:26
cygwinでやってみたらどっちも1分52秒。
変わらなかった。
12: 2007/06/09(Sat) 05:28
書いていて、>>11 の方が演算をするのとさらにゼロクリアもするので遅くなるかなと感じたが変わらない。
最適化されてしまうのだろうか?
13: 2007/06/09(Sat) 05:30
あと考えたのは、文字列を用意しておき、3の倍数ならFizz、5の倍数ならBuzzを代入する。文字列の長さが>0ならそのまま表示、0なら数値を表示、というもの。しかし文字列の使いかたがわからん。
14: 2007/06/09(Sat) 05:37
>>10 修正。1分40秒になった。

[pre]
main()
{
int i=0;
while(++i<=1000000){

if(i%3>0 && i%5>0) {
printf("%d",i);
}
else
if(i%3==0) printf("Fizz");
else
if(i%5==0) printf("Buzz");

printf("\n");
}
}
15: 2007/06/10(Sun) 13:09
これはどうだ?
3の倍数ならFizz {
  5の倍数ならBuzz
}
else {
5の倍数ならBuzz
       else
数字を表示
end


16: 2007/06/10(Sun) 13:10
うちに帰ったら測ってみます。>>15と同じになりそうな気がする。
17: 2008/02/28(Thu) 03:17
ある有名な人が書いたもの。

perl -le 'print $_%15?$_%5?$_%3?$_:Fizz:Buzz:FizzBuzz for(1..100)'
18: 08/06/18(Wed) 01:59
世界のナベアツのあのギャグ、絶対fizzbuzzからインスパイアされたと思うんだけど。
ナベアツがfizzbuzzとかに縁があるようには思えないけど・・・。たとえばそういうのが好きな作家がいて、とか・・・
でも山崎は情報処理技術者の一種を持っていてプログラミングが趣味だとかいう話もあるし、ナベアツもそうなのかも・・・
^
previous | next | edit