##はじめに
この記事は以下のサイトにあった問題を解いてみたものです。大変に工夫の余地があるコードになってしまいましたが、一応完成したので初心者だった頃の自分をいつか省みるために作成しました。
[アウトプットのネタに困ったらこれ!?Ruby初心者向けのプログラミング問題を集めてみた(全10問)]
(https://blog.jnito.com/entry/2019/05/03/121235)
##問題
上記サイトより引用
1から75までの数字をランダムに配置して、ビンゴカードを作成するプログラミング問題です。
ただし、実際のビンゴカードのルールに沿って、各列は以下のような仕様で数字を出力する必要があります。
B:1~15のどれか
I:16~30のどれか
N:31~45のどれか
G:46~60のどれか
O:61~75のどれか
CodeIQに「ビンゴカード作成問題」を出題しました。みなさんの挑戦をお待ちしてます!
に詳細が記されています。
##完成したコード
class Bingo
def self.generate_card
array = (1..15).to_a
b_num = array.sample(5)
array = (16..30).to_a
i_num = array.sample(5)
array = (31..45).to_a
n_num = array.sample(5)
array = (46..60).to_a
g_num = array.sample(5)
array = (61..75).to_a
o_num = array.sample(5)
puts " B | I | N | G | O"
5.times do |i|
unless i == 2
puts "#{b_num[i].to_s.rjust(2)} | #{i_num[i]} | #{n_num[i]} | #{g_num[i]} | #{o_num[i]} "
else
puts "#{b_num[i].to_s.rjust(2)} | #{i_num[i]} | | #{g_num[i]} | #{o_num[i]} "
end
end
end
end
Bingo.generate_card
##手順
まず、それぞれの列の数値を取得することから始めようと考えました。例えばBの列には、1~15の範囲で、違う数字をランダムに5つ選ぶ必要があります。これを、配列に対して使うsampleメソッドを利用して実現しました。
array = (1..15).to_a
b_num = array.sample(5)
p b_num
実行結果
>ruby b_num
[7, 3, 14, 15, 10]
これを、5列分用意することで必要な数値を準備しました。(改善の余地がありそうなポイント1)
次に考えたのは、数値を1行ずつ表示することです。ここで注意するべきなのは、右詰で表示させる仕様になっていることでした。1桁の数字が出ると、Bの列の表示が崩れてしまう問題が発生しました。なので、rjustメソッドを用いてその問題を解決しています。
また、真ん中は空白にする必要があるので、それにも留意して繰り返しのメソッドを用いました。
5.times do |i|
unless i == 2
puts "#{b_num[i].to_s.rjust(2)} | #{i_num[i]} | #{n_num[i]} | #{g_num[i]} | #{o_num[i]} "
else
puts "#{b_num[i].to_s.rjust(2)} | #{i_num[i]} | | #{g_num[i]} | #{o_num[i]} "
end
end
ただこの記述の仕方だと、横に非常に長くなってしまっている点が気になります。(改善の余地ポイント2)
##感想、まとめ
現状の自分のプログラミングスキルではこのコードが限界です。いつかよりすっきりとしたコードをかけるよう精進したいと強く思える結果となりました。
##参考にしたサイト
String#rjust (Ruby 3.0.0 リファレンスマニュアル)
Array#sample (Ruby 3.0.0 リファレンスマニュアル)
Object#to_a (Ruby 3.0.0 リファレンスマニュアル)