0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rubyでランダムにグループ分けするプログラムを作成する

Last updated at Posted at 2024-10-13

はじめに

前回に引き続き、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"]

検討

まずは、プログラムの処理の流れを言語化します。

  1. 6人グループの配列を作成する
  2. 1.で作成した配列をランダムに並び替えて、3-3 または 4-2 に分割する
  3. 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

出力結果もアウトプットイメージと同じであるため、問題なさそうです。

スクリーンショット 2024-06-30 22.05.08.png

リファクタリングする

以下の部分について、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
print なし 改行しない to_s nil
p あり 改行しない inspect 引数のオブジェクト

引用:プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plus)

おわりに

本課題に取りかかる前は、一見簡単そうに見えましたが実際にやってみると難しかったです。

コードの行数は少ないですが、多くの学びがありました。

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?