FizzBuzz 問題を解いてみる

毛利です。

解くだけなら楽勝だろと思って手をつけてなかったんだけど、実際に解いてみた。
(スマートに書こうと思うといろいろ悩む)

FizzBuzz 問題

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

自身の回答(Perl

ダサい結果に…。

perl -e 'foreach my $i (1..100) {$s=join("", !($i % 3) ? "Fizz" : "", !($i % 5) ? "Buzz" : ""); printf("%s\n",$s !~ /^$/ ? $s : $i)}'

言い訳?しておくと "FizzBuzz" を書きたくなかった。
あと、いろんな便利な構文がさくっと出てこない。

"FizzBuzz" を使う、最初にイメージした回答(↑の回答後、文法を色々調べた)

perl -e 'print $_ % 15 ? $_ % 3 ? $_ % 5 ? $_ : "Buzz" : "Fizz" : "FizzBuzz", "\n" for(1..100)'

※2011/11/04 失敗バージョンを転記してたので修正

たぶん、以前これを見たからだろうな…(ずる)

perl -le 'print $_%15?$_%5?$_%3?$_:Fizz:Buzz:FizzBuzz for 1..100'

(@dankogai 氏の回答より)自身の宿題というか感想というか
  • オプション -l ってなんだっけ(-l[octal] enable line ending processing, specifies line terminator)
  • 文字列に "" って要らないのか…
  • for の後の括弧も要らないのかよ

自身の回答(C言語

で、今のプロジェクトは C なので C で。

cat -n FizzBuzz.c 
     1  #include <stdio.h>
     2  #include <stdlib.h>
     3
     4  #define MAX 100
     5
     6  main(void){
     7      int i;
     8      char s[3];
     9          for(i = 1; i <= MAX; i++){
    10              sprintf(s, "%d", i);
    11                  printf("%s\n", i % 15 ? i % 5 ? i % 3 ? s : "Fizz" : "Buzz" : "FizzBuzz");
    12          }
    13          return 0;
    14  }
gcc FizzBuzz.c 
./a.out 

明日、メンバーに解いてもらってみようっと。
コンパイルも含めて)


ではでは。