/* SudokuPuzz.com – sudoku solver */ (function(){ var root=document.querySelector(".solver");if(!root)return; var board=root.querySelector(".sv-board"),msg=root.querySelector(".sv-msg"),inputs=[],i; var R=[],C=[],B=[];for(i=0;i<81;i++){R[i]=(i/9)|0;C[i]=i%9;B[i]=((R[i]/3)|0)*3+((C[i]/3)|0)} var EXAMPLE="530070000600195000098000060800060003400803001700020006060000280000419005000080079"; for(i=0;i<81;i++){(function(i){ var el=document.createElement("input");el.type="text";el.inputMode="numeric";el.maxLength=1;el.autocomplete="off"; el.className="sv-cell"+(C[i]%3===2&&C[i]<8?" br":"")+(R[i]%3===2&&R[i]<8?" bb":""); el.id="sv"+i;el.setAttribute("aria-label","Row "+(R[i]+1)+", column "+(C[i]+1)); el.addEventListener("input",function(){el.value=el.value.replace(/[^1-9]/g,"").slice(-1);el.classList.remove("solved");mark()}); el.addEventListener("keydown",function(e){var m={ArrowUp:-9,ArrowDown:9,ArrowLeft:-1,ArrowRight:1}[e.key]; if(m){var n=i+m;if(n>=0&&n<81&&(Math.abs(m)===9||R[n]===R[i])){e.preventDefault();inputs[n].focus();inputs[n].select()}}}); board.appendChild(el);inputs.push(el)})(i)} function read(){return inputs.map(function(el){return el.classList.contains("solved")?0:(+el.value||0)})} function conflicts(g){var bad=[];for(var i=0;i<81;i++)if(g[i])for(var j=0;j<81;j++)if(j!==i&&g[j]===g[i]&&(R[j]===R[i]||C[j]===C[i]||B[j]===B[i])){bad.push(i);break}return bad} function mark(){var bad=conflicts(read());inputs.forEach(function(el,i){el.classList.toggle("bad",bad.indexOf(i)>=0)});return bad} function pop(m){var n=0;while(m){m&=m-1;n++}return n} function solve(grid,limit){ var g=grid.slice(),rm=[0,0,0,0,0,0,0,0,0],cm=rm.slice(),bm=rm.slice(),count=0,sol=null,steps=0; for(var i=0;i<81;i++)if(g[i]){var b=1<2e6)return; var best=-1,mask=0,bn=10; for(var i=0;i<81;i++)if(!g[i]){var m=~(rm[R[i]]|cm[C[i]]|bm[B[i]])&0x3FE,n=pop(m);if(n=limit)return} })(); return{count:count,solution:sol}; } function prepare(){ var g=read(),given=g.filter(Boolean).length; if(mark().length){msg.textContent="Some numbers clash with each other (shown in red). Fix them first.";return null} if(given<17){msg.textContent="Enter at least 17 numbers. A real sudoku never has fewer.";return null} var res=solve(g,2); if(!res.count){msg.textContent="This sudoku has no solution. Check that you typed the numbers correctly.";return null} return{g:g,res:res}; } root.querySelector(".sv-solve").onclick=function(){ var p=prepare();if(!p)return; p.res.solution.forEach(function(v,i){if(!p.g[i]){inputs[i].value=v;inputs[i].classList.add("solved")}}); msg.textContent=p.res.count>1?"Solved. Note: this puzzle has more than one solution, so this is just one of them.":"Solved! The numbers in blue were filled in by the solver."; }; root.querySelector(".sv-hint").onclick=function(){ var p=prepare();if(!p)return;var best=-1,bn=10; for(var i=0;i<81;i++)if(!p.g[i]){var used=0;for(var j=0;j<81;j++)if(p.g[j]&&(R[j]===R[i]||C[j]===C[i]||B[j]===B[i]))used|=1<