Created
September 5, 2013 15:58
-
-
Save rizalp/6452156 to your computer and use it in GitHub Desktop.
My solution to [Problem 11 project euler](http://projecteuler.net/problem=11). I took way too long to solve it using functional approach, also traversing diagonal grids and pick the tokens drove me nuts.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var _und = require("./underscore-min.js"); //load underscore.js library in the current directory | |
var group = 4; | |
//parse it, because I'm too lazy to create the array by hand | |
var strGrid = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48"; | |
strGrid = strGrid.split(" "); | |
var numGrid = []; | |
for (var x = 0; x < 20; x++){ | |
numGrid.push([]); | |
for (var y = 0; y < 20; y++){ | |
numGrid[x].push( parseInt( strGrid.shift(), 10 ) ); | |
} | |
} | |
function product(base, number){ | |
return base * number; | |
} | |
function xy(isHorizontal, grid){ | |
var token = []; | |
var temp = []; | |
for (var x = 0; x < 20; x++){ | |
//store the temp array first before creating the token | |
if (isHorizontal) { | |
temp = grid[x]; | |
} else { | |
for (var y = 0; y < 20; y++) { | |
temp.push(grid[y][x]); | |
} | |
} | |
//create the token. Use slice(); | |
for (var t = 0; t < temp.length; t++){ | |
token.push(temp.slice(t, t+group)); | |
} | |
temp = []; | |
} | |
return token; | |
}; | |
//hiks, we can't use slice() :( | |
//this is painful to create | |
function diag(isRight, grid){ | |
var token = []; | |
var sign = (isRight) ? 1 : -1; | |
var valX, valY; | |
for (var x = 0; x < grid.length; x++){ | |
for (var y = 0; y < grid[x].length; y++){ | |
token[token.length] = []; | |
for (var xDown = 0; xDown < group; xDown++) { | |
valX = x + xDown; | |
valY = y - (sign * xDown); | |
if ( valX >= grid.length) {continue;} | |
if ( valY >= grid.length || valY < 0 ){continue;} | |
token[token.length-1].push( grid[valX][valY] ); | |
} | |
} | |
} | |
return token; | |
}; | |
var greatestVer = _und.max( | |
_und.map( | |
xy(false, numGrid), | |
function(element){ | |
return _und.reduce ( | |
element, product, 1 | |
); | |
} | |
) | |
); | |
var greatestHor = _und.max( | |
_und.map( | |
xy(true, numGrid), | |
function(element){ | |
return _und.reduce ( | |
element, product, 1 | |
); | |
} | |
) | |
); | |
var greatestDiagLeft = _und.max( | |
_und.map( | |
diag(false, numGrid), | |
function(element){ | |
return _und.reduce ( | |
element, product, 1 | |
); | |
} | |
) | |
); | |
var greatestDiagRight = _und.max( | |
_und.map( | |
diag(true, numGrid), | |
function(element){ | |
return _und.reduce ( | |
element, product, 1 | |
); | |
} | |
) | |
); | |
console.log(_und.max([greatestVer, greatestHor, greatestDiagLeft, greatestDiagRight])); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment