はじめに
『プロを目指す人のためのRuby入門』通称チェリー本を学習後のプログラミング初心者です。
インプットしたものを手を動かして実践してみたいなと思ったら、作者の記事を見つけました。
「アウトプットのネタに困ったらこれ!?Ruby初心者向けのプログラミング問題を集めてみた(全10問)」
この3つ目の問題を解いてみました。
他の問題はこちら
一問目:カレンダー作成問題(たのしいRuby 練習問題)
二問目:カラオケマシン作成問題
三問目:ビンゴカード作成問題
四問目:ボーナスドリンク問題
五問目:電話帳作成問題
# 問題
詳細はここから
B:1~15のどれか
I:16~30のどれか
N:31~45のどれか
G:46~60のどれか
O:61~75のどれか
というルールで次のようなビンゴカードを作ります。
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になる場所)はスペースを出力します。
# 解答例
こんな感じになりました。
```ruby
class Bingo
def self.generate_card
title = "BINGO".split("").map{|bingo| sprintf("%2s",bingo)}.join(" | ")
numbers = [*1..75].each_slice(15).to_a.map{|b| b.sample(5)}
numbers[2][2] = " "
body = []
for i in 0..4
body << numbers.map{|number| sprintf("%2s",number[i])}.join(' | ')
end
[title,body].join("\n")
end
end
さいごに
下記リンクに他の方の解答も掲載されていました。
Ruby -「ビンゴカード作成問題」の優秀作品ベスト3を発表します!
transposeメソッド
など、知らなかったので使いませんでしたが他の方の解答をみるに、まだまだリファクタリングの余地はありそうです。
ご意見等あればコメントで教えてください。
よろしくお願いします。