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)
- ああ、chomp を自動にやってくれるってやつか。もう一つ効果があるんだな…(「行末処理の自動化」を参照)
- 文字列に "" って要らないのか…
- 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
明日、メンバーに解いてもらってみようっと。
(コンパイルも含めて)
ではでは。