DevQuizに参加しました(2)

Web Game

次はWeb Gameを解きました。
神経衰弱ができるWebページクリアすればOK。でも、この神経衰弱、カードは色を塗ってあるだけ。人間の目にはほとんど区別できない似た色のカードがあったり、枚数が異常に多かったりでとても人間が解くのは不可能。というわけでプログラミングで解きましょう、というクイズ。
オススメのChrome Extensionで解きました。

function clickCard(card) {
  var myevent = document.createEvent('MouseEvents');
  myevent.initEvent('click', false, true);
  card.dispatchEvent(myevent);
}

function getColorNo(colorstr) {
  var pattern = /[0-9]+/g;
  var bai = 1;
  var result = 0;
  while((res = pattern.exec(colorstr)) !== null){
    result += res * bai;
    bai *= 256;
  }
  return result;
}

var elements = document.getElementsByTagName('div');
var cards = [];
for(var i = 0; i < elements.length; i++) {
  var elm = elements[i];
  clickCard(elm);
  cards.push({element:elm, color: getColorNo(elm.style.backgroundColor)});
}

var unopens = [];
for(var i = 0; i < cards.length / 2; i++) {
  var card1 = cards[i * 2];
  var card2 = cards[i * 2 + 1];
  if (card1.color !== card2.color){
    unopens.push(card1);
    unopens.push(card2);
  }
}

var message = '';
unopens.sort(function(a, b){
  return a.color - b.color;
});
for(var i = 0; i < unopens.length; i++) {
  var elm = unopens[i].element;
  clickCard(elm);
  message += unopens[i].color + "\n"
}

全部のカードをクリックして、色を把握し、色順で並べ替えてクリック順を割り出しました。
あっという間にカードがめくれるのを見るのは面白かったです。
最初のクリックで色が揃ったものを把握して、無駄なクリックをしないようにしました。