この記事は何
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)