1から100までの数をプリントするプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、
5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
で、自分が考えたのは以下の通り。
for(i = 1; i <= 100; i++) { if(i % 3 == 0 && i % 5 == 0) { printf("FizzBuzz"); } else if(i % 3 == 0) { printf("Fizz"); } else if(i % 5 == 0) { printf("Buzz"); } else { printf(i); } }・・・もうまるで「はじめてのC」でも読みながら書いたような感じ(苦笑)
で、上司が最初に考えたのが以下。
# 改行は私が入れてます。間違ってたらごめんなさい。
static void Main(string[] args) { for (var i = 1; i < 101; i++) Console.Write(( i % 15 == 0 ? "FizzBazz" : i % 5 == 0 ? "Fizz" : i % 3 == 0 ? "Bazz" : i.ToString())+"\n"); }
C#でした。
そしてFizzBaza出すには15の倍数って考え方でいいんですね。
i%3==0 && i%5==0とかやってる自分、はずかしい。。。
で、次に上司はやっぱりWriteLineの方が良かったと言うことで以下に訂正。
static void Main(string[] args) { for (var i = 1; i < 101; i++) Console.WriteLine(( i % 15 == 0 ? "FizzBazz" : i % 5 == 0 ? "Fizz" : i % 3 == 0 ? "Bazz" : i.ToString())); }
次に同僚の方が2つ。
for (var i = 1; i <= 100; i++) { Console.WriteLine(string.Format("{0}{1}{2}", i%3 == 0 ? "Fizz":string.Empty, i%5 == 0 ? "Buzz":string.Empty, (i%3 != 0 && i%5 != 0) ? i.ToString():string.Empty)); }
for (var i = 1; i <= 100; i++) { var val = string.Empty; if(i % 3 == 0) val += "Fizz"; if(i % 5 == 0) val += "Buzz"; Console.WriteLine(string.Empty.Equals(val) ? i.ToString() : val); }
一瞬、これだと「FizzBuzz」が出てこない気がするのだが…、と思ったら違った!
なるほどなるほど、実際にVisual Studio入れて動かしてみてわかった。
特に下の方はすごく好きw
1つ目はstring.Format("{0}{1}{2}", 条件1,条件2,条件3)ってあったとして、{0}に条件1が、{1}に条件2が、{3}に条件3の結果が入って、最後にWriteLineされるってイメージ。
2つ目はvalって変数に3で割り切れたら"Fizz"と、5で割り切れたら"Buzz"と入れるようにしてあげれば、両方引っかかるときはvalが"FizzBuzz"になるって事なのね。
で、valが空っぽだったら(string.Empty.Equals)そのままiを表示してあげると。
(解釈あってるよね?)
目から鱗だわー。
※ちなみに上司から「string.Empty.Equals(val)はstring.IsNullOrEmpty(val)」とのコメントがあり。なんでだろー?
で、同僚の1つ目のロジックを見た上司が「だったらString.Formatいらなくねぇ?」って事で以下を。
for (var i = 1; i <= 100; i++) { Console.WriteLine( (i % 3 == 0 ? "Fizz" : string.Empty) + (i % 5 == 0 ? "Buzz" : string.Empty) + ((i % 3 != 0 && i % 5 != 0) ? i.ToString() : string.Empty) ); }
なるほど。。。。
勉強になります。
0 件のコメント:
コメントを投稿