2011年12月5日月曜日

Nimrod で FizzBuzz を書こう!

全国の Nimrod ファンのみなさんこんにちは。
Nimrod Advent Calendar の 4日目を担当している、@takano32 a.k.a. TAKANO Mitsuhiro です。3日目の記事は @esehara さんの オフサイドルールこそが正義である です。ぜひ、こちらもご覧ください。

今日はサンプルのプログラムとして有名な FizzBuzz をNimrod で書いてみたときのことを紹介したいと思います。

まず、FizzBuzz というのは
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」(Bizz Buzz の場合は 「Bizz」)、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 (Bizz Buzz の場合は 「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。  
Wikipediaより引用
というルールのゲームです。これをプログラムで出力します。

私がはじめに Nimrod で書いた FizzBuzz はこんなものでした。そして、 exampels のひとつとして取り込んでもらうために pull request しました。

# Fizz Buzz program
var f = "Fizz"
var b = "Buzz"
for i in 1..100:
if i mod 15 == 0:
echo f & b
continue
if i mod 5 == 0:
echo b
continue
if i mod 3 == 0:
echo f
continue
echo i
view raw fizzbuzz.nim hosted with ❤ by GitHub

Commit 0398a3c616d3de11f779ac36c3b0ef957052a814 to hametsu/Nimrod - GitHub
このプログラムにはいくつか問題がありました。それを Araq はとても親切に指摘してくれています。
Use 'elif' instead of 'continue'. Use 'echo a, b' instead of 'echo a & b'. Use 'const' instead of 'var'. Sorry for the nitpicking, but people like examples to be idiomatic nimrod code ;-).
日本語にすると以下のようなかんじでしょうか。
'continue' の代わりに 'elif' を使って、'echo a & b' の代わりには 'echo a, b' を使おう。あと、'var' の代わりに(変化しない変数なのだから)'const' を使うといいよ。 examples は多くの人が Nimrod の理想的なコードとして参考にするので細かい指摘ばかりになっちゃった(^−^)
とても親切に細かいところまでレビューしていただきました。その後、数度のやり取りを経て、以下のようなコードとなりました。

# Fizz Buzz program
const f = "Fizz"
const b = "Buzz"
for i in 1..100:
if i mod 15 == 0:
echo f, b
elif i mod 5 == 0:
echo b
elif i mod 3 == 0:
echo f
else:
echo i
view raw fizzbuzz.nim hosted with ❤ by GitHub

このコードは取り込まれ、現在、Nimrodのexamples以下にあります!みなさんもぜひexamplesになりそうなコードなどを書いてコミットしてみてはいかがでしょう。
5日目の記事はsyanbi a.k.a. @xga さんの記事になります。お楽しみに!

0 件のコメント:

コメントを投稿