はじめに
前回に引き続き、Ruby学習のアウトプットとして今回はランダムにグループ分けをするプログラムを作成しました。
上記の内容について、備忘のためにメモ書きを残しておくことにします。
仕様
- 前提
- A、B、C、D、E、Fという6人のグループがあった
- 定期的に、6人でLINEのグループ通話をしている
- 課題
- 6人でLINEのグループ通話は会話しづらい
- 要件
- 3人と3人、または2人と4人にランダムにグループ分けを行いたい
- 補足
- 本プログラムは実行するたびに、結果が変わるようにすること
- 表示結果はアルファベット順に並び替えること
アウトプットイメージ
アウトプットイメージは、以下の通りです。
$ ruby random.rb
["B", "C"]
["A", "D", "E", "F"]
検討
まずは、プログラムの処理の流れを言語化します。
- 6人グループの配列を作成する
- 1.で作成した配列をランダムに並び替えて、3-3 または 4-2 に分割する
- 2.の結果をアルファベット順に並び替えて出力する
上記をコードで書くと、次のようになります。
random.rb
arr = %w[A B C D E F].shuffle!
num = rand(2)
if num == 0
result = arr.each_slice(3).to_a
p result[0].sort, result[1].sort
elsif num == 1
result = arr.each_slice(4).to_a
p result[0].sort, result[1].sort
end
出力結果もアウトプットイメージと同じであるため、問題なさそうです。
リファクタリングする
以下の部分について、num
に3か4が入るようにすれば条件分岐が不要そうです。
arr.each_slice(num).to_a
リファクタリングすると、コードが少し短くなりました。
random.rb
arr = %w[A B C D E F].shuffle!
num = rand(3..4)
result = arr.each_slice(num).to_a
p result[0].sort, result[1].sort
出力系メソッドの違い(puts、print、p)
今回は出力のためにp
メソッドを利用しましたが、出力系のメソッドは複数あり混乱しやすいため表で整理しておきます。
補足となりますが、p
メソッドを利用した理由は以下2点となります。
- 出力後に改行があるため
- 配列の要素ごとに改行して表示されないため
メソッド名 | 出力後の改行 | 配列の表示 | 文字列変換 | 戻り値 |
---|---|---|---|---|
puts | あり | 要素ごとに改行 | to_s | nil |
なし | 改行しない | to_s | nil | |
p | あり | 改行しない | inspect | 引数のオブジェクト |
引用:プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plus)
おわりに
本課題に取りかかる前は、一見簡単そうに見えましたが実際にやってみると難しかったです。
コードの行数は少ないですが、多くの学びがありました。