LoginSignup
0
0

Ruby芸160チャレンジ(#22)配列同士を組み合わせた要素生成とランダムシャッフル

Posted at

この記事は何

shellgei160を通じて言語習得 Advent Calendar 2023に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

実行環境など

  • Docker image: ruby:3.0.2
  • 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下にanswer-rubyディレクトリを作り、その中に解答となるファイルを作成していきます。

今回のテーマ

$ echo {mail,blog,eng,www,help,sub,ns,}.{robotics,ojisan,yamada,ueda,nakamura,tashiro,blacknon}.{co.jp,com,tech,org,jp,go.jp,com.tw,asia} | tr ' ' '\n' | sort -R | head -n 100 | sed 's/^\.//'

3つの配列の値を組み合わせたメールアドレスを生成し、ランダムに100個を取り出す処理です。組み合わせの中には.robotics.comのように先頭が空欄のものがあるので、それはsed 's/^\.//'で先頭の.を取り去ります。

first = ['mail', 'blog', 'eng', 'www', 'help', 'sub', 'ns', '']
second = %w[robotics ojisan yamada ueda nakamura tashiro blacknon]
third = %w[co.jp com tech org jp go.jp com.tw asia]

Random.srand(2022)

all = first.product(second, third).map { |elem| elem.join('.') }.shuffle
puts(all[...100].map { |elem| elem.gsub(/^\./, '') })

所感

  • 配列要素の組み合わせにはarray1.product(array2, array3, ...)が使える。便利。
  • 配列のランダムソートにはshuffleが使える。
  • 乱数を固定するにはRandom.srand(seed_int)
0
0
1

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