Skip to main content
edited body
Source Link
Gero3
  • 101
  • 1

Javascript/node.js - 25888472,588,847

Algoritm is a bit different then most here as it makes use of precalculated regions and diff states between calcualtionscalculations. It runs under 10 minutes here if you are worried about speed becuasebecause of javascript.

Javascript/node.js - 2588847

Algoritm is a bit different then most here as it makes use of precalculated regions and diff states between calcualtions. It runs under 10 minutes here if you are worried about speed becuase of javascript.

Javascript/node.js - 2,588,847

Algoritm is a bit different then most here as it makes use of precalculated regions and diff states between calculations. It runs under 10 minutes here if you are worried about speed because of javascript.

Source Link
Gero3
  • 101
  • 1

Javascript/node.js - 2588847

Algoritm is a bit different then most here as it makes use of precalculated regions and diff states between calcualtions. It runs under 10 minutes here if you are worried about speed becuase of javascript.

var fs = require('fs') var file = fs.readFileSync('floodtest','utf8'); var boards = file.split('\n\n'); var linelength = boards[0].split('\n')[0].length; var maxdim = linelength* linelength; var board = function(info){ this.info =[]; this.sameNeighbors = []; this.differentNeighbors = []; this.samedifferentNeighbors = []; for (var i = 0;i <info.length;i++ ){ this.info.push(info[i]|0); }; this.getSameAndDifferentNeighbors(); } board.prototype.getSameAndDifferentNeighbors = function(){ var self = this; var info = self.info; function getSameNeighbors(i,value,sameneighbors,diffneighbors){ var neighbors = self.getNeighbors(i); for(var j =0,nl = neighbors.length; j< nl;j++){ var index = neighbors[j]; if (info[index] === value ){ if( sameneighbors.indexOf(index) === -1){ sameneighbors.push(index); getSameNeighbors(index,value,sameneighbors,diffneighbors); } }else if( diffneighbors.indexOf(index) === -1){ diffneighbors.push(index); } } } var sneighbors = []; var dneighbors = []; var sdneighbors = []; for(var i= 0,l= maxdim;i<l;i++){ if (sneighbors[i] === undefined){ var sameneighbors = [i]; var diffneighbors = []; getSameNeighbors(i,info[i],sameneighbors,diffneighbors); for (var j = 0; j<sameneighbors.length;j++){ var k = sameneighbors[j]; sneighbors[k] = sameneighbors; dneighbors[k] = diffneighbors; } } } for(var i= 0,l= maxdim;i<l;i++){ if (sdneighbors[i] === undefined){ var value = []; var dni = dneighbors[i]; for (var j = 0,dnil = dni.length; j<dnil;j++){ var dnij = dni[j]; var sdnij = sneighbors[dnij]; for(var k = 0,sdnijl = sdnij.length;k<sdnijl;k++){ if (value.indexOf(sdnij[k])=== -1){ value.push(sdnij[k]); } } }; var sni = sneighbors[i]; for (var j=0,snil = sni.length;j<snil;j++){ sdneighbors[sni[j]] = value; }; }; } this.sameNeighbors = sneighbors; this.differentNeighbors = dneighbors; this.samedifferentNeighbors =sdneighbors; } board.prototype.getNeighbors = function(i){ var returnValue = []; var index = i-linelength; if (index >= 0){ returnValue.push(index); } index = i+linelength; if (index < maxdim){ returnValue.push(index); } index = i-1; if (index >= 0 && index/linelength >>> 0 === i/linelength >>> 0){ returnValue.push(index); } index = i+1; if (index/linelength >>> 0 === i/linelength >>> 0){ returnValue.push(index); } if (returnValue.indexOf(-1) !== -1){ console.log(i,parseInt(index/linelength,10),parseInt(i/linelength,10)); } return returnValue } board.prototype.solve = function(){ var i,j; var info = this.info; var sameNeighbors = this.sameNeighbors; var samedifferentNeighbors = this.samedifferentNeighbors; var middle = 9*19+9; var maxValues = []; var done = {}; for (i=0; i<sameNeighbors[middle].length;i++){ done[sameNeighbors[middle][i]] = true; } var usefullNeighbors = [[],[],[],[],[],[],[]]; var diff = []; var count = [0]; count[1] = 0; count[2] = 0; count[3] = 0; count[4] = 0; count[5] = 0; count[6] = 0; var addusefullNeighbors = function(index,diff){ var indexsamedifferentNeighbors =samedifferentNeighbors[index]; for (var i=0;i < indexsamedifferentNeighbors.length;i++){ var is = indexsamedifferentNeighbors[i]; var value = info[is]; if (done[is] === undefined && usefullNeighbors[value].indexOf(is) === -1){ usefullNeighbors[value].push(is); diff.push(value); } } } addusefullNeighbors(middle,diff); while( usefullNeighbors[1].length > 0 || usefullNeighbors[2].length > 0 || usefullNeighbors[3].length > 0 || usefullNeighbors[4].length > 0 || usefullNeighbors[5].length > 0 || usefullNeighbors[6].length > 0 ){ for (i=0;i < diff.length;i++){ count[diff[i]]++; }; var maxValue = count.indexOf(Math.max.apply(null, count)); diff.length = 0; var used = usefullNeighbors[maxValue]; for (var i=0,ul = used.length;i < ul;i++){ var index = used[i]; if (info[index] === maxValue){ done[index] = true; addusefullNeighbors(index,diff); } } used.length = 0; count[maxValue] = 0; maxValues.push(maxValue); } return maxValues.join(""); }; var solved = []; var start = Date.now(); for (var boardindex =0;boardindex < boards.length;boardindex++){ var b = boards[boardindex].replace(/\n/g,'').split(''); var board2 = new board(b); solved.push(board2.solve()); }; var diff = Date.now()-start; console.log(diff,boards.length); console.log(solved.join('').length); console.log("end"); fs.writeFileSync('solution.txt',solved.join('\n'),'utf8');