| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- const SERIAL = 8444,
- MAP_SIZE =300;
- var resultCache = [];
- function getLevel(px, py) {
- return resultCache[px *MAP_SIZE +py] || (resultCache[px *MAP_SIZE +py] = (Math.floor((((px +10) *py +SERIAL) *(px +10)) / 100) %10) -5);
- }
- function sumSquare(px, py, size) {
- var r = 0;
- for (var i =0; i < size; ++i)
- for (var j =0; j < size; ++j)
- r += getLevel(px +i, py +j);
- return writeCache(px, py, size, r);
- }
- var cache = {};
- function getCache(px, py, size) {
- if (!cache[size])
- return;
- if (!cache[size][px])
- return;
- return (cache[size][px][py])
- }
- function writeCache(px, py, size, val) {
- if (size < (MAP_SIZE /2) +1) {
- cache[size] = cache[size] || [];
- cache[size][px] = cache[size][px] || [];
- cache[size][px][py] = val;
- }
- return val;
- }
- function sumSquareWithCache(px, py, size, toto) {
- var cached = getCache(px, py, size);
- if (cached !== undefined)
- return cached;
- if (size >= 2 && Math.floor(size /2) == size /2)
- return writeCache(px, py, size, sumSquareWithCache(px, py, size /2, 1) +
- sumSquareWithCache(px +size /2, py, size /2, 1) +
- sumSquareWithCache(px +size /2, py +size /2, size /2, 1) +
- sumSquareWithCache(px, py +size /2, size /2, 1));
- else if (size > 8) {
- var tmpResult = sumSquareWithCache(px, py, size -1, 1);
- for (var i =0; i <= size -1; ++i)
- tmpResult += getLevel(px +i, py +size -1);
- for (var i =0; i < size -1; ++i)
- tmpResult += getLevel(px +size -1, py +i);
- return writeCache(px, py, size, tmpResult);
- }
- return sumSquare(px, py, size);
- }
- function printResult(r) {
- console.log(r.px +"," +r.py +", " +r.size);
- }
- function ex1(size) {
- var max = null;
- for (var i =1; i <= MAP_SIZE -3; ++i)
- for (var j =1; j <= MAP_SIZE -3; ++j) {
- var val = sumSquareWithCache(i, j, size);
- if (!max || val > max.val)
- max = {
- px: i,
- py: j,
- val: val,
- size: size
- };
- }
- return max;
- }
- function ex2() {
- var max = null;
- for (var i =1; i < MAP_SIZE; ++i) {
- var val = ex1(i);
- if (!max || (val && val.val > max.val))
- max = val;
- process.stdout.write(i +"/" +MAP_SIZE +"\r");
- }
- process.stdout.write("\n");
- printResult(max);
- }
- printResult(ex1(3));
- ex2();
|