ksaitoの日記

日々試したことの覚え書き

Google Quiz

9/12にGoogle Quizが締め切られました。
Google Developer Day 2011の参加資格を得るためのコンテストですが、Chrome拡張機能やGo言語、Androidなど割と短期間で環境をセットアップして楽しく覚えることができます。
9/12以降は、自分の解答を公開しても良いようです。

Web Game

大量の神経衰弱ゲームをひたすら解く問題です。
最初の10個くらいは、手でやりました。
カードの枚数が、増えてくると手に負えなくなります。
ヒントにカードをクリックしてカードの色をダイアログボックスに表示するChrome拡張機能のサンプルがダウンロードできるリンクがあります。
それに少し手を加えると10分くらいで64セットの神経衰弱をクリアしてくれます。

解答例

Chrome extentionは、JavaScriptやHTMLとmanifestファイルで構成されています。
ヒントからダウンロードできるのは、solver.jsとmanifest.jsonです。
manifest.jsonは一切変更せず、solver.jsを下記のように修正しました。

solver.js

console.log('start');
cards = new Array(2000);
for (n=0; n < 2000; n++) {
    var result = reverscard(n);
    if (result == null) {
        break;
    }
    cards[n] = result;
}
console.log('card number is ' + n);
for (i=0; i < n; i++) {
    if (cards[i] != 'DONE') {
        for (j=(i+1); j < n; j++) {
            if (cards[i] == cards[j]) {
                reverscard(i);
                reverscard(j);
                cards[i] = 'DONE';
                cards[j] = 'DONE';
            }
        }
    }
}
console.log('Finish.');

function reverscard(i) {
    var e = document.getElementById('card' + i);
    if (e == null) {
        return null;
    }
    var myevent = document.createEvent('MouseEvents');
    myevent.initEvent('click', false, true);
    e.dispatchEvent(myevent);
    return e.style.backgroundColor;
}
manifest.json
{
  "name": "ChromeExtensionSolverHint",
  "version": "1.0",
  "description": "Open the first card and show background color of the card.",
  "content_scripts": [
    {
      "matches": [
        "http://gdd-2011-quiz-japan.appspot.com/webgame/problem*"
      ],
      "js": [
        "solver.js"
      ]
    }
  ],
  "permissions": [
  ]
}

簡単な説明

reverscard関数は、ダウンロードしたサンプルのコードほぼそのままです。
カードの色をダイアログで表示するところを、戻り値として返すように書き換えました。
前半で全部のカードをめくって色を配列に記録していき、後半でめくって色を合わせる総当り戦法です。
Chorme Extensionの実装はシンプルで簡単ですね。
Chromeの設定メニューからデベロッパツールJavaScriptコンソールが使えてデバッグに必要なツールがひと通りそろっています。