';Dom.add(closebox,box);let msgbox = Dom.make('div');msgbox.innerHTML = s;Dom.add(msgbox,box);let scover = Dom.make('div');scover.id = 'alertboxscreen';scover.style.display='block';scover.style.position='absolute';scover.style.zIndex='98';scover.style.left='0px';scover.style.top='0px';scover.style.width='100%';scover.style.height='100%';scover.style.backgroundColor='rgba(0,0,0,.25)';scover.onclick=removeAlertBox;Dom.add(scover,d.body);let boxTotalwidth = box.offsetWidth;/*console.log(boxTotalwidth);*/let boxTotalheight = box.offsetHeight;let topposition = parseInt(((viewheight-boxTotalheight)/2)+scrolltop);let leftposition = parseInt(((viewwidth-boxTotalwidth)/2)+scrollleft);topposition -= 120; /*to tackle very small screens*/if(topposition<0) topposition = 0;if(leftposition<0) leftposition = 0;box.style.top = topposition + 'px';box.style.left = leftposition + 'px';}/****THE GAME ******/const numColors = 5; /*Including transparent*/const maxcolcount = 7; /*maximum number of columns*/const maxrowcount = 12; /*maximum number of rows*/const imgblank = 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw';let numberImgs = new Array();numberImgs[0] = 'data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20465%20465%22%3E%3Ccircle%20fill%3D%22none%22%20stroke%3D%22%23D2D3D5%22%20stroke-width%3D%2234%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22214%22%2F%3E%3Ccircle%20fill%3D%22%231E8CE6%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22201%22%2F%3E%3Cpath%20id%3D%22no0%22%20fill%3D%22%23FC0%22%20d%3D%22M180%20129l0%20207%20106%200%200%20-207%20-106%200zm3%20-36l98%200c26,0%2041,14%2041,40l0%20199c0,26%20-15,40%20-41,40l-98%200c-25,0%20-40,-14%20-40,-40l0%20-199c0,-26%2015,-40%2040,-40z%22%2F%3E%3C%2Fsvg%3E';numberImgs[1] = 'data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20465%20465%22%3E%3Ccircle%20fill%3D%22none%22%20stroke%3D%22%23D2D3D5%22%20stroke-width%3D%2234%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22214%22%2F%3E%3Ccircle%20fill%3D%22%231E8CE6%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22201%22%2F%3E%3Cpath%20id%3D%22no1%22%20fill%3D%22%23FC0%22%20d%3D%22M164%2093l87%200%200%20243%2035%200c0,-22%20-4,-76%204,-86%2010,-9%2032,-6%2032,15l0%2089c0,11%20-9,18%20-20,18l-138%200c-27,0%20-27,-36%200,-36l50%200%200%20-207c-34,0%20-71,8%20-71,-18%200,-11%209,-18%2021,-18z%22%2F%3E%3C%2Fsvg%3E';numberImgs[2] = 'data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20465%20465%22%3E%3Ccircle%20fill%3D%22none%22%20stroke%3D%22%23D2D3D5%22%20stroke-width%3D%2234%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22214%22%2F%3E%3Ccircle%20fill%3D%22%231E8CE6%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22201%22%2F%3E%3Cpath%20id%3D%22no2%22%20fill%3D%22%23FC0%22%20d%3D%22M164%2093l122%200c19,0%2036,16%2036,36l0%2085c0,21%20-17,37%20-36,37l-106%200%200%2085%20122%200c27,0%2026,36%200,36l-159%200%200%20-121c0,-20%2016,-37%2037,-37l106%200%200%20-85%20-122%200c-28,0%20-27,-36%200,-36z%22%2F%3E%3C%2Fsvg%3E';numberImgs[3] = 'data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20465%20465%22%3E%3Ccircle%20fill%3D%22none%22%20stroke%3D%22%23D2D3D5%22%20stroke-width%3D%2234%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22214%22%2F%3E%3Ccircle%20fill%3D%22%231E8CE6%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22201%22%2F%3E%3Cpath%20id%3D%22no3%22%20fill%3D%22%23FC0%22%20d%3D%22M163%2093l122%200c20,0%2036,16%2036,36%200,21%203,70%20-3,86%20-2,6%20-6,11%20-10,17%2020,28%2013,60%2013,104%200,20%20-16,36%20-36,36l-122%200c-27,0%20-27,-36%200,-36l122%200c0,-99%2013,-85%20-87,-85%20-27,0%20-25,-37%200,-37%20100,0%2087,15%2087,-85l-122%200c-27,0%20-27,-36%200,-36z%22%2F%3E%3C%2Fsvg%3E';numberImgs[4] = 'data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%20viewBox%3D%220%200%20465%20465%22%3E%3Ccircle%20fill%3D%22none%22%20stroke%3D%22%23D2D3D5%22%20stroke-width%3D%2234%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22214%22%2F%3E%3Ccircle%20fill%3D%22%231E8CE6%22%20cx%3D%22233%22%20cy%3D%22233%22%20r%3D%22201%22%2F%3E%3Cpath%20id%3D%22no4%22%20fill%3D%22%23FC0%22%20d%3D%22M188%20113l0%20132%2071%200c0,-25%20-5,-106%205,-116%209,-11%2031,-6%2031,15l0%20101c23,2%2025,33%200,36%200,22%204,76%20-5,85%20-10,11%20-31,7%20-31,-14l0%20-71%20-107%200%200%20-168c0,-27%2036,-26%2036,0z%22%2F%3E%3C%2Fsvg%3E';let cellColours = new Array();cellColours[0] = 'blank';cellColours[1] = 'yellow';cellColours[2] = 'red';cellColours[3] = 'green';cellColours[4] = 'purple';let numsImgs = new Array(); /*digit images*/let colcount; /*number of columns*/let rowcount; /*number of rows*/let imgcount; /*number of states of a tile*/let cells; /*current states of tiles*/let steps; /*current steps of operation*/let playing; /*boolean, if playing*/let autogen; /*boolean, if playing with an auto-generated problem*/let setGame = function(){var dimension = $('gamesize').options[ $('gamesize').selectedIndex ].value.split('x');colcount = parseInt(dimension[0]);rowcount = parseInt(dimension[1]);for (var val = 0; val < numColors; val++) {numsImgs[val] = numberImgs[val]; }var col;var row;cells = new Array();for (col = 0; col < colcount; col++) {cells[col] = new Array();for (row = 0; row < rowcount; row++) {cells[col][row] = 0;}}$('playground').innerHTML = '';makeBoard(colcount, rowcount, '');makeBoard(colcount, rowcount, 'solutions');imgcount = parseInt( $('colours').options[ $('colours').selectedIndex ].value );var filas = Math.min(maxrowcount, rowcount);var columnas = Math.min(maxcolcount, colcount);for (var col = 0; col < columnas; col++) {for (var row = 0; row < filas; row++) {setcellimage(col,row,'blank');setsolutionscellimage(col,row,imgblank);}}newGame();};let newGame = function(){$('solutionsgameboard').style.display = 'none';for (var col = 0; col < colcount; col++) {for (var row = 0; row < rowcount; row++) {setcell(col,row, Math.floor(Math.random() * imgcount));setsolutionscellimage(col, row, imgblank);}}playing = true;autogen = true;steps = 0;if(parent==top) {parent.iframeLoaded(); }};let edit = function() {if (!playing) {for (var col = 0; col < colcount; col++) {for (var row = 0; row < rowcount; row++) {setcell(col,row,0);}}}playing = false;autogen = false;};let play = function() {playing = true;};let solutionsoperate = function(col,row) {operate(col,row);solve();};let operate = function(col,row) {if (col >= colcount || row >= rowcount) {return;}flip(col,row);if (playing) {if (col > 0) {flip(col-1, row);}if (row > 0) {flip(col, row-1);}if (col < colcount - 1) {flip(col+1, row);}if (row < rowcount - 1){ flip(col, row+1);}steps++;$('switch').play();if (autogen && isCleared()) {$('tada').play();alertBox('¡Estupendo! Lo hiciste en '+ steps +' pasos.
');autogen = false;}}};/*operation methods*/let setcell = function(col,row,val) {cells[col][row] = val;setcellimage(col,row,cellColours[val]);};let setcellimage = function(col, row, cellColour) {$(cellname(col,row)).parentNode.className = cellColour;};let setsolutionscellimage = function(col, row, imgsrc) {var targetTD = 'solutionstd_' + cellname(col,row);$('solutions' + cellname(col,row)).src = imgsrc;};let cellname = function(col,row) {return 'cell' + col + '_' + row;};let flip = function(col,row) {setcell(col,row,(cells[col][row] + 1) % imgcount);};/*status methods*/let isCleared = function() {var sample = cells[0][0];for (var col = 0; col < colcount; col++) {for (var row = 0; row < rowcount; row++) {if (cells[col][row] != sample) {return false;}}}return true;};/*finite field algebra solver*/let modulate = function(x) {/*returns z such that 0 <= z < imgcount and x == z (mod imgcount)*/if (x >= 0) {return x % imgcount;}x = (-x) % imgcount;if (x == 0) {return 0;}return imgcount - x;};let gcd = function(x, y) { /*call when: x >= 0 and y >= 0*/if (y == 0){return x;}if (x == y) {return x;}if (x > y) {x = x % y; /*x < y*/}while (x > 0) {y = y % x; /*y < x*/if (y == 0) {return x;}x = x % y; /*x < y*/}return y;};let invert = function(value) { /*call when: 0 <= value < imgcount*//*returns z such that value * z == 1 (mod imgcount), or 0 if no such z*/if (value <= 1) {return value;}var seed = gcd(value,imgcount);if (seed != 1) {return 0;}var a = 1, b = 0, x = value; /*invar: a * value + b * imgcount == x*/var c = 0, d = 1, y = imgcount; /*invar: c * value + d * imgcount == y*/while (x > 1) {var tmp = Math.floor(y / x);y -= x * tmp;c -= a * tmp;d -= b * tmp;tmp = a; a = c; c = tmp;tmp = b; b = d; d = tmp;tmp = x; x = y; y = tmp;}return a;};/*finite field matrix solver*/let mat; /*integer[i][j]*/let cols; /*integer[]*/let m; /*count of rows of the matrix*/let n; /*count of columns of the matrix*/let np; /*count of columns of the enlarged matrix*/let r; /*minimum rank of the matrix*/let maxr; /*maximum rank of the matrix*/let a = function(i,j) {return mat[i][cols[j]];};let setmat = function(i,j,val) {mat[i][cols[j]] = modulate(val);};let solve = function() {var col;var row;$('solutionsgameboard').style.display = 'table';for (var goal = 0; goal < imgcount; goal++) {if (solveProblem(goal)) { /*found an integer solution*/var solutionscols = new Array();var j;for (j = 0; j < n; j++) {solutionscols[cols[j]] = j;}for (col = 0; col < colcount; col++) {for (row = 0; row < rowcount; row++) {var value;j = solutionscols[row * colcount + col];if (j < r) {value = a(j,n);}else {value = 0;}setsolutionscellimage(col, row, numsImgs[value]);}}if(parent==top) {parent.iframeLoaded(); }return;}}/*(aborted or) no solution*/for (var col = 0; col < colcount; col++) {for (var row = 0; row < rowcount; row++) {setsolutionscellimage(col,row,imgblank);}}if(parent==top) {parent.iframeLoaded(); }$('solutionsgameboard').style.display = 'none';alertBox('¡Oops! Lo siento, parece que ese tablero no tiene solución.
');};let checkNormal = function() {var size = colcount * rowcount;m = size;n = size;np = n + size;initMatrix();for (var col = 0; col < colcount; col++) {for (var row = 0; row < rowcount; row++) {var i = row * colcount + col;var line = mat[i];for (var j = n; j < np; j++) line[j] = 0;line[n + i] = 1;}}if (sweep()) {alertBox('Definitivamente este tablero si se puede resolver');}else {alertBox('Lo siento. Parece que este tablero no tiene solución.
');}};let initMatrix = function() {maxr = Math.min(m,n);mat = new Array();for (var col = 0; col < colcount; col++)for (var row = 0; row < rowcount; row++) {var i = row * colcount + col;var line = new Array();mat[i] = line;for (var j = 0; j < n; j++) {line[j] = 0;}line[i] = 1;if (col > 0) {line[i - 1] = 1;}if (row > 0) {line[i - colcount] = 1;}if (col < colcount - 1) {line[i + 1] = 1;}if (row < rowcount - 1) {line[i + colcount] = 1;}}cols = new Array();for (var j = 0; j < np; j++) {cols[j] = j;}};let solveProblem = function(goal) {var size = colcount * rowcount;m = size;n = size;np = n + 1;initMatrix();for (var col = 0; col < colcount; col++) {for (var row = 0; row < rowcount; row++) {mat[row * colcount + col][n] = modulate(goal - cells[col][row]);}}return sweep();};let sweep = function() {for (r = 0; r < maxr; r++) {if (!sweepStep()) {return false; /*failed in founding a solution*/}if (r == maxr) {break;}}return true;/*successfully found a solution*/};let sweepStep = function() {var i;var j;var finished = true;for (j = r; j < n; j++) {for (i = r; i < m; i++) {var aij = a(i,j);if (aij != 0) {finished = false;}var inv = invert(aij);if (inv != 0) {for (var jj = r; jj < np; jj++)setmat(i,jj, a(i,jj) * inv);doBasicSweep(i,j);return true;}}}if (finished) { /*we have: 0x = b (every matrix element is 0)*/maxr = r; /*rank(A) == maxr*/for (j = n; j < np; j++) {for (i = r; i < m; i++) {if (a(i,j) != 0) {return false; /*no solution b != 0*/}}}return true; /*0x = 0 has solutions including x = 0*/}alertBox('¡Ooops! Algo anda mal, lo siento, no he podido resolver este tablero.');return false; /*failed in founding a solution*/};let swap = function(array,x,y) {var tmp = array[x];array[x] = array[y];array[y] = tmp;};let doBasicSweep = function(pivoti, pivotj) {if (r != pivoti){swap(mat,r,pivoti);}if (r != pivotj){swap(cols,r,pivotj);}for (var i = 0; i < m; i++) {if (i != r) {var air = a(i,r);if (air != 0) {for (var j = r; j < np; j++) {setmat(i,j, a(i,j) - a(r,j) * air);}}}}};let makeBoard = function(w, h, prefix) {var row;var col;if (prefix == '') {var bwrap = Dom.make('div');bwrap.id = 'gamewrap';}var bTable = Dom.make('table');bTable.id = prefix + 'gameboard';h = Math.min(h,maxrowcount);w = Math.min(w,maxcolcount);for (row = 0; row < h; row++) {var bTr = Dom.make('tr');for (col = 0; col < w; col++) {var bTd = Dom.make('td');if(prefix != ''){bTd.id = 'solutionstd_' + cellname(col,row);}var Imgid = prefix == 'solutions' ? 'solutions' + cellname(col,row): cellname(col,row);var inImg = '';bTd.innerHTML = inImg;Dom.add(bTd, bTr);}Dom.add(bTr, bTable);}if (prefix == '') {Dom.add(bTable, bwrap);Dom.add(bwrap, $('playground'));}else {Dom.add(bTable, $('playground'));}};let closeNewGame = function(){removeAlertBox();newGame();}