カレー問題

えー、たいへんひさしぶりの更新です。
年度末繁忙期の現実逃避に、結城浩さんのCodeIQのカレー問題をエクセルだけで解いてみました。

解答に書いたメモを転載。本当は実際のエクセルファイルの絵もあるといいのですが、とりあえず。

      • -

これならExcel表計算ソフト)だけでも出来そうだなと取りかかりましたが,30分では終わらず1時間ぐらいかかってしまいました。

  • blendlist.txtをExcelで開く。スペース区切りで2列に分け,上に1行挿入して列名(spice1,spice2)を入れる。
  • (このままpivot集計をしてみたらspice1とspice2が交換可能であることに気づいた)
  • spice1のリスト[A2:A2183]の下のセル[A2184]にspice2[B2:B2183]をコピーして貼り付け,spice2の下[B2184]にspice1[A2:A2183]を追加。
  • Excel2003の「データ→ピボットテーブルとピボットグラフ レポート」で新しいワークシート(Sheet1)に行タイトルspice1と列タイトルspice2,項目spice2の個数でピボット集計。対角線に対して対称で,blendlistに存在する組み合わせに1,ない場合は空白の表ができる。spiceの種類は128種であることがわかる。
  • ピボットテーブル[A3:DZ133](Sheet1)をコピーして新しいワークシート(Sheet2)の左上セル[A1]に形式を選択して貼り付け(数値)。あとの操作をやりやすくするため。
  • 出現頻度が一番高いspiceを探すため,「総計」列の最大値を探すと44が2つある。とりあえず"Minnlabic"を最初の「指標種」とする。
  • Sheet1の"Minnlabic"の行(58番目なのでピボットテーブルの行62)を表の下[Sheet1!行135]にコピーして貼り付け。
  • spiceの名前[A5:A132]をコピーして[A137]に値貼り付け。
  • [B137]に"=B5*B$135"を入力,コピーして[B137:DY264]に貼り付け。[DZ137]に"=sum(B137:DY137)"と入力。コピーして[DZ138:DZ264]に貼り付け。Minnlabicとの組み合わせでポイントになるspiceを共通に持っている数を数える。(28以上と3以下の両極端に分かれるぞ。しめしめ)
  • Sheet1の[DZ137:DZ264]をコピーしてSheet2の[EA3]のセルに数値で貼り付け。また[A2]のセルに形式を選択して貼り付け(数値,「行列を入れ替える」にチェック)。
  • Sheet2の表[A3:EA130]を選択,EA列の降順で並べ替え。続けて[A1:DY130]を選択。並べ替え→オプション「列単位」で行1の降順で並べ替え。
  • この時点で表の対角線に対する"1"の並び方でblendlistが大きく3つのグループになることがわかる。
  • "Minnlabic"と相性のよいスパイスを含むブレンドが28以上となるスパイスのグループをグループ1とする。グループ1に含まれないスパイスについて,例えば"Anewatry"を次の「指標種」に選び,同様の処理を繰り返すことが可能。
  • しかし,並べ替えた表を見ると,"Minnlabic"と相性のよいスパイスを含むブレンドが0のスパイスの中でLoveaniic, Masema, Peregrama, Rinawatry, Xuomaの5種が,「"Minnlabic"と相性のよいスパイスを含むブレンドが1〜3」のスパイスと相性がよく,残りは別のグループを形成することがわかるので,手作業で5種を"Minnlabic"と相性のよいスパイスを含むブレンドが0のスパイスの中でで最初に来るように並べ替えを行った。(行選択,カットして貼り付け。列選択,カットして貼り付け)
  • Group1("Minnlabic"と相性のよいスパイスを含むブレンドが28以上),Group2("Minnlabic"と相性のよいスパイスを含むブレンドが1〜3+上記5種),Group3("Minnlabic"と相性のよいスパイスを含むブレンドが0で上記5種を除く)とすると,それぞれのGroupを含む皿のカレーのブレンドのポイントは以下のようになる。
Group1 Group2 Group3
Group1 936
Group2 12 775
Group3 0 11 448
  • この際,2皿のポイントの合計を,3つのグループのうちどの1つを別の皿にするかで検討すると,Group3を別の皿にする場合がブレンドリスト中の11の組み合わせだけが達成されないことになり,最大である。
  • よってGroup1とGroup2に含まれるスパイスの名前(並べ替えた表の[B2:CQ2])を別のエクセルに貼り付けて昇順に並べ替え,テキストファイルで保存。
  • 保存したテキストファイルのタブをスペースに置換。