koheitakahashiのブログ

2020.07.01にプログラマーとして生を受けた私が学んだことや、日常について徒然に書いていきます。

ビンゴカード作成問題に取り組みました

はじめに

今週は勉強会に参加させていただき、自分のRuby力のなさを痛感しました💦

そこで、ruby力を高めたいという思いから、@hiroshagureさんと一緒にビンゴカード作成問題に取り組みました。

ビンゴカード作成問題はJunichiItoさんのブログから、引用させていただきました。

blog.jnito.com

実際のコーディングでは、20分取り組んで、その後進捗を共有。意見を交換し合い、再度取り組むというサイクルで2人でやってみましたが、普段複数人で一つの課題に向けてプログラミングをしたことがなかったので、とても新鮮で面白い体験でした😆

そして、今回は自分がどう考えてコードを書いたのかを残しておくために、YouTubeにライブコーディング動画をアップしました(予めある程度完成したコードを用意しているので、しっかりしたライブコーディング動画とは言えませんが💦)

なんちゃってライブコーディング動画

www.youtube.com

実際に書いたコード

gistのURL↓

https://gist.github.com/NMP300/4a25e5c22fb610b2594db7f0df337c59

# frozen_string_literal: true

class Bingo
  def numbers
    # 改善点:DRY原則に反している
    row_b = (1..15).to_a.sample(5)
    row_i = (16..30).to_a.sample(5)
    row_n = (31..45).to_a.sample(5)
    row_g = (46..60).to_a.sample(5)
    row_o = (61..75).to_a.sample(5)

    row_n[2] = "  "
    [row_b, row_i, row_n, row_g, row_o]
  end

  def generate_card
    title = %w[B I N G O].map { |t| t.rjust(2) }.join("|")
    print "#{title}\n"
    numbers.transpose.each { |num| print "#{num.join("|").rjust(14)}\n" }
  end
end

bingo = Bingo.new
bingo.generate_card

改善点

コメントにも書いていますが、DRY原則に反している部分があります。動画でも説明してますが、each_sliceメソッドを使って、その後に真ん中にスペースを開けるという処理が思いつきませんでした💦

これから、解答を拝見して勉強していきたいと思います💪 また、リファクタリング案があれば、ブログコメントで教えていただきたいです

最後に

週に1本程度は動画をアップしたいと考えていましたが、中々動画に注力することができず、前回の動画からかなり間が空いてしまいました💦

ただ、このようなアウトプットをすることで、よりインプットを頑張ろうと思いました🔥

これからも就職目指して頑張っていきたいです🔥

引用させていただいたサイト

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

[2019.11.25 追記] 自分のコードをリファクタリング

Itoさんの以下の解答を見て、自分のコードをリファクタリングしました。

www.youtube.com

リファクタリング後のコードはこのようになりました。

gist.github.com

改善点の部分は、純粋に変数にしてしまって、そのあとで、真ん中を開ける処理をすれば良かったんですね💦 難しく考えすぎていました💦