LoginSignup
3
4

More than 3 years have passed since last update.

rubyでビンゴしようよ!!!!

Last updated at Posted at 2019-05-08

今日はこちらのブログのビンゴ作成問題に挑戦しました!!!!!

コードはこちらです!

# ビンゴを作成しました。
# 左の列から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
3
4
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4