今日はこちらのブログのビンゴ作成問題に挑戦しました!!!!!
コードはこちらです!
# ビンゴを作成しました。
# 左の列から1~15,16~30,31~45,46~60,61~75からランダムに抽出し、真ん中は空白にします。
RANGE_NUM = [
('1'..'15'), ('16'..'30'), ('31'..'45'), ('46'..'60'), ('61'..'75')
]
class Bingo
def generate_card
puts %q! B| I| N| G| O|!
# 配列の各要素からランダムに抽出する挙動を5回繰り返します。
# 3列目、3行目(真ん中)の時は空白にします。
1.upto(5) { |n|
RANGE_NUM.each_with_index { |range, index|
next print choose_num(range) unless n == 3 && index == 2
print '|'.rjust(4)
}
puts
}
end
def choose_num(range)
(range).to_a.sample.rjust(3) + '|'
end
end
苦労した点
今回もどうやってコードの重複を減らすかに苦労しました。
ビンゴを作ること自体はさほど難しくありませんでした。
しかし、ちょうど中心に空白を作らなければいけない為、同じような繰り返し式が何回も書かなければならなくて、これをどうまとめるか悩みました。
uptoとwith_indexの組み合わせを今回は使ってみました!
追記
コメントで頂いた意見とtransposeメソッドを用いてリファクタリングしてみました。
# ビンゴを作成しました。
# 左の列から1~15,16~30,31~45,46~60,61~75からランダムに抽出し、真ん中は空白にします。
class Bingo
attr_reader :numbers
def initialize
@numbers =
(1..75).each_slice(15).map { |array|
array.sample(5)
}
@numbers[2][2] = ''
end
def to_s
puts %q! B| I| N| G| O|!
@numbers.transpose.each { |array|
array.each { |n|
print n.to_s.rjust(3) + '|'
}
puts
}
end
end