ホワイトデー4個セットの組み合わせを洗い出す
大阪のカヌレ専門店「カヌレ堂」では、8種類のカヌレを販売しており、1個単品から購入できる。*1
ところがホワイトデー*2期間は単品では購入できず、8個, 16個, 24個の箱入りか、4種ランダムのセットしか販売していなかった。*3
4種入りは 600円で販売されており、購入してみるとセットに含まれるカヌレ 4個の合計金額はちょうど 600円であった。*4
つまり本当にランダムではなく、合計金額が 4個で 600円になる組み合わせが何種類かあるようだ。
堂島店*5での組み合わせを全て表示してみた。
menu = <<EOF.lines.map{|l| l.chomp.split(/\s+/)}.each_with_object({}){|(v,k), _| _[k] = v.to_i} 120 しろ 140 くろ 140 ほうじ茶キャラメル 150 きなこ五穀 150 抹茶ピスタチオ 170 千葉落花生 160 ベリーベリー 170 ばなナッツ EOF combinations = menu.keys.combination(4).to_a set4p = combinations.select{|caneles| caneles.map{|c| menu[c]}.sum == 600} set4p.size # => 12 combinations.size # => 70 set4p # => [["しろ", "くろ", "千葉落花生", "ばなナッツ"], # ["しろ", "ほうじ茶キャラメル", "千葉落花生", "ばなナッツ"], # ["しろ", "きなこ五穀", "千葉落花生", "ベリーベリー"], # ["しろ", "きなこ五穀", "ベリーベリー", "ばなナッツ"], # ["しろ", "抹茶ピスタチオ", "千葉落花生", "ベリーベリー"], # ["しろ", "抹茶ピスタチオ", "ベリーベリー", "ばなナッツ"], # ["くろ", "ほうじ茶キャラメル", "きなこ五穀", "千葉落花生"], # ["くろ", "ほうじ茶キャラメル", "きなこ五穀", "ばなナッツ"], # ["くろ", "ほうじ茶キャラメル", "抹茶ピスタチオ", "千葉落花生"], # ["くろ", "ほうじ茶キャラメル", "抹茶ピスタチオ", "ばなナッツ"], # ["くろ", "きなこ五穀", "抹茶ピスタチオ", "ベリーベリー"], # ["ほうじ茶キャラメル", "きなこ五穀", "抹茶ピスタチオ", "ベリーベリー"]]
70通りの組み合わせの中で 600円になるのは 12通りであった。
全ての種類が使われているのか。自分の好きなカヌレが 4種セットでは買えないとなると悔しいではないか。*6
caneles = set4p.flatten.sort
caneles.uniq.size # => 8
全8種類が使われているようだ。
しかし偏りはどうか。特定の種類だけ多く含まれると、それが品切れすると 4種セットが組めなくなる。
puts menu.keys.map{|c| "%4d %s" % [caneles.count(c), c]} # >> 6 しろ # >> 6 くろ # >> 6 ほうじ茶キャラメル # >> 6 きなこ五穀 # >> 6 抹茶ピスタチオ # >> 6 千葉落花生 # >> 6 ベリーベリー # >> 6 ばなナッツ
使用頻度は全て同じであった。これは偶然か。狙ってやっているならスゴイ。