たたみすぎる Array#flattenはprototype.jsでも。
さくっと深さ優先探索したいときに map でこう書く。
aϵ[0,1,2]とbϵ[1,2,4]からa+bが奇数になるペアを求める。
function solve() { var a = [0,1,2]; var b = [1,2,4]; return a.map(function(x) { return b.map(function(y) { if ((x + y) % 2) return [x,y]; else return []; })}).flatten(); }
返してほしかったのは
[[0, 1], [1, 2], [1, 4], [2, 1]]
だが、flatten()につぶされて、
[0, 1, 1, 2, 1, 4, 2, 1]
に。つぶしてほしかったのはツリー構造だけで、[x,y]は残しておいてほしかった。
appendを使って、一段づつ慎重につぶすようにしよう。
Array.prototype.append = function() { return [].concat.apply([],this); } function solve() { var a = [0,1,2]; var b = [1,2,4]; return a.map(function(x) { return b.map(function(y) { if ((x + y) % 2) return [[x,y]]; else return []; }).append()}).append(); }
これでOK.