第7回のYokohama.rbに行ってきました。毎月恒例ですね。
Yokohama.rbは毎回決まったテーマがあるわけではなく、オープンセッション方式。初心者セッションがあるので、初心者も安心です。今回は、以前紹介したオブラブ ペアプロ大会で出された問題を解くことにしました。
第一問。スペアとストライクを考慮しない計算
まず、問題1。
ボーリングのスコアを計算してください。ここでは、問題を簡単にするためにスペアとストライクの計算はしなくていいものとします。
というもの。これは簡単。Arrayにあるinjectメソッドを使うのがRubyらしいかな。
a = [1,4,2,8,5,0,10,0,0,4,5,5,2,0,6,1,10,0,10,5,5] p a.inject(0){|r,i| r+i}
が解答例になるかと。Ruby1.8.7以降だと @dan5ya さんが書かれた次のようなコードが書ける。
def score(pins) pins.inject(&:+) end pins = [1, 4, 2, 8, 5, 0, 10, 0, 0, 4, 5, 5, 2, 0, 6, 1, 10, 0, 10, 5, 5] p score(pins)
という風にかける。
ちなみに、Rubyのリファレンスマニュアルを見ると、injectの項に合計の計算の例がそのまま載っている。
第二問。ストライクとスペアを考慮する。
第二問は
スペアとストライクのスコアも正しく計算できるようにしてください
とのこと。
これはちょっと難しい。ボーリングのルールがわかってないと厳しいかな。
私もはまりましたが、注意点はストライクの取り扱い。
- ストライクを出した場合、続く2投で倒した本数が加算される。つまり、次の東京もストライクだった場合はさらにその次のフレームで倒したピンの本数も加算される。
私が書いたプログラムはここに。
yokohama.rbの場では @dan5ya さんが書かれたコードを紹介します。
書かれたコードは、問題1で求めた合計値に対して、ストライクやスペアで得られた点(ボーナス点)を加算する形。ボーナス点を score_strike_spare というメソッドで求めている。
他にも同じ問題は、 @setoazusa さんと @publichtml さんが解かれてました。ここではリンク紹介のみ。すみません。コードの中身は読みきれませんでした。
- @setoazusaさんのコード
- @publichtmlさんのコード
問題3。途中経過でも計算できるようにする
問題3は、ボーリングのスコアを途中段階でも計算できるようにしてください。また、すべてのピン数をまとめて渡さず、一回ずつ投票できる旅に倒したピンの数を渡すようにしてください。という問題。
ベースは問題2で書かれたコード。これまで固定で書かれていたゲーム数を配列pinsのサイズに応じて求めている(変数gamesのところ)。それができればほとんどいじることはない。う〜〜ん、綺麗ですね。
学んだこと
今回は、いろんなサービスがあることを知りました。コード共有サイト。githubのアカウントを持っている人だとしたら、gistってものがおすすめ。
gist以外にも似たようなサービスがあります。例えば、codepad。これは実際実行結果まで出してくれる。
codepadはJavaが実行できないので、他にないかな?って探していたら、ideone.comってものがJavaの貼付け・実行ができるようです。両方共Rubyは動く。けど、codepadはRubyのバージョンが1.8.6。ideone.comはRubyのバージョンが1.9.2なので、そこで使い分けてもいいかな。
さぁて、来週のyokohama.rbは?
5月7日(土)らしいです。お楽しみに。