膨大な組み合わせを考えるの面倒だったのでなんとかならんかと思ってたら、Rubyに自動で全ての組み合わせを出力してくれる機能があったのでやってみました。
環境
- OS: Ubuntu 12.04 64bit
- Ruby: ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
combination とは
instance method Array#combination
サイズ n の組み合わせをすべて生成し、それを引数としてブロックを実行します。
試しに使ってみる
なんとなく新幹線とバスの組み合わせを書いてみました。
comb.rb1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
def num_fmt(num) num.to_s.reverse.gsub( /(\d{3})(?=\d)/, '\1,' ).reverse end
data = { 1 => {:name => "新幹線(名古屋) ", :price => 10780}, 2 => {:name => "高速バス(名古屋)", :price => 3500}, 3 => {:name => "新幹線(新大阪) ", :price => 14050}, 4 => {:name => "高速バス(大阪) ", :price => 5500} } num = [1, 2, 3, 4] num.combination(2){|a, b| str = "#{data[a][:name]}: ¥#{num_fmt(data[a][:price]).to_s}" str << " + " str << "#{data[b][:name]}: ¥#{num_fmt(data[b][:price]).to_s}" str << " = " str << "¥#{num_fmt((data[a][:price].to_i + data[b][:price].to_i)).to_s}" puts str }
|
Terminal1 2 3 4 5 6
| 新幹線(名古屋) : ¥10,780 + 高速バス(名古屋): ¥3,500 = ¥14,280 新幹線(名古屋) : ¥10,780 + 新幹線(新大阪) : ¥14,050 = ¥24,830 新幹線(名古屋) : ¥10,780 + 高速バス(大阪) : ¥5,500 = ¥16,280 高速バス(名古屋): ¥3,500 + 新幹線(新大阪) : ¥14,050 = ¥17,550 高速バス(名古屋): ¥3,500 + 高速バス(大阪) : ¥5,500 = ¥9,000 新幹線(新大阪) : ¥14,050 + 高速バス(大阪) : ¥5,500 = ¥19,550
|
これは便利。処理の他にもCSVとかにしてExcelで読み込ませるとかで使えそう。
以上です。
高橋 征義,後藤 裕蔵 SBクリエイティブ 2016-02-26