Rubyのcombinationを利用して全通りの組み合わせを出してみた

膨大な組み合わせを考えるの面倒だったのでなんとかならんかと思ってたら、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.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 数値を3桁でカンマ区切りする
# http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/37580
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
}
Terminal
1
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で読み込ませるとかで使えそう。

以上です。

© 2024 磁力式駆動 All Rights Reserved.
Theme by hiero