DevQuiz締め切ったのでコード公開 #gdd11jp

Web Game

ブラウザで神経衰弱をひたすら解くという問題。GoogleChrome拡張を作らせたかったみたいだけどマニフェスト書くのも面倒だったのでuserscriptで作った。
ソース:http://bit.ly/nTWY8B

// ==UserScript==
// @name          devquiz2011_resolve_webgame
// @namespace     http://userscripts.org/users/kawaz
// @description   GDD2011のDevQuizのWebGameを解く
// @include       http://gdd-2011-quiz-japan.appspot.com/webgame/problem
// ==/UserScript==
var click = document.createEvent('MouseEvents');
click.initEvent('click', true, true);
var cards = Array.prototype.slice.apply(document.querySelectorAll(".card"));
var colors = cards.map(function(){return ""});
(function(){
  //次の空き地を探す
  var i = colors.indexOf("");
  if(i < 0) {
    //クリア
    return;
  }
  //空き地を開く
  cards[i].dispatchEvent(click);
  //開いたカードの色を取得
  var c = cards[i].style.backgroundColor;
  var j = colors.indexOf(c);
  console.log("" + i + "," + j + "," + colors);
  if(j < 0) {
    //初めてなら覚える
    colors[i] = c;
  } else {
    //既出なら同色のカードを取る
    cards[j].dispatchEvent(click);
    if(!cards[i].style.backgroundColor) {
      cards[i].dispatchEvent(click);
    }
    //取ったカードにフラグ立て
    colors[i] = colors[j] = 'OK';
  }
  //次手へ再帰ループ
  //arguments.callee();
  setTimeout(arguments.callee, 100); //アニメーションを楽しむ為にゆっくり化
})();

実行風景も録画してみたので公開。デフラグぽくて見てると落ち着く(笑

Google Apps Script

GoogleDocsでプログラムが出来るよーというのがAppsScript(通称GAS)。これを使った問題で、与えられたJSONデータからスプレッドシートを作成するという問題。Javascriptで簡単に操作できるのでとても便利です。

var ss = SpreadsheetApp.getActiveSpreadsheet();

function resolveQuiz() {
  var qs = ss.getActiveSheet();
  var q = qs.getRange(1, 1).getValue();
  try {
    var json = JSON.parse(q);
  } catch($e) {
    Browser.msgBox("A1セルに問題のJSONを入力しておいて下さい");
    return;
  }
  //シートを全削除
  qs.setName("問題入力用");
  ss.getSheets().forEach(function(s){
    Logger.log(s.getSheetName());
    if(s.getName() != qs.getName()) {
      s.activate();
      ss.deleteActiveSheet();
    }
  });
  //回答シートを作成
  json.forEach(function(v, i){
    var sheet = ss.insertSheet(v.city_name);
    v.data.forEach(function(d,i){
      sheet.getRange(i + 1, 1).setValue(d.capacity);
      sheet.getRange(i + 1, 2).setValue(d.usage);
      sheet.getRange(i + 1, 3).setFormula("=B"+(i+1)+"/A"+(i+1));
      sheet.getRange(i + 1, 3).setNumberFormat("##.00%");
    });
  });
  //問題入力用シートを削除
  ss.getSheetByName("問題入力用").activate();
  ss.deleteActiveSheet();
}

スライドパズル

3x3から6x6までの障害物付きスライドパズルの盤面が全5000問出題されてそれを解くというもの。
コード公開しようかと思ったんだけど、Chromeデバッグコンソールで解いたのでちゃんとしたコードが残ってない(^^;
ちなみに1時間くらいごちゃごちゃしてたら幾つか解けるようになり、一晩回して553/5000問解けたところで一旦提出しました。んでその後放置で締切(^^;
でも足切り101点前後で、105点出してるから多分参加資格はGET出来るはず!

その他

今回はスルーしたけど他にも、Androidのライブラリが与えられて回答を得る問題や、Go!言語でPNG画像解析をさせるなど、Googleプロダクツを使ってみてよ!というGoogleの声が聞こえる問題ばかりで楽しかったです。
11月1日の当日に入ってしまっていた健康診断の予約もずらして準備万端。
どんなサプライズが用意されてるか期待してます。