歯抜けの連番からなる配列をRubyのワンライナーで作ってみる。
歯抜けの連番(例えば1..5,16..20,31..35)配列を作る方法としてまず考えられるのは、Rangeを使って歯抜けではない部分を生成し、各Rangeを要素に持つ配列を作り、この配列を数値の配列に均す方法。

まず各Rangeを要素に持つ配列を作る。

[(1..5),(16..20),(31..35)]

Rangeの配列を各数値の配列に均すため、RangeをArrayにしてから、reduceとArray#concatを使う。

$ ruby -e 'p [(1..5),(16..20),(31..35)].map{|r| r.to_a}.reduce{|result, arr| result.concat(arr)}'
[1, 2, 3, 4, 5, 16, 17, 18, 19, 20, 31, 32, 33, 34, 35]

mapとreduceの書き方が冗長なので、シンプルな構文で書き直す。mapの構文についてはRubyで "&" を使うと幸せになれるらしいよ (*´Д`)ノがわかりやすい。

$ ruby -e 'p [(1..5),(16..20),(31..35)].map(&:to_a).reduce(:concat)'

今回は数値の配列を作成したが、もし文字列だった場合は次のように最後にmapをつなげる。

$ ruby -e 'p [(1..5),(16..20),(31..35)].map(&:to_a).reduce(:concat).map{|i| "No." + i.to_s}'
["No.1", "No.2", "No.3", "No.4", "No.5", "No.16", "No.17", "No.18", "No.19", "No.20", "No.31", "No.32", "No.33", "No.34", "No.35"]

ちなみに文字列の場合は特に、bashと組み合わせるとRubyオンリーだけの時よりも短く書ける。
ブレース展開で歯抜けの連番を作成し、getsで出力を読み込んでからsplitして配列にしている。

$ echo No.{1..5} No.{16..20} No.{31..35} | ruby -e 'p gets.split'
#あるいは
$ echo {1..5} {16..20} {31..35} | ruby -e 'p gets.split.map{|s| "No." + s}'

Rubyワンライナーの特性を活かし、オプション-a,-nをつけることでさらに短くもできる。-aはオートスプリットであり、プログラム全体をwhile gets ... endというループで囲った動作をしてくれる-nと共に用いることで、各行についてsplitを実行して$Fにsplitの結果を格納してくれる。

$ echo No.{1..5} No.{16..20} No.{31..35} | ruby -ane 'p $F'
#あるいは
$ echo {1..5} {16..20} {31..35} | ruby -ane 'p $F.map{|s| "No." + s}'

少し変則的に書くと、readlinesでも実現できる。同様にブレース展開で歯抜けの連番を作成し、xargs -n1で出力を各数字で改行してから、readlinesで出力を配列として読み込んでいる。

$ echo No.{1..5} No.{16..20} No.{31..35} | xargs -n1 | ruby -e 'p readlines.map(&:chomp)'
#あるいは
$ echo {1..5} {16..20} {31..35} | xargs -n1 | ruby -e 'p readlines.map{|s| "No." + s.chomp}'