94 lines
2.6 KiB
JavaScript
94 lines
2.6 KiB
JavaScript
const StatRoll = require("./StatRoll");
|
|
const { table } = require('table');
|
|
|
|
|
|
module.exports = class ResultStatistics {
|
|
dices = {};
|
|
stats = {};
|
|
counts = {};
|
|
sums = {};
|
|
|
|
constructor() {
|
|
this.dices = {};
|
|
this.counts[0] = {};
|
|
for (let i = 1; i <= 6; i++) {
|
|
this.dices[i] = 0;
|
|
|
|
this.counts[i] = {};
|
|
}
|
|
|
|
this.stats = {};
|
|
for (let j = 3; j <= 18; j++) {
|
|
this.stats[j] = 0;
|
|
|
|
for (let i = 0; i <= 6; i++) {
|
|
this.counts[i][j] = 0;
|
|
}
|
|
}
|
|
|
|
this.sums = {};
|
|
}
|
|
|
|
/**
|
|
* @param {StatRoll} statRoll
|
|
*/
|
|
add(statRoll) {
|
|
for (let i = 0; i < statRoll.rolls.length; i++) {
|
|
const stat = statRoll.rolls[i];
|
|
|
|
// this.stats[stat.result] += 1;
|
|
|
|
for (const dice of stat.dices) {
|
|
this.dices[dice] += 1;
|
|
}
|
|
}
|
|
|
|
for (let j = 3; j <= 18; j++) {
|
|
let count = statRoll.rolls.filter(r => r.result === j).length;
|
|
|
|
this.counts[count][j] += 1;
|
|
|
|
this.stats[j] += count ? 1 : 0;
|
|
}
|
|
|
|
this.sums[statRoll.sum] = (this.sums[statRoll.sum] ?? 0) + 1;
|
|
}
|
|
|
|
print(norm = 1) {
|
|
const rows = [];
|
|
|
|
rows.push([ '', ...Object.keys(this.stats) ]);
|
|
|
|
rows.push([ 'Probability', ...Object.values(this.stats).map(v => perc(v, norm)) ]);
|
|
rows.push([ 'Missing', ...Object.values(this.counts[0]).map(v => perc(v, norm)) ]);
|
|
|
|
for (let i = 1; i <= 6; i++) {
|
|
const counts = this.counts[i];
|
|
|
|
rows.push([ i, ...Object.values(this.counts[i]).map(v => perc(v, norm)) ]);
|
|
}
|
|
|
|
console.log(table(rows, {
|
|
drawHorizontalLine: (i, rc) => [0, 1, 3, rc].indexOf(i) >= 0,
|
|
}));
|
|
|
|
|
|
const sums = {};
|
|
const spl = 5;
|
|
const from = Math.floor(Object.keys(this.sums).reduce((a, m) => Math.min(a, m)) / spl);
|
|
const to = Math.floor(Object.keys(this.sums).reduce((a, m) => Math.max(a, m)) / spl);
|
|
|
|
for (let i = from; i <= to; i++) {
|
|
const min = spl * i, max = spl * (i + 1) - 1;
|
|
const f = Object.entries(this.sums).filter(([sum, _]) => (sum >= min) && (sum <= max));
|
|
sums[`${min}-${max}`] = perc(f.length ? f.map(([_, count]) => count).reduce((count, sum) => sum + count) : 0, norm);
|
|
}
|
|
|
|
console.log(table([ Object.keys(sums), Object.values(sums) ]))
|
|
}
|
|
|
|
}
|
|
|
|
function perc(a, N) {
|
|
return (a == 0) ? '' : `${(100 * a / N).toLocaleString('ru-RU', { maximumFractionDigits: 2, minimumFractionDigits: 2 })}%`;
|
|
} |