From 62d50e00ae9b066776cb2865d13ad477a71e9e1a Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Wed, 27 May 2026 12:44:22 +0300 Subject: [PATCH] =?UTF-8?q?fix(textbooks):=20infinite=20loop=20=D0=B2=20?= =?UTF-8?q?=C2=A74=20dragRender=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BB=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В 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 --- frontend/textbooks/algebra_8.html | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/frontend/textbooks/algebra_8.html b/frontend/textbooks/algebra_8.html index 25667a2..c061e37 100644 --- a/frontend/textbooks/algebra_8.html +++ b/frontend/textbooks/algebra_8.html @@ -3132,14 +3132,18 @@ function dragRender(){ if(restEl) restEl.textContent = '?'; const resEl = document.getElementById('drag-result'); 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]); - while(mults.size < 5){ - const m = [4,9,16,25,36,49,64,81][Math.floor(Math.random()*8)]; - if(t.n % m === 0) mults.add(m); - else if(mults.size < 3) mults.add(m); + // 1) добавим все настоящие делители-квадраты + for(const m of CAND){ if(t.n % m === 0) mults.add(m); } + // 2) добавим случайные «отвлекающие» до 5 штук, max 30 попыток (страховка от инф.цикла) + 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'); if(!g) return; g.innerHTML = '';