ホワイトデー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 ばなナッツ

使用頻度は全て同じであった。これは偶然か。狙ってやっているならスゴイ。

*1:種類ごとに単価は異なる。1個 120円から 170円。

*2:調べてみると、日本にはホワイトデーという謎の風習があるらしい。

*3:バレンタインと異なり、お菓子を買い慣れていない客が多数訪れるため、選択肢を減らしているらしい。

*4:お得なセットではなく、4個を単品で購入するのと同額。

*5:カヌレ堂は桜川本店と堂島店の2店舗がある。

*6:ランダムなので確実に買うことはできないが。