2015-07-11 27 views
8

Sto tentando di creare una funzione _.combinations (mixaggio di sottolineatura) che richiede tre parametri arr, pockets, duplicates. Ecco un test che ho progettato per mostrare come dovrebbe essere il comportamento.Funzione che restituisce una matrice di combinazioni di array

expect(_.combinations([1, 2], 1, false)).to.be.equal([[1],[2]]) 
expect(_.combinations([1, 2], 1, true)).to.be.equal([[1],[2]]) 
expect(_.combinations([1, 2, 3], 2, false)).to.be.equal([[1,2],[1,3],[2,3]]) 
expect(_.combinations([1, 2, 3], 2, true)).to.be.equal([[1,2],[1,3],[2,3],[2,1],[3,1],[3,2]]) 
expect(_.combinations([1, 2, 3, 4], 3, false)).to.be.equal([[1,2,3],[1,2,4],[1,3,4],[2,1,4],[2,3,4],[3,4,1]]) 
expect(_.combinations([1, 2, 3, 4], 3, true)).to.be.equal([[1,2,3],[1,2,4],[1,3,4],[2,1,4],[2,3,1],[2,3,4],[3,1,2],[3,4,1],[3,4,2],[4,1,2],[4,1,3],[4,2,3]]) 

Mi chiedevo prima di andare a creare questa funzione se esisteva già in una libreria. Forse questa funzione specifica ha già un nome che non conosco.

C'è qualcosa là fuori che fa questo?

+2

Come punto di partenza, si può fare uso di un [insieme potenza] funzione (https://en.wikipedia.org/wiki/Power_set) (basta cercare per esso, un sacco di persone hanno scritto per funzioni it) per recuperare le combinazioni. Da lì dovrebbe essere relativamente semplice da filtrare in base agli altri argomenti –

risposta

6

This La libreria ha una buona funzione. Penso che abbia praticamente quello di cui hai bisogno.

var combinatorics=require('/path/to/combinatorics'); 

var a = [1,2,3]; 

var ans1=combinatorics.permutation(a,2); 
console.log(ans1.toArray());// [[1,2],[2,1],[1,3],[3,1],[2,3],[3,2]] like when duplicates is set to true 


var ans2=combinatorics.combination(a,2); 
console.log(ans2.toArray());//[[1,2],[2,1],[1,3],[3,1],[2,3],[3,2]] like when duplicates is set to false 
+0

Questo sembra incredibile Sono abbastanza sicuro che questo ha tutto quello che voglio :) – ThomasReggi

+0

sì ... il repository github ha istruzioni e esempi abbastanza chiari e ... – Pravin