Rubyで歯抜けの連番からなる配列を作る

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

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

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

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

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

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

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

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

-Ruby
-