JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://rawgit.com/dankogai/js-combinatorics/master/combinatorics.js"></script>
<form>
nb joueuses: <input name="nbPlayers" type="text" value="10"/>
<input type="submit" value="go"/>
</form>
<hr/>
<div id="stat"></div>
<div id="output"></div>
JavaScript
function hash(x){
var n = 0;
x.forEach(el=>{
n |= 1 << el;
})
return n;
}
function hash2Str(x, maxBit){
var s = [];
for(var i = 1; i<=maxBit; ++i){
x & (1<<i) && (s.push(i))
}
return s.join('-');
}
function compHash(x, n){
return x^n;
}
function teams(n, onFight){
var left = Math.ceil(n/2);
var array_n = [];
for(var i = 1; i<=n; ++i){
array_n.push(i)
}
var hashn = hash(array_n)
var cmb = Combinatorics.combination(array_n, left);
var a = true;
var played = new Set;
while(a = cmb.next()){
var hasha = hash(a);
//if team already played, ignore it
if(played.has(hasha)){
continue
};
//complete the team with what is left
var hashb = compHash(hasha, hashn)
played.add(hasha);
played.add(hashb);
onFight(hasha, hashb);
}
}
var outputNode = document.getElementById('output');
var statNode = document.getElementById('stat');
document.getElementsByTagName('form')[0].onsubmit = function(e){
try{
var n = parseInt(this.nbPlayers.value,10);
var totalFights = 0;
outputNode.innerHTML = '';
teams(n, function(x,y){
outputNode.innerHTML += hash2Str(x, n)+' vs '+hash2Str(y, n)+'<br/>';
++totalFights;
})
statNode.innerHTML = 'total fights: '+totalFights;
}catch(e){
console.log(e)
}
return false;
}