Einstein's riddle in JavaScript

 『【プログラム クイズ】 アインシュタインのなぞなぞ (Einstein's Riddle)』のプログラムをJavaScriptに翻訳してみました。(^_^;

●Einstein.html

<!--
/*
 * Einstein.html
 * # : 12345
 * N : NDEGS
 * H : YBRGW
 * P : CHBFD
 * D : WTMCB
 * T : DMPRB
 */
//-->
<html>
<head>
<title>Einstein.html</title>
<script type="text/javascript" src="genperm.js">/* 順列生成 */</script>
<script type="text/javascript">
// xがaの何番目にあるか調べる関数
// ないときは、-1を返して、あるときは、0〜a.length-1を返す
function get_pos(a, x)
{
  for(var i=0; i<a.length; i++)
    if(a[i]==x) return(i);
  return(-1);
}

// マッチング条件
function check_match(a, x, b, y)
{
  var n=get_pos(a,x);

  if(n<0||4<n) return(false);
  if(b[n]==y)  return(true ); else return(false);
}

// 順序付き隣接条件(左からx,yの順で隣接)
function check_adj_1(a, x, b, y)
{
  var n=get_pos(a,x);

  if(n<0||3<n)  return(false);
  if(b[n+1]==y) return(true ); else return(false);
}

// 隣接条件(順不定)
function check_adj_2(a, x, b, y)
{
   return(check_adj_1(a,x,b,y)||check_adj_1(b,y,a,x));
}

var PLACE =["1","2","3","4","5"];  // 固定
var NATION=["D","E","G","N","S"];  // 要素を昇順にソートしたもの
var HOUSE =["B","G","R","W","Y"];  // 以下同様
var PET   =["B","C","D","F","H"];
var DRINK =["B","C","M","T","W"];
var TABACO=["B","D","M","P","R"];

var Nation={  // 連想配列
  "D": "D:デンマーク",
  "E": "E:イギリス",
  "G": "G:ドイツ",
  "N": "N:ノルウェー",
  "S": "S:スウェーデン"
};
</script>
</head>
<body>
<script type="text/javascript">
var place =new Array(5);  // 場所(固定)
var nation=new Array(5);  // 国、国籍
var house =new Array(5);  // 家
var pet   =new Array(5);  // ペット
var drink =new Array(5);  // 飲み物
var tabaco=new Array(5);  // タバコ(ポルトガル語)

var tm=(new Date()).getTime();  // Timer start
place=PLACE.slice(0);
nation=NATION.slice(0);
do{  // nation loop
  if(!check_match(nation,'N',place, '1')) continue;   // 条件09
  house=HOUSE.slice(0);
  do{  // house loop
    if(!check_match(nation,'E',house, 'R')) continue;   // 条件01
    if(!check_adj_1(house, 'G',house, 'W')) continue;   // 条件04
    if(!check_adj_2(nation,'N',house, 'B')) continue;   // 条件14
    pet=PET.slice(0);
      do{  // pet loop
        if(!check_match(nation,'S',pet,   'D')) continue;   // 条件02
        drink=DRINK.slice(0);
        do{  // drink loop
          if(!check_match(nation,'D',drink, 'T')) continue;   // 条件03
          if(!check_match(house, 'G',drink, 'C')) continue;   // 条件05
          if(!check_match(place, '3',drink, 'M')) continue;   // 条件08
          tabaco=TABACO.slice(0);
          do{  // tabaco loop
            if(!check_match(tabaco,'P',pet,   'B')) continue;   // 条件06
            if(!check_match(house, 'Y',tabaco,'D')) continue;   // 条件07
            if(!check_adj_2(tabaco,'M',pet,   'C')) continue;   // 条件10
            if(!check_adj_2(pet,   'H',tabaco,'D')) continue;   // 条件11
            if(!check_match(tabaco,'B',drink, 'B')) continue;   // 条件12
            if(!check_match(nation,'G',tabaco,'R')) continue;   // 条件13
            if(!check_adj_2(tabaco,'M',drink, 'W')) continue;   // 条件15
            
            //チェックを潜り抜けたものだけを表示
            document.write("<pre>");
            document.write("#:", place .join(""),"<br />");
            document.write("N:", nation.join(""),"<br />");
            document.write("H:", house .join(""),"<br />");
            document.write("P:", pet   .join(""),"<br />");
            document.write("D:", drink .join(""),"<br />");
            document.write("T:", tabaco.join(""),"<br />");
            document.write("</pre>");
            //document.write("<br />");

            document.write("∴",Nation[nation[get_pos(pet,'F')]],"人<br />");
            }while(next_perm(tabaco,5,5));
         }while(next_perm(drink,5,5));
      }while(next_perm(pet,5,5));
   }while(next_perm(house,5,5));
}while(next_perm(nation,5,5));

tm=(new Date()).getTime()-tm;  // Timer stop
document.write("Runtime : ",tm/1000.0, "[sec]<br />");
</script>
</body>
</html>

●実行結果

#:12345
N:NDEGS
H:YBRGW
P:CHBFD
D:WTMCB
T:DMPRB

∴G:ドイツ人
Runtime : 0.039[sec]

※genperm.js
http://d.hatena.ne.jp/rsc96074/20111021/1319190871

ゼロからわかる JavaScript超入門 [大型本] 河西 朝雄 (著)

ゼロからわかる JavaScript超入門

ゼロからわかる JavaScript超入門

マンガで分かる JavaScriptプログラミング講座
マンガでわかるJavaScript

マンガでわかるJavaScript

JavaScriptの絵本 〜ホームページ作りが楽しくなる9つの扉〜
JavaScriptの絵本

JavaScriptの絵本

パーフェクトJavaScript (PERFECT SERIES 4) 井上 誠一郎 (著), 土江 拓郎 (著), 浜辺 将太 (著)
パーフェクトJavaScript (PERFECT SERIES 4)

パーフェクトJavaScript (PERFECT SERIES 4)

JavaScript 第5版[大型本]David Flanagan (著), 村上 列 (翻訳)
JavaScript 第5版

JavaScript 第5版

改訂第5版 JavaScript ポケットリファレンス 古籏 一浩 (著)
改訂第5版 JavaScript ポケットリファレンス

改訂第5版 JavaScript ポケットリファレンス

Head First JavaScript ―頭とからだで覚えるJavaScriptの基本 Michael Morrison (著)
Head First JavaScript ―頭とからだで覚えるJavaScriptの基本

Head First JavaScript ―頭とからだで覚えるJavaScriptの基本

JavaScriptプログラミング入門 第2版 大津 真 (著)
JavaScriptプログラミング入門 第2版

JavaScriptプログラミング入門 第2版

詳解HTML & CSS & JavaScript辞典 大藤 幹(著)
詳解HTML&CSS&JavaScript辞典 第4版

詳解HTML&CSS&JavaScript辞典 第4版