aureooms-js-array
Version:
array manipulation code bricks for JavaScript
67 lines (45 loc) • 4.59 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.permutations = permutations;
var _ = require('..');
function permutations(iterable, repeat, out) {
// permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
// permutations(range(3), 3) --> 012 021 102 120 201 210
var pool, i, j, w, len, indices, cycles, x, tmp;
pool = iterable;
len = pool.length;
if (repeat > len) {
return out;
}
indices = (0, _.range)(0, len, 1, []);
cycles = (0, _.range)(len, len - repeat, -1, []);
out.push((0, _.pick)(pool, indices.slice(0, repeat), []));
if (repeat === 0 || len === 0) {
return out;
}
for (;;) {
i = repeat;
while (i--) {
--cycles[i];
if (cycles[i] === 0) {
x = indices[i];
indices.splice(i, 1);
indices.push(x);
cycles[i] = len - i;
} else {
j = cycles[i];
tmp = indices[i];
indices[i] = indices[len - j];
indices[len - j] = tmp;
out.push((0, _.pick)(pool, indices.slice(0, repeat), []));
break;
}
}
if (i === -1) {
return out;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXAvcGVybXV0YXRpb25zLmpzIl0sIm5hbWVzIjpbInBlcm11dGF0aW9ucyIsIml0ZXJhYmxlIiwicmVwZWF0Iiwib3V0IiwicG9vbCIsImkiLCJqIiwidyIsImxlbiIsImluZGljZXMiLCJjeWNsZXMiLCJ4IiwidG1wIiwibGVuZ3RoIiwicHVzaCIsInNsaWNlIiwic3BsaWNlIl0sIm1hcHBpbmdzIjoiOzs7OztRQUVnQkEsWSxHQUFBQSxZOztBQUZoQjs7QUFFTyxTQUFTQSxZQUFULENBQXVCQyxRQUF2QixFQUFpQ0MsTUFBakMsRUFBeUNDLEdBQXpDLEVBQStDOztBQUVyRDtBQUNBOztBQUVBLEtBQUlDLElBQUosRUFBVUMsQ0FBVixFQUFhQyxDQUFiLEVBQWdCQyxDQUFoQixFQUFtQkMsR0FBbkIsRUFBd0JDLE9BQXhCLEVBQWlDQyxNQUFqQyxFQUF5Q0MsQ0FBekMsRUFBNENDLEdBQTVDOztBQUVBUixRQUFPSCxRQUFQO0FBQ0FPLE9BQU1KLEtBQUtTLE1BQVg7O0FBR0EsS0FBS1gsU0FBU00sR0FBZCxFQUFvQjtBQUNuQixTQUFPTCxHQUFQO0FBQ0E7O0FBR0RNLFdBQVUsYUFBTyxDQUFQLEVBQVVELEdBQVYsRUFBZSxDQUFmLEVBQWtCLEVBQWxCLENBQVY7QUFDQUUsVUFBUyxhQUFPRixHQUFQLEVBQVlBLE1BQU1OLE1BQWxCLEVBQTBCLENBQUMsQ0FBM0IsRUFBOEIsRUFBOUIsQ0FBVDs7QUFFQUMsS0FBSVcsSUFBSixDQUFVLFlBQU1WLElBQU4sRUFBWUssUUFBUU0sS0FBUixDQUFlLENBQWYsRUFBa0JiLE1BQWxCLENBQVosRUFBd0MsRUFBeEMsQ0FBVjs7QUFFQSxLQUFLQSxXQUFXLENBQVgsSUFBZ0JNLFFBQVEsQ0FBN0IsRUFBaUM7QUFDaEMsU0FBT0wsR0FBUDtBQUNBOztBQUVELFVBQVk7O0FBRVhFLE1BQUlILE1BQUo7O0FBRUEsU0FBUUcsR0FBUixFQUFjOztBQUViLEtBQUVLLE9BQU9MLENBQVAsQ0FBRjs7QUFFQSxPQUFLSyxPQUFPTCxDQUFQLE1BQWMsQ0FBbkIsRUFBdUI7O0FBRXRCTSxRQUFJRixRQUFRSixDQUFSLENBQUo7O0FBRUFJLFlBQVFPLE1BQVIsQ0FBZVgsQ0FBZixFQUFrQixDQUFsQjtBQUNBSSxZQUFRSyxJQUFSLENBQWFILENBQWI7O0FBRUFELFdBQU9MLENBQVAsSUFBWUcsTUFBTUgsQ0FBbEI7QUFDQSxJQVJELE1BVUs7O0FBRUpDLFFBQUlJLE9BQU9MLENBQVAsQ0FBSjs7QUFFQU8sVUFBTUgsUUFBUUosQ0FBUixDQUFOO0FBQ0FJLFlBQVFKLENBQVIsSUFBYUksUUFBUUQsTUFBTUYsQ0FBZCxDQUFiO0FBQ0FHLFlBQVFELE1BQU1GLENBQWQsSUFBbUJNLEdBQW5COztBQUVBVCxRQUFJVyxJQUFKLENBQVUsWUFBTVYsSUFBTixFQUFZSyxRQUFRTSxLQUFSLENBQWUsQ0FBZixFQUFrQmIsTUFBbEIsQ0FBWixFQUF3QyxFQUF4QyxDQUFWO0FBQ0E7QUFDQTtBQUVEOztBQUVELE1BQUtHLE1BQU0sQ0FBQyxDQUFaLEVBQWdCO0FBQ2YsVUFBT0YsR0FBUDtBQUNBO0FBRUQ7QUFFRCIsImZpbGUiOiJwZXJtdXRhdGlvbnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5nZSAsIHBpY2sgfSBmcm9tICcuLicgO1xuXG5leHBvcnQgZnVuY3Rpb24gcGVybXV0YXRpb25zKCBpdGVyYWJsZSwgcmVwZWF0LCBvdXQgKSB7XG5cblx0Ly8gcGVybXV0YXRpb25zKCdBQkNEJywgMikgLS0+IEFCIEFDIEFEIEJBIEJDIEJEIENBIENCIENEIERBIERCIERDXG5cdC8vIHBlcm11dGF0aW9ucyhyYW5nZSgzKSwgMykgLS0+IDAxMiAwMjEgMTAyIDEyMCAyMDEgMjEwXG5cblx0dmFyIHBvb2wsIGksIGosIHcsIGxlbiwgaW5kaWNlcywgY3ljbGVzLCB4LCB0bXA7XG5cblx0cG9vbCA9IGl0ZXJhYmxlO1xuXHRsZW4gPSBwb29sLmxlbmd0aDtcblxuXG5cdGlmICggcmVwZWF0ID4gbGVuICkge1xuXHRcdHJldHVybiBvdXQ7XG5cdH1cblxuXG5cdGluZGljZXMgPSByYW5nZSggMCwgbGVuLCAxLCBbXSApO1xuXHRjeWNsZXMgPSByYW5nZSggbGVuLCBsZW4gLSByZXBlYXQsIC0xLCBbXSApO1xuXG5cdG91dC5wdXNoKCBwaWNrKCBwb29sLCBpbmRpY2VzLnNsaWNlKCAwLCByZXBlYXQgKSwgW10gKSApO1xuXG5cdGlmICggcmVwZWF0ID09PSAwIHx8IGxlbiA9PT0gMCApIHtcblx0XHRyZXR1cm4gb3V0O1xuXHR9XG5cblx0Zm9yICggOyA7ICkge1xuXG5cdFx0aSA9IHJlcGVhdDtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHQtLWN5Y2xlc1tpXTtcblxuXHRcdFx0aWYgKCBjeWNsZXNbaV0gPT09IDAgKSB7XG5cblx0XHRcdFx0eCA9IGluZGljZXNbaV07XG5cblx0XHRcdFx0aW5kaWNlcy5zcGxpY2UoaSwgMSk7XG5cdFx0XHRcdGluZGljZXMucHVzaCh4KTtcblxuXHRcdFx0XHRjeWNsZXNbaV0gPSBsZW4gLSBpO1xuXHRcdFx0fVxuXG5cdFx0XHRlbHNlIHtcblxuXHRcdFx0XHRqID0gY3ljbGVzW2ldO1xuXG5cdFx0XHRcdHRtcCA9IGluZGljZXNbaV07XG5cdFx0XHRcdGluZGljZXNbaV0gPSBpbmRpY2VzW2xlbiAtIGpdO1xuXHRcdFx0XHRpbmRpY2VzW2xlbiAtIGpdID0gdG1wO1xuXG5cdFx0XHRcdG91dC5wdXNoKCBwaWNrKCBwb29sLCBpbmRpY2VzLnNsaWNlKCAwLCByZXBlYXQgKSwgW10gKSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaSA9PT0gLTEgKSB7XG5cdFx0XHRyZXR1cm4gb3V0O1xuXHRcdH1cblxuXHR9XG5cbn1cbiJdfQ==