やり直し算数プログラミング#2 組み合わせ
すいません、これただの組み合わせでした。permutaionじゃなくてcombinationのほう。
function $A(nodes) { var a = []; for (var i = 0; i < nodes.length; i++) { var n = (nodes[i]); a.push(n); } return a; } (function combination() { var arg = $A(arguments); var cdr = arg.shift(); var tail = [ [cdr], [] ]; if ( arguments.length == 1) return tail; else { var pairs = []; tail.forEach( function (n) { combination.apply(this, arg).forEach( function (m) { pairs.push(n.concat(m)); } ); } ); return pairs; } }).apply(this, [1,2,3]);
まだいける。forEachとpushはreduceでなくせると思って試行錯誤するもわからなくて降参。
UNIXコマンドで順列・組み合わせの問題を解こうのpermstrみたらflatmapがある。こういうときはflatなのか。
Array.prototype.flatten = function () { var a = [] for (var i = 0; i < this.length; i++){ if ( this[i] instanceof Array ) a = a.concat(this[i]); else a.push(); } return a; }; (function combination() { var arg = $A(arguments); var cdr = arg.shift(); if ( arguments.length == 0) { return [ [] ]; } else { return [ [cdr], [] ].map( function (n) { return permutation.apply(this, arg).map( function (m) { return (n.concat(m)); } ); } ).flatten(); } }).apply(this, [1,2,3]);
で
[ [1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], [] ]
に。もうちょっときれいになる気もする。
原田先生、8年遅れのいまごろLISPをどう書いたらいいのかわかった気がします。すいません。