обычно добавляют, что это же означает, что то, что событие B произошло не даёт никакой информации относительно события A
Сколько всего будет вариантов у ряда состоящего из 5 цифр, каждое из которых принимает одно из двух нигде не повторяющихся значений ?
Сколько всего будет вариантов у ряда состоящего из 2 цифр, каждое из которых принимает одно из пяти нигде не повторяющихся значений ?
// ------- utls ----------
function getRand(n) {
return Math.floor(Math.random() * n);
}
function fact(n) {
let f = 1;
for (let i = 2; i <= n; ++i) {
f *= i;
}
return f;
}
function shuffle(arr) {
for (let i = arr.length - 1; i > 0; --i) {
const r = getRand(i + 1);
const t = arr[r];
arr[r] = arr[i];
arr[i] = t;
}
return arr;
}
// ------- classes ----------
class Str extends String {
getCount() { return 1; }
}
class Line {
arr = [];
toString() {
return this.arr.slice(0).join('');
}
getCount() {
return this.arr.reduce((r, a) => r * a.getCount(), 1);
}
}
class Select {
arr = [];
toString() {
return this.arr[getRand(this.arr.length)].toString();
}
getCount() {
return this.arr.reduce((r, a) => r + a.getCount(), 0);
}
}
class Order extends Line {
arr = [];
toString() {
return shuffle(this.arr).join('');
}
getCount() {
return fact(this.arr.length) * this.arr.reduce((r, a) => r * a.getCount(), 1);
}
}
// ------- parse ----------
function parse(str) {
const reg = /[{}|\[\]]/g;
let start = 0;
let line = new Line();
const stack = [{
arr: [line],
}];
// debugger;
while (true) {
const match = reg.exec(str);
if (!match) {
if (str.length - start > 0) {
line.arr.push(new Str(str.substring(start)));
}
break;
}
if (match.index - start > 0) {
line.arr.push(new Str(str.substring(start, match.index)));
}
start = reg.lastIndex;
const c = match[0];
if (c === '{' || c === '[') {
const container = c === '{' ? new Select() : new Order();
line.arr.push(container);
stack.push(container);
line = new Line();
container.arr.push(line);
} else {
if (stack.length < 2) {
return null;
}
const container = stack[stack.length - 1];
if (line.arr.length === 1) {
container.arr[container.arr.length - 1] = line.arr[line.arr.length - 1];
}
if (c === '|') {
line = new Line();
container.arr.push(line);
} else {
stack.pop();
const arr = stack[stack.length - 1].arr;
line = arr[arr.length - 1];
}
}
}
return stack.length > 1 ? null : line.arr.length === 1 ? line.arr[0] : line;
}
// --------
const p = parse('{ttt|2}qqq[1|2|3{[4|q]|5}]');
console.log(p.toString());
console.log(p.getCount());
console.log(p);