fix(textbooks): infinite loop в §4 dragRender зависал страницу
В dragRender() (Drag 'упрости √') был while-цикл, который требовал 5 уникальных значений из набора [4,9,16,25,36,49,64,81]. Логика: - если делит t.n нацело → всегда добавляем - иначе → добавляем только если size<3 Для t.n=50: единственный делитель из набора это 25. После добавления sq+2 произвольных (size=3), цикл требует только делители — других нет → бесконечный цикл → зависание. Аналогично ломалось на: 200, 48 и др. Фикс: 1) сначала добавляем ВСЕ делители-квадраты из расширенного набора (100, 121 включены) 2) затем добивает случайными до 5 штук с лимитом 30 итераций (страховка) 3) берётся slice(0,5) на случай если ВСЕ 10 кандидатов делят t.n
This commit is contained in:
@@ -3132,14 +3132,18 @@ function dragRender(){
|
|||||||
if(restEl) restEl.textContent = '?';
|
if(restEl) restEl.textContent = '?';
|
||||||
const resEl = document.getElementById('drag-result');
|
const resEl = document.getElementById('drag-result');
|
||||||
if(resEl) resEl.textContent = '';
|
if(resEl) resEl.textContent = '';
|
||||||
// generate multipliers
|
// generate multipliers — сначала ВСЕ делители-квадраты из набора, потом добавки
|
||||||
|
const CAND = [4,9,16,25,36,49,64,81,100,121];
|
||||||
const mults = new Set([t.sq]);
|
const mults = new Set([t.sq]);
|
||||||
while(mults.size < 5){
|
// 1) добавим все настоящие делители-квадраты
|
||||||
const m = [4,9,16,25,36,49,64,81][Math.floor(Math.random()*8)];
|
for(const m of CAND){ if(t.n % m === 0) mults.add(m); }
|
||||||
if(t.n % m === 0) mults.add(m);
|
// 2) добавим случайные «отвлекающие» до 5 штук, max 30 попыток (страховка от инф.цикла)
|
||||||
else if(mults.size < 3) mults.add(m);
|
let safety = 0;
|
||||||
|
while(mults.size < 5 && safety++ < 30){
|
||||||
|
const m = CAND[Math.floor(Math.random()*CAND.length)];
|
||||||
|
mults.add(m);
|
||||||
}
|
}
|
||||||
const arr = [...mults].sort((a,b)=>a-b);
|
const arr = [...mults].slice(0,5).sort((a,b)=>a-b);
|
||||||
const g = document.getElementById('drag-mults');
|
const g = document.getElementById('drag-mults');
|
||||||
if(!g) return;
|
if(!g) return;
|
||||||
g.innerHTML = '';
|
g.innerHTML = '';
|
||||||
|
|||||||
Reference in New Issue
Block a user