Представляємо кілька варіантів розв'язків даної задачі:
Розв'язок 1. Мова програмування: Python. Автор: Анатолій Сахно.
count = 0
for x1 in range(0,106):
for x2 in range(0,106):
for x3 in range(0,106):
if x1 + x2 + x3 == 105 and x1 <= x2 <= x3:
count += 1
print(count)
Розв'язок 2. Мова програмування: JS. Автор: Олексій Бірюченко.
const getBeadsCombinationAmountOptimized = blackBeadsAmount => {
let amount = 0;
let gap1 = 0, gap2 = 0, gap3 = blackBeadsAmount;
for (gap1; gap1 <= gap2 && gap1 <= gap3; gap1 ++) {
gap2 = gap1;
gap3 = blackBeadsAmount - gap1 - gap2;
for (gap2, gap3; gap2 <= gap3; gap2 ++, gap3 --) {
amount ++;
}
}
return amount;
}
const blackBeadsQuantity = 105;
const beadsCombinationAmount = getBeadsCombinationAmountOptimized(blackBeadsQuantity);
console.log(beadsCombinationAmount);
Розв'язок 3. Мова програмування: PHP. Автор: Віталій Терещук.
//повний перебір
for ($x1=0; $x1<($N-1); $x1++)
for ($x2=0; $x2<($N-1); $x2++)
for ($x3=0; $x3<($N-1); $x3++) {
$ineration++;
if (($x1 + $x2 + $x3 == ($N-3)) & ($x1 <= $x2) & ($x2 <= $x3)) $count++;
}
Розв'язок 4. Мова програмування: PHP. Автор: Віталій Терещук.
//повний перебір з оптимізацію: (А) $x1 перебирається лише в першій третині діапазону;
//(Б) перевірки ($x1 > $x2), ($x2 > $x3) робляться всередині відповідних циклів, і при невиконанні умови ітерації пропускаються
for ($x1=0; $x1<ceil(($N-2)/3); $x1++)
for ($x2=0; $x2<($N-1); $x2++) {
if ($x1 > $x2) continue;
for ($x3=0; $x3<($N-1); $x3++) {
if ($x2 > $x3) continue;
$ineration++;
if ($x1 + $x2 + $x3 == ($N-3)) $count++;
}
}
Розв'язок 5. Мова програмування: PHP. Автор: Віталій Терещук.
//ідентичний варіанту 4. +робиться дамп кожної ітерації
for ($x1=0; $x1<ceil(($N-2)/3); $x1++)
for ($x2=0; $x2<($N-1); $x2++) {
if ($x1 > $x2) continue;
for ($x3=0; $x3<($N-1); $x3++) {
if ($x2 > $x3) continue;
$ineration++;
echo "<br>$x1 $x2 $x3"; //дамп ітерації
if ($x1 + $x2 + $x3 == ($N-3)) {
$count++;
echo '++'; //ставляться ++ для знайденого варіанту
}
}
}
Розв'язок 6. Мова програмування: PHP. Автор: Віталій Терещук.
//повний перебір з оптимізацію: (А) $x1 перебирається лише в першій третині діапазону;
//(Б)перевірки ($x1 > $x2) робляться всередині циклів, і при невиконанні умови ітерації пропускаються
//(В) число $x3 розраховується відразу всередині циклу $x2 (тобто коли вже відомі $x1 та $x2), і якщо воно відповідає умові ($x3>=$x2) фіксується знайдений варіант, цикл для $x3 прибраний як надлишковий
//+робиться дамп знайденого варіанту
for ($x1=0; $x1<ceil(($N-2)/3); $x1++)
for ($x2=0; $x2<($N-1); $x2++) {
if ($x1 > $x2) continue;
$x3 = ($N-3) - $x2 - $x1;
if ($x3>=$x2) {
$ineration++;
echo "<br>$x1 $x2 $x3"; //дамп
$count++;
}
}
Віталій Терещук інтегрував свій код в HTML. Можна спробувати на відповідній сторінці і різних кількостях чоток. Для мене завжди було і є загадкою, навіщо Віталію з такою логічною головою було захищати ті всі дисертації в таких дивних напрямках і стати доктором політичних наук. Не можу збагнути )
На даний час це всі розв'язки, які були отримані. Дякую, Олексій Бірюченко, дякую, Віталій Терещук.