particion
Version:
Una CLI para ver las particiones de un número.
70 lines (59 loc) • 2.16 kB
JavaScript
var chalk = require('chalk');
module.exports = async (args) => {
particion(args, function(){
});
}
// la función principal
function particion(numero){
// lista con una solución parcial
var parcial = [];
// respuesta con todas las particiones
var particiones = [];
// entrada al método :)
particionar(numero, parcial, particiones);
//console.log(particiones);
var text = " ";
for(k = 0; k<particiones.length; k++){
var text = " ";
for(h = 0; h<22-1.5*numero; h++){
text = text+ " "
}
for(l = 0; l<particiones[k].length; l++){
if (l== 0){
text = text + particiones[k][l];
} else {
text = text + "+" + particiones[k][l];
}
}
console.log(chalk.white(text));
}
}
function crearCopia(arreglo){
// ineficiencia al mil, culpa de la relación asíncrona de javascript
var copia = [];
for(var j = 0; j < arreglo.length; j++){
copia[j] = arreglo[j]
}
return copia;
}
// una función que no retorna, así se ahorra memoria XD {algo de eficiencia por lo menos ;)}
function particionar(numero, parcial, particiones) {
if(numero == 0){
// Terminó de hacer un ciclo y contiene una solución
var copia = crearCopia(parcial);
particiones.push(copia);
} else {
// la parte interesante ^^
for(var i = numero; i > 0; i--){
// Si la lista está vacía o se obtiene el último elemento de la lista para compararlo con el iterador
if(parcial.length == 0 || parcial[parcial.length-1] >= i){
// guardamos parte de una solución
parcial.push(i);
// encontramos otras posibles soluciones con lo restante
particionar(numero-i, parcial, particiones);
// eliminar el último elemento del arreglo (solución inválida o repetida)
parcial.pop();
}
}
}
}