function range(a, b, step = 1) {
if (b == undefined) [a, b] = [0, a];
let arr = [];
for (let i = a; step > 0 ? i < b : i > b; i += step) arr.push(i);
return arr;
}
class Counter {
$ = 0n;
constructor(params) {
this.min = params.min || 0;
this.max = params.max || 9;
this.len = params.len || 0;
this.radix = BigInt(this.max - this.min + 1);
if (params.$) {
this.$ = BigInt(params.$);
return;
}
if (params.inv) {
this.$ = this.radix ** BigInt(this.len) - 1n;
}
}
get() {
let arr = [];
let lastMul = this.$;
for (let i of range(this.len)) {
let mul = ~~(lastMul / this.radix);
arr.unshift(Number((lastMul - mul * this.radix) + BigInt(this.min)));
lastMul = mul;
}
return arr;
}
}
window.onload = function () {
let counter = new Counter({ max: 9, len: 3, inv: true });
console.log(counter.get());
counter.$++;
console.log(counter.get());
counter.$ += 85n;
console.log(counter.get());
}
P.S. для переменной $ использую BigInt, потому что в случае большого количества разрядов и основания счисления, она может стать Infinity