/* * The hotplat could be represented (6x6) as * * 0 * * * * 0 * * * * * * * * * * 1 1 * * * * * 1 1 * * * * * * * * * * 0 * * * * 0 * */ (function () { "use strict"; var red = '\u001b[31m' , yellow = '\u001b[33m' , blue = '\u001b[34m' , reset = '\u001b[0m' ; function pad(num) { num = String(num); while (num.length < 6) { num = ' ' + num; } return num; } /* * rows: number of rows * cols: number of columns * diff: maximum allowable difference * initial: the start value of each cell * turns: maximum number of turns */ function HotPlate(opts) { var me = this ; me.numrows = opts.rows; me.numcols = opts.cols; me.prevRows = []; me.nextRows = []; me.maxDiff = opts.diff || 0.00001; me.maxTurns = opts.turns || 100 * 1000; me.initializeGrid(me.prevRows); me.initializeGrid(me.nextRows); //console.log(me.prevRows); //console.log(me.nextRows); } HotPlate.prototype.initializeGrid = function (rows) { var me = this , row , i , j ; for (i = 0; i < me.numrows; i += 1) { row = []; rows.push(row); for (j = 0; j < me.numcols; j += 1) { row.push(me.initial || 0); } } // 0, 1, 2, [3, 4], 5, 6, 7 rows[(me.numrows / 2) - 1][(me.numcols / 2) - 1] = 100; rows[(me.numrows / 2) - 1][(me.numcols / 2)] = 100; rows[(me.numrows / 2)][(me.numcols / 2) - 1] = 100; rows[(me.numrows / 2)][(me.numcols / 2)] = 100; }; HotPlate.prototype.run = function () { var me = this , diff = 100 , sum , count , i , j , rows , turns = 0 , str , color ; while (diff > me.maxDiff && turns < me.maxTurns) { turns += 1; diff = 0; for (i = 0; i < me.numrows; i += 1) { for (j = 0; j < me.numcols; j += 1) { // ignore the cold cells (cornermost) if ( (i === 0 && j === 0) || (i === 0 && j === me.numcols - 1) || (i === me.numrows - 1 && j === 0) || (i === me.numrows - 1 && j === me.numcols - 1) ) { continue; } // ignore hot cells (centermost) if ( (i === (me.numrows / 2) - 1 && j === (me.numcols / 2) - 1) || (i === (me.numrows / 2) - 1 && j === (me.numcols / 2)) || (i === (me.numrows / 2) && j === (me.numcols / 2) - 1) || (i === (me.numrows / 2) && j === (me.numcols / 2)) ) { continue; } // add up, left, right, down and self values // (but only if they exist) rows = me.prevRows; //console.log(rows); sum = 0; count = 0; if (i > 0) { count += 1; sum += rows[i - 1][j]; //console.log('i>0:', rows[i - 1] + rows[j]); } if (i < me.numrows - 1) { count += 1; sum += rows[i + 1][j]; //console.log('i 0) { count += 1; sum += rows[i][j - 1]; //console.log('j>0:', rows[i] + rows[j - 1]); } if (j < me.numcols - 1) { count += 1; sum += rows[i][j + 1]; //console.log('j 66) { color = red; } else { color = yellow; } str += ' ' + color + pad((me.prevRows[i][j]).toFixed(2)); } console.log(str); } console.log(reset + 'Actual Diff:', diff); }; HotPlate.create = function (opts) { return new HotPlate(opts); }; HotPlate.create({ cols: 8, rows: 16}).run(); }());