1 |
- function e(){this.__e={}}function t(){this.variabler={},this.funcs={},this.rulas=[]}e.prototype.__e={},e.prototype.emit=function(e){var t=this,i=[].slice.call(arguments,1);return(this.__e[e]||[]).map(function(e){e.map(function(e){e.apply(t,i)})}),this},e.prototype.on=function(e){var t=[].slice.call(arguments,1);return this.__e[e]=this.__e[e]||[],this.__e[e].push(t),this},function e(t,i){function r(){}r.prototype=i.prototype,t.prototype=new r}(t,e),t.prototype.addVariabelSet=function(e,t){return this.variabler[e]=t,this},t.prototype.addVariableTable=function(e,t){return this},t.prototype.addFunction=function(e,t){return this.funcs[e]=t,this},t.prototype.addClause=function(){for(var e,t,i,r,s,n,o=[].slice.call(arguments);o.length;)e=o.shift(),t=Object.keys(e),this.variabler[t[0]]&&(i=Object.keys(this.variabler).indexOf(t[0])),this.variabler[t[1]]&&(r=Object.keys(this.variabler).indexOf(t[1])),s=[],-1<i&&-1<r?(val1=this.variabler[t[0]].indexOf(e[t[0]]),val2=this.variabler[t[1]].indexOf(e[t[1]]),s=["check",i,r,val1,val2,[t[0],e[t[0]],t[1],e[t[1]]].join(" ")]):(n=t[t.length-1],this.funcs[n]&&(s=this.funcs[n].call(this,e)));return this.rulas.push(s),this},t.prototype.build=function(e){var t,i=[];for(t in this.variabler)i.push(function e(t){for(var i,r,s=[],n=0;n<t.length;n+=1)if((i=e(t.slice(0,n).concat(t.slice(n+1)))).length)for(r=0;r<i.length;r+=1)s.push([t[n]].concat(i[r]));else s.push([t[n]]);return s}(this.variabler[t].map(function(e,t){return t})));return(i=i.sort(function(e,t){return e.length>t.length?1:e.length<t.length?-1:0})).map(function(e){console.log("A",e.length)}),i.pop()},t.prototype.checkPos=function(e,t,i,r){return this.current[this.sos[e]][r]==i},t.prototype.check=function(e,t,i,r){for(var s=0;s<5;s++)if(this.current[this.sos[e]][s]==i)return this.current[this.sos[t]][s]==r;return!1},t.prototype.checkLeft=function(e,t,i,r){for(var s=0;s<4;s++)if(this.current[this.sos[e]][s]==i)return this.current[this.sos[t]][s+1]==r;return!1},t.prototype.checkRight=function(e,t,i,r){for(var s=1;s<5;s++)if(this.current[this.sos[e]][s]==i)return this.current[this.sos[t]][s-1]==r;return!1},t.prototype.checkBoth=function(e,t,i,r){return this.checkLeft(e,t,i,r)||this.checkRight(e,t,i,r)},t.prototype.inner_solve=function(e){e.length,this.rulas.length,e.reduce(function(e,t){return t[1].length*e},1),console.log(e),console.log(this.rulas)},t.prototype.solve=function(){var e,t,i,r,s,n,o,a,l=this;for(l.current=this.build("House"),console.log(l.current),e=Object.keys(this.variabler),l.sos=e.map(function(e){return 0}),l.subspace=l.current.length,l.varspace=e.length,t=[],l.rulas.map(function(e){console.log(e),e[1]==e[2]&&t.push(e)}),l.sos=l.sos.map(function(e){return 0}),console.log(t),i=[],r=0;r<t.length;r++){for(l.sos=l.sos.map(function(e){return 0}),s=t[r],n=[],o=0;o<l.subspace;o++)l.sos[s[1]]=o,l[s.slice(0,1)[0]].apply(l,s.slice(1))&&n.push(o);i.push([s[1],n])}l.sos=l.sos.map(function(e){return 0}),a=this.inner_solve(i),this.emit("done",a)},t.prototype.printit=function(s){var n,o,e,a=this;s=s||a.sos,n=function(e,t){for(;e.length<t;)e=" "+e;return e},o=function(e,t){for(;e.length<t;)e+=" ";return e},(e=[]).push([" ",1,2,3,4,5].map(function(e){return n(""+e,12)}).join(" ")),Object.keys(a.variabler).map(function(i,r){e.push([i,0,1,2,3,4].map(function(e,t){return e==i?o(i+":"+s[r],20):n(""+a.variabler[i][a.current[s[r]][e]],12)}).join(" "))}),console.log(e.join("\n")+"\n")},(new(module.exports=t)).addVariabelSet("Nationality",["Norwegian","Dane","Englishman","German","Swede"]).addVariabelSet("Color",["Yellow","Blue","Red","Green","White"]).addVariabelSet("Smokes",["Dunhill","Blend","PallMall","Prince","BlueMasters"]).addVariabelSet("Drinks",["Water","Tea","Milk","Coffee","Bier"]).addVariabelSet("Animals",["Cats","Horses","Birds","Fish","Dogs"]).addFunction("Neighbor",function(e){var t=Object.keys(e)[0],i=Object.keys(e[Object.keys(e)[1]])[0],r=e[t],s=e.Neighbor[i];return["checkBoth",Object.keys(this.variabler).indexOf(t),Object.keys(this.variabler).indexOf(i),this.variabler[t].indexOf(r),this.variabler[i].indexOf(s),[t,r,"Besides",i,s].join(" ")]}).addFunction("Neighbor_Before",function(e){var t=Object.keys(e)[0],i=Object.keys(e[Object.keys(e)[1]])[0],r=e[t],s=e.Neighbor_Before[i];return["checkLeft",Object.keys(this.variabler).indexOf(t),Object.keys(this.variabler).indexOf(i),this.variabler[t].indexOf(r),this.variabler[i].indexOf(s),[t,r,"Before",i,s].join(" ")]}).addFunction("Neighbor_After",function(){var e=Object.keys(arg)[0],t=Object.keys(arg[Object.keys(arg)[1]])[0],i=arg[e],r=arg.Neighbor_After[t];return["checkRight",Object.keys(this.variabler).indexOf(e),Object.keys(this.variabler).indexOf(t),this.variabler[e].indexOf(i),this.variabler[t].indexOf(r),[e,i,"After",t,r].join(" ")]}).addFunction("House",function(e){var t=Object.keys(e)[0],i=Object.keys(this.variabler).indexOf(t),r=e[t],s=e.House;return["checkPos",i,i,this.variabler[t].indexOf(r),s,[t,r,"House",s].join(" ")]}).addClause({Nationality:"Norwegian",House:0}).addClause({Drinks:"Milk",House:2}).addClause({Nationality:"Norwegian",Neighbor:{Color:"Blue"}}).addClause({Nationality:"Englishman",Color:"Red"}).addClause({Smokes:"Blend",Neighbor:{Drinks:"Water"}}).addClause({Nationality:"Swede",Animals:"Dogs"}).addClause({Nationality:"Dane",Drinks:"Tea"}).addClause({Color:"Green",Drinks:"Coffee"}).addClause({Smokes:"PallMall",Animals:"Birds"}).addClause({Color:"Yellow",Smokes:"Dunhill"}).addClause({Nationality:"German",Smokes:"Prince"}).addClause({Smokes:"Blend",Neighbor:{Animals:"Cats"}}).addClause({Animals:"Horses",Neighbor:{Smokes:"Dunhill"}}).addClause({Smokes:"BlueMasters",Drinks:"Bier"}).addClause({Color:"Green",Neighbor_Before:{Color:"White"}}).on("status",function(e,t,i,r,s){console.log("Status",e,i+" of "+t,"sat "+r+" of "+s)}).on("part",function(e,t,i,r,s,n){this.parts=this.parts||[],this.parts.push([e,i,r,s,n])}).on("done",function(e){var t;e?(console.log("FOUND SOLUTION:",e),this.printit(e),this.parts&&this.parts.length&&(t=this.parts.pop(),console.log(t[4]))):(console.log("NO SOLUTION"),console.log("Closest:"),this.parts&&this.parts.length&&(t=this.parts.pop(),this.printit(t[3]),console.log(t[4])))}).solve();
|