dice parser
This commit is contained in:
parent
f8fa3ec924
commit
e6d8583220
89
lib/dice.ts
Normal file
89
lib/dice.ts
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
export class Dice {
|
||||||
|
private count!: number;
|
||||||
|
private sides!: number;
|
||||||
|
|
||||||
|
constructor(dice: string) {
|
||||||
|
this.parseDice(dice);
|
||||||
|
}
|
||||||
|
|
||||||
|
private parseDice(dice: string) {
|
||||||
|
const [c, s] = dice.split(/[dD]/);
|
||||||
|
this.count = Number(c);
|
||||||
|
this.sides = Number(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public roll() {
|
||||||
|
let total = 0;
|
||||||
|
for (let i = 0; i < this.count; i++) {
|
||||||
|
total += this.rollSingle();
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
private rollSingle() {
|
||||||
|
return Math.ceil(Math.random() * this.sides);
|
||||||
|
}
|
||||||
|
|
||||||
|
public rollAvg() {
|
||||||
|
return this.roll() / this.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public rollTimes(times: number) {
|
||||||
|
let total = 0;
|
||||||
|
for (let i = 0; i < times; i++) {
|
||||||
|
total += this.roll();
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
public rollTimesAvg(times: number) {
|
||||||
|
return this.rollTimes(times) / times;
|
||||||
|
}
|
||||||
|
|
||||||
|
public getNormalizedRollDistribution(): Record<number, number> {
|
||||||
|
const distribution: Record<number, number> = this.computeDistribution();
|
||||||
|
|
||||||
|
// Normalize the distribution
|
||||||
|
const totalOutcomes = Math.pow(this.sides, this.count);
|
||||||
|
for (const sum in distribution) {
|
||||||
|
if (distribution.hasOwnProperty(sum)) {
|
||||||
|
distribution[sum] /= totalOutcomes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return distribution;
|
||||||
|
}
|
||||||
|
|
||||||
|
public getRollDistribution(): Record<number, number> {
|
||||||
|
return this.computeDistribution();
|
||||||
|
}
|
||||||
|
|
||||||
|
private computeDistribution(): Record<number, number> {
|
||||||
|
const distribution: Record<number, number> = {};
|
||||||
|
|
||||||
|
// Helper function to compute the sum distribution for given number of dice
|
||||||
|
const computeSumDistribution = (
|
||||||
|
dice: number,
|
||||||
|
sides: number,
|
||||||
|
currentSum: number,
|
||||||
|
currentDice: number
|
||||||
|
): void => {
|
||||||
|
if (currentDice === dice) {
|
||||||
|
distribution[currentSum] = (distribution[currentSum] || 0) + 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (let i = 1; i <= sides; i++) {
|
||||||
|
computeSumDistribution(dice, sides, currentSum + i, currentDice + 1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Compute distribution
|
||||||
|
computeSumDistribution(this.count, this.sides, 0, 0);
|
||||||
|
|
||||||
|
return distribution;
|
||||||
|
}
|
||||||
|
// STATIC
|
||||||
|
static isDice(d: string) {
|
||||||
|
return /\d+[dD]\d+/.test(d);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user