JSFiddle - React, Tailwind, and code Playground
Generate random decklists, sort and calculate distance between card ids
by skibulk
JavaScript
console.clear();
var i, j, k;
var collectionSize = 10000;
var deckCount = 5;
var deckSize = 30;
var decks = [];
var decks2 = [];
var decks3 = [];
var decks4 = [];
var decks5 = [];
for (i = 0; i < deckCount; i++) {
var deck = [];
for (j = deckSize; j > 0; j--) {
var card = Math.floor(Math.random() * collectionSize);
// Simulate clustering
if(j < deckSize*0.1){
var card = Math.floor(Math.random() * collectionSize/10);
} else {
var card = Math.floor((Math.random() * collectionSize/10) + (collectionSize*1/10));
}
if (deck.includes(card)) {
j++;
} else {
deck.push(card);
}
}
deck.sort(function(a, b) {
return a - b;
});
var deck2 = [];
deck2.push(deck[0]);
for (j = 1; j < deckSize; j++) {
deck2.push(deck[j] - deck[j - 1]);
}
var deck3 = [];
for (j = 0; j < deckSize; j++) {
deck3.push( base95( deck[j] ) );
}
decks.push(deck);
decks2.push(deck2);
decks3.push(deck3.join(" "));
decks4.push(Uint16Array.from(deck2));
}
// sort and find value at the 2/3 position
//var quantile = decks2[0].slice().sort(function(a,b){return a-b})[19];
//var bits = quantile.toString(2).length + 1;
//var bits = Math.floor(average(decks2[0])).toString(2).length + 1;
//console.log(bits);
console.log(decks2[0].join());
decks5 = listTenToTwo(decks2[0], bestChunkSize(decks2[0]) + 1);
decks6 = binaryPackIntegers(decks2[0]);
decks = decks.join(',');
decks2 = decks2.join(',');
decks3 = decks3.join(' ');
console.log(decks.length, decks);
console.log(decks2.length, decks2);
console.log(decks3.length, decks3);
console.log(decks4);
console.log(decks5.length/8, decks5);
console.log(decks6.length/8, decks6);
//function average(arr) {
// return arr.reduce((a, b) => a + b, 0) / arr.length;
//}
// http://www.kinematicsoup.com/news/2016/9/6/data-compression-bit-packing-101
// Assuming a 1-byte header
function bestChunkSize(arr){
var bitCounts = [];
var nextSize = Infinity;
var maxSize = 0;
...