読者です 読者をやめる 読者になる 読者になる

give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

CodeIQに「ビンゴカード作成問題」を出題しました。みなさんの挑戦をお待ちしてます!

お知らせ

前回の出題からかなり間が空きましたが、本日CodeIQに新しいプログラミング問題を出題しました。


挑戦者求む!【Ruby】Rubyでビンゴカードを作ろう! by 株式会社ソニックガーデン 伊藤 淳一│CodeIQ
f:id:JunichiIto:20150209100505p:plain


前回と同様、僕が赤ペン先生になってみなさんのコードを評価させてもらいます。
自慢ではありませんが、前回は「伊藤さんのフィードバックは丁寧でとても勉強になった」という声をちらほら聞いています。(あ、やっぱり自慢だった)


「自分の書いた自信作を伊藤さんに見てもらいたい」という方はぜひチャレンジしてみてください!

問題の詳細

今回出題したのは「ビンゴカード作成問題」です。
その名の通り、ビンゴカードを自動生成するRubyプログラムを作ってもらう問題です。


問題文は以下のようになっています。




【イントロダクション】
先日、子どもたちが100円ショップでビンゴカードを買ってきて、家族でビンゴをしました。

ふとビンゴカードの袋を見てみると、数字の並びについて解説が書いてありました。

カードの各列の数字は以下のようなルールで印刷されています。

  • B:1~15のどれか
  • I:16~30のどれか
  • N:31~45のどれか
  • G:46~60のどれか
  • O:61~75のどれか

今まで僕は完全にランダムで並んでいると思っていました。
そこで家族に「ビンゴカードってこんなルールで数字並んでるんやって!」と言ってみたら、

「え?知らんかったん?」(妻)

「え、 みんな知ってたの?」(僕)

「知ってた」(息子8歳)

「知ってた」(娘6歳)

と家族全員から冷たい返事が返ってきました・・・。

う~~~、悔しいっっっっっ!!!

というわけで、この悔しさをバネにしてプログラミング問題を作ってみることにしました。

名付けて「ビンゴカード問題」です!(そのまんまやん)


【作成するプログラムの仕様】

ビンゴカードを文字列として出力する、Bingo.generate_card メソッドを作成してください。

以下は出力例です。

 B |  I |  N |  G |  O
13 | 22 | 32 | 48 | 61
 3 | 23 | 43 | 53 | 63
 4 | 19 |    | 60 | 65
12 | 16 | 44 | 50 | 75
 2 | 28 | 33 | 56 | 68

Bingo.generate_card メソッドの出力結果は上で述べた数字のルールのほかに、以下の仕様を満たす必要があります。

  • 毎回異なるカードを生成します。
  • 各列はパイプ(|)で区切ります。
  • 数字や"BINGO"の文字は右寄せで出力します。
  • 真ん中(FREEになる場所)はスペースを出力します。

どうですか?簡単そうでしょ??

実際、「動くだけ」のプログラムを作るのであればプログラミング初心者でも何とかなると思います。
ただし、この問題はCodeIQのプログラミング問題です。

ただ動くだけでなく、Rubyらしい、シンプルでスマートな解答を目指しましょう!




・・・というのがビンゴカード作成問題です。


問題文にも書いたとおり、難易度的には初心者向けだと思います。
ただし、ロジックを考えるスキルやRubyのAPIに関する知識次第でコードの長さや読みやすさがかなり変わってくると予想しています。
そういう意味では初心者だけでなく上級者の方も楽しめる問題になっているはずです。

今回もテストコード付きの解答テンプレートを用意しています

前回と同様に、今回も解答テンプレートを用意しました。
テンプレートはCodeIQの問題文からダウンロードできます。
解答テンプレートにはRSpecで書いたテストコードがあるので、これが全てパスするコードが書けたらクリアとなります。


自分の書いたコードが合っているのか間違っているのか、テストを走らせるだけでわかるなんて楽チンですね~。
今までテストコードを書いたコードを書いたことがない、というプログラミング初心者の方はこれを機にテストコードの書き方を勉強しましょう!


勉強する際は以前僕がQiitaに書いたRSpecの入門記事を参考にしてみてください。

 

最初の解答をオーバーライドするのが解答のコツ(?)

前回出題した「カラオケマシン問題」は思った以上に応募が集まり、すぐに定員が埋まってしまいました。
もしかすると今回も早々に定員に達してしまうかもしれません。


応募は早い者勝ちなので、単純に考えるとさっさと書いてさっさと提出するのが一番ということになりますが、それだとじっくりリファクタリングする時間がありません。
かといって、リファクタリングに時間をかけすぎると、提出する前に定員に達してしまう可能性があります。


そこでオススメするのは複数回にわけて解答を提出する方法です。
テストがすべてパスした時点でいったん提出し、そのあとリファクタリングして2回目を提出するというふうにすると、早く提出できますし、納得がいくまでリファクタリングすることもできます。


こちらは解答を受け取っても2~3日は採点しないままおいておくので、その間にじっくりリファクタリングしてください。

まとめ

というわけで今回はCodeIQに出題した「ビンゴカード作成問題」を紹介しました。
前回と同様、優秀者の方はこのブログで解答コードを紹介させてもらうと思っています。
みなさんからシンプルでスマートなコードが届くことを楽しみにしています!


挑戦者求む!【Ruby】Rubyでビンゴカードを作ろう! by 株式会社ソニックガーデン 伊藤 淳一│CodeIQ
f:id:JunichiIto:20150209100505p:plain


あわせて読みたい

前回の「カラオケマシン問題」関連のエントリです。
こちらもあわせてどうぞ。


CodeIQに「カラオケマシン問題」を出題しました。みんなチャレンジしてね! - give IT a try


「CodeIQ ベストコード発表会 ~最もエレガントにカラオケマシン問題を解いた挑戦者は誰だ!?~」を放送しました #sg_study - give IT a try


予備知識が無いと理解しづらかったり、意味づけが人によって異なったりするようなプログラム設計は避けるべき、というお話 #sg_study - give IT a try