カレー問題
えー、たいへんひさしぶりの更新です。
年度末繁忙期の現実逃避に、結城浩さんの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])を別のエクセルに貼り付けて昇順に並べ替え,テキストファイルで保存。
- 保存したテキストファイルのタブをスペースに置換。