Files
Learn_System/frontend/textbooks/physics_11_ch7.html
T
Maxim Dolgolyov 660e7e2747 feat(gamification): Phase 1 — full kill-switch + textbook XP wrapping
Until now the 'gamification' feature flag did nothing: it had no row in
app_settings, the admin couldn't toggle it, awardXP/awardCoins ignored
it, and the CSS only hid three dashboard widgets — XP bars in textbooks
stayed visible regardless.

Phase 1 closes every hole.

Backend (source of truth):
  • migration 029 seeds feature_gamification_enabled=1
  • new isGamificationEnabled() helper in gamification/_shared.js with a
    30s cache + invalidateGamificationCache() for instant admin toggles
  • awardXP / awardCoins / updateStreak / unlockAchievement /
    checkAchievements all bail out when the flag is off
  • /api/gamification/* and /api/shop/* (user routes) return 404 when
    disabled; admin routes remain open so the switch itself is reachable
  • adminController.updateFeatures gains 'gamification' in the allow-list
    and invalidates the cache on flip

Frontend:
  • LS.isGamificationEnabled() (synchronous, populated by loadFeatures)
    so xp.js + applyCosmetics can bail without a round-trip
  • xp.js load/add/flush become no-ops when the flag is off
  • applyCosmetics skips the round-trip when off
  • CSS .no-gamification rule expanded to cover .hero-xp-badge, .po-xp,
    .xp-card, .xp-bar, #frames-section, and a universal [data-gamified]
    hook for future blocks

Textbooks (Variant 2 of the plan):
  • backend/scripts/wrap_textbook_xp.py — idempotent script that adds
    data-gamified to 167 XP tags across 63 textbook files (chapters +
    hubs, all subjects/grades). Single CSS rule now hides everything.

Verified end-to-end: with the flag off, awardXP/awardCoins write nothing;
flipping back restores normal behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 19:43:24 +03:00

996 lines
79 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<title>Физика 11 · Глава 7 · «Ядерная физика»</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js"
onload="renderMathInElement(document.body,{delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false})"></script>
<script src="/js/api.js" defer></script>
<script src="/js/xp.js" defer></script>
<script src="/js/phys-fx.js?v=1"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800;900&family=Unbounded:wght@700;800;900&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
<style>
:root{
--bg:#fafafa; --card:#fff; --card-soft:#f8fafc; --text:#0f172a; --ink:#0f172a; --muted:#64748b;
--border:#e2e8f0; --sh:0 1px 3px rgba(0,0,0,.06); --sh2:0 4px 14px rgba(0,0,0,.08);
--pri:#e11d48; --pri2:#9f1239; --pri-soft:#ffe4e6;
--acc:#f43f5e; --acc2:#be123c; --acc-soft:#fecdd3;
--ok:#10b981; --ok-bg:#d1fae5; --warn:#f59e0b; --warn-bg:#fef3c7;
--bad:#ef4444; --fail:#dc2626; --fail-bg:#fee2e2;
}
.dark{--bg:#1f0612; --card:#2a0a1b; --card-soft:#321020; --text:#ffe4e6; --ink:#ffe4e6; --muted:#fda4af; --border:#9f1239}
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.55;font-size:15px}
button,input,select,textarea{font-family:inherit;font-size:inherit}
button{cursor:pointer;border:0;background:transparent;color:inherit}
a{color:inherit;text-decoration:none}
.ic{width:16px;height:16px;display:inline-block;flex-shrink:0;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:middle}
.hdr{position:relative;background:linear-gradient(110deg,#9f1239 0%,#e11d48 55%,#fecdd3 100%);color:#fff;padding:46px 22px 30px;overflow:hidden;border-bottom:2px solid rgba(254,205,211,.2);min-height:130px}
.hdr::before{content:'ГЛАВА 7';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Unbounded',sans-serif;font-size:clamp(5rem,15vw,11rem);font-weight:900;letter-spacing:-.04em;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.12);line-height:1;pointer-events:none;user-select:none;z-index:0}
.hdr-row{position:relative;z-index:1;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.hdr h1{font-family:'Unbounded',sans-serif;font-size:1.5rem;font-weight:900;letter-spacing:-.01em;line-height:1.3;padding-top:4px}
.hdr-sub{font-size:.85rem;opacity:.88;margin-top:6px;font-weight:500;line-height:1.4}
.hdr-side{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.hdr-btn{padding:7px 12px;border-radius:9px;background:rgba(255,255,255,.14);color:#fff;font-weight:600;font-size:.82rem;display:inline-flex;align-items:center;gap:6px;transition:background .15s;text-decoration:none}
.hdr-btn:hover{background:rgba(255,255,255,.24)}
.main{max-width:1240px;margin:0 auto;padding:22px;width:100%;display:grid;grid-template-columns:1fr 280px;gap:24px}
@media(max-width:980px){.main{grid-template-columns:1fr;padding:14px}}
.col-main{min-width:0}
.hero{background:linear-gradient(135deg,var(--pri-soft) 0%,var(--acc-soft) 50%,var(--pri-soft) 100%);background-size:200% 200%;animation:heroShift 12s ease-in-out infinite;border:1px solid var(--border);border-radius:18px;padding:24px 22px;margin-bottom:24px;position:relative;overflow:hidden}
@keyframes heroShift{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
.hero::before{content:'\2622';position:absolute;right:0;top:-30px;font-size:clamp(2rem,12vw,8rem);font-weight:900;color:var(--pri);opacity:.10;line-height:1;pointer-events:none;font-family:'Unbounded',sans-serif}
.hero h2{font-family:'Unbounded',sans-serif;font-size:1.55rem;font-weight:800;color:var(--pri2);margin-bottom:10px;letter-spacing:-.01em}
.hero p{font-size:.95rem;color:var(--text);opacity:.88;margin-bottom:14px;max-width:640px}
.hero-row{display:flex;gap:14px;flex-wrap:wrap;align-items:center}
.btn-primary{padding:11px 22px;background:linear-gradient(135deg,var(--pri),var(--pri2));color:#fff;border-radius:11px;font-weight:700;font-size:.92rem;display:inline-flex;align-items:center;gap:8px;box-shadow:var(--sh2);transition:transform .15s,box-shadow .15s}
.btn-primary:hover{transform:translateY(-1px);box-shadow:0 8px 28px rgba(0,0,0,.18)}
.hero-progress{flex:1;min-width:200px;max-width:280px}
.hp-label{font-size:.74rem;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;display:block;margin-bottom:5px}
.hp-bar{height:8px;background:rgba(0,0,0,.12);border-radius:5px;overflow:hidden}
.hp-fill{height:100%;background:linear-gradient(90deg,var(--pri),var(--acc));border-radius:5px;width:0%;transition:width .6s cubic-bezier(.16,1,.3,1)}
.hp-text{font-size:.78rem;color:var(--muted);font-weight:700;margin-top:4px;display:block}
.hero-xp-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:linear-gradient(135deg,var(--warn,#f59e0b),var(--pri));color:#fff;border-radius:99px;font-size:.82rem;font-weight:800;letter-spacing:.02em;box-shadow:0 4px 12px rgba(0,0,0,.18);font-family:'Unbounded',sans-serif}
.psel{margin-bottom:24px}
.psel-title{font-size:.72rem;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.08em;margin-bottom:10px}
.psel-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px}
.psel-card{background:var(--card);border:1.5px solid var(--border);border-radius:13px;padding:14px;cursor:pointer;transition:transform .2s,box-shadow .2s,border-color .2s;text-align:left;position:relative}
.psel-card:hover{transform:translateY(-3px);box-shadow:var(--sh2);border-color:var(--pri)}
.psel-card.active{border-color:var(--pri);background:linear-gradient(135deg,var(--pri-soft),var(--card));box-shadow:var(--sh2)}
.psel-card.active::after{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,var(--pri),var(--acc));border-radius:13px 13px 0 0}
.psel-num{font-family:'Unbounded',sans-serif;font-size:.72rem;font-weight:800;color:var(--pri);text-transform:uppercase;letter-spacing:.08em;margin-bottom:5px}
.psel-name{font-size:.8rem;font-weight:700;color:var(--text);line-height:1.3;margin-bottom:8px}
.psel-prog{height:4px;background:rgba(0,0,0,.10);border-radius:3px;overflow:hidden}
.psel-prog-fill{height:100%;background:var(--pri);width:0%;transition:width .4s}
.psel-card.final{background:linear-gradient(135deg,var(--warn-bg),var(--pri-soft))}
.psel-card.final .psel-num{color:var(--warn)}
.psel-card.locked{opacity:.55}
.psel-card .psel-done{position:absolute;top:6px;right:6px;width:18px;height:18px;border-radius:50%;background:#10b981;display:none;align-items:center;justify-content:center;box-shadow:0 2px 6px rgba(16,185,129,.45);z-index:2}
.psel-card .psel-done svg{width:11px;height:11px;stroke:#fff;fill:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.psel-card.done .psel-done{display:flex}
.sec{display:none;position:relative;animation:fadeIn .35s ease}
.sec.active{display:block}
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.sec::before{content:attr(data-watermark);position:absolute;right:-20px;top:10%;font-family:'Unbounded',sans-serif;font-size:clamp(6rem,18vw,14rem);font-weight:900;color:transparent;-webkit-text-stroke:1.5px var(--pri-soft);line-height:1;pointer-events:none;user-select:none;z-index:0;opacity:.45}
.sec-header{margin-bottom:22px;padding-bottom:14px;border-bottom:2px solid var(--pri-soft);position:relative;z-index:1}
.sec-num{display:inline-block;padding:4px 10px;background:linear-gradient(135deg,var(--pri),var(--pri2));color:#fff;border-radius:7px;font-family:'Unbounded',sans-serif;font-size:.78rem;font-weight:800;letter-spacing:.04em;margin-bottom:8px}
.sec-h{font-family:'Unbounded',sans-serif;font-size:1.5rem;font-weight:800;color:var(--pri2);letter-spacing:-.01em;line-height:1.25}
.card{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:18px 20px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.04),0 8px 24px rgba(0,0,0,.04);position:relative;z-index:1;transition:transform .25s cubic-bezier(.16,1,.3,1),box-shadow .25s}
.card:hover{transform:translateY(-2px);box-shadow:0 4px 10px rgba(0,0,0,.06),0 16px 36px rgba(0,0,0,.08)}
.card-header{display:flex;align-items:center;gap:10px;margin-bottom:12px;padding-bottom:10px;border-bottom:1px dashed var(--border)}
.card-icon{width:32px;height:32px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff}
.card-icon.repeat{background:#0ea5e9}.card-icon.theory{background:#8b5cf6}.card-icon.algo{background:#f59e0b}.card-icon.rule{background:#e11d48}.card-icon.example{background:#10b981}
.card-icon .ic{width:18px;height:18px}
.card-title{font-family:'Unbounded',sans-serif;font-size:.82rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);flex:1}
.card-num{font-size:.74rem;font-weight:700;color:var(--muted);background:var(--pri-soft);padding:3px 7px;border-radius:5px}
.card-body{font-size:.94rem;line-height:1.65}
.card-body p{margin-bottom:8px}
.card-body p:last-child{margin-bottom:0}
.card-body ul,.card-body ol{margin:6px 0 6px 22px;line-height:1.7}
.btn{padding:8px 16px;border-radius:8px;background:var(--card);color:var(--text);border:1.5px solid var(--border);font-weight:600;font-size:.88rem;transition:background .15s,border-color .15s,transform .1s}
.btn:hover{background:var(--pri-soft);border-color:var(--pri)}
.btn:active{transform:scale(.96)}
.btn.primary{background:var(--pri);color:#fff;border-color:var(--pri)}
.btn.primary:hover{background:var(--pri2);border-color:var(--pri2)}
.feedback{padding:10px 14px;border-radius:9px;font-weight:600;font-size:.88rem;margin-top:8px;display:none}
.feedback.ok{display:block;background:var(--ok-bg);color:#065f46;border-left:4px solid var(--ok)}
.feedback.fail{display:block;background:var(--fail-bg);color:#7f1d1d;border-left:4px solid var(--fail)}
.wg{background:linear-gradient(135deg,var(--card),var(--pri-soft));border:1.5px solid var(--pri);border-radius:14px;padding:18px 20px;margin-bottom:18px;box-shadow:var(--sh2);position:relative;z-index:1}
.wg-header{display:flex;align-items:center;gap:8px;margin-bottom:14px}
.wg-badge{padding:4px 9px;background:var(--pri);color:#fff;border-radius:6px;font-family:'Unbounded',sans-serif;font-size:.68rem;font-weight:800;text-transform:uppercase;letter-spacing:.06em}
.wg-title{font-family:'Unbounded',sans-serif;font-size:1.05rem;font-weight:800;color:var(--pri2);flex:1}
.wg-help{font-size:.88rem;color:var(--text);margin-bottom:12px;line-height:1.55;background:linear-gradient(135deg,var(--warn-bg),var(--pri-soft));border-left:4px solid var(--warn);padding:9px 14px;border-radius:9px}
.tinp{padding:8px 12px;border:1.5px solid var(--border);border-radius:8px;background:var(--card);color:var(--text);transition:border-color .15s;font-family:'JetBrains Mono',monospace;width:140px}
.tinp:focus{outline:0;border-color:var(--pri);box-shadow:0 0 0 3px var(--pri-soft)}
.actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;align-items:center}
.opts-row{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.opt-btn{padding:8px 14px;background:var(--card);border:1.5px solid var(--border);border-radius:9px;font-weight:700;font-size:.88rem;color:var(--text);cursor:pointer;transition:all .15s}
.opt-btn:hover{background:var(--pri-soft);border-color:var(--pri)}
.opt-btn.correct{background:var(--ok-bg);border-color:var(--ok);color:#065f46}
.opt-btn.wrong{background:var(--fail-bg);border-color:var(--fail);color:#991b1b}
.col-side{position:sticky;top:14px;align-self:start;height:fit-content;max-height:calc(100vh - 28px);overflow-y:auto}
.sidecard{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:16px;margin-bottom:14px;box-shadow:var(--sh)}
.sidecard h4{font-family:'Unbounded',sans-serif;font-size:.74rem;font-weight:800;color:var(--pri2);text-transform:uppercase;letter-spacing:.07em;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid var(--border)}
.sidecard-row{margin-bottom:8px;font-size:.84rem;line-height:1.55}
.sidecard-row b{color:var(--pri);font-weight:700}
.sidecard-row:last-child{margin-bottom:0}
@media(max-width:980px){.col-side{position:static;max-height:none}}
.xp-card{background:linear-gradient(135deg,var(--warn-bg),var(--pri-soft));border:1.5px solid var(--warn);border-radius:12px;padding:14px;margin-bottom:14px}
.xp-card-title{font-size:.68rem;font-weight:800;color:var(--warn);text-transform:uppercase;letter-spacing:.07em;margin-bottom:8px;display:flex;align-items:center;justify-content:space-between}
.xp-level{font-size:1.1rem;font-weight:900;color:#9f1239;font-family:'Unbounded',sans-serif}
.xp-bar{height:9px;background:rgba(0,0,0,.10);border-radius:6px;overflow:hidden;margin:7px 0}
.xp-fill{height:100%;background:linear-gradient(90deg,var(--warn),var(--pri));border-radius:6px;transition:width .5s cubic-bezier(.4,0,.2,1)}
.xp-nums{font-size:.74rem;color:var(--muted);display:flex;justify-content:space-between}
.sec-nav{display:flex;gap:10px;margin-top:24px;padding-top:20px;border-top:1px solid var(--border);justify-content:space-between;flex-wrap:wrap}
.foot{text-align:center;padding:30px 16px;color:var(--muted);font-size:.78rem;border-top:1px solid var(--border);margin-top:30px}
.ach-popup{position:fixed;top:80px;right:18px;background:linear-gradient(135deg,var(--pri),var(--warn));color:#fff;padding:12px 18px;border-radius:11px;font-weight:700;font-size:.9rem;box-shadow:0 8px 28px rgba(0,0,0,.32);z-index:1002;display:none;align-items:center;gap:8px;max-width:340px}
.ach-popup.show{display:flex}
.fx-holder{margin:10px 0;padding:0;text-align:center}
.fx-sliders{margin-top:10px;display:flex;flex-wrap:wrap;gap:4px;background:rgba(255,255,255,.5);border-radius:9px;padding:6px 4px}
.boss-card{background:var(--card);border:2px solid var(--border);border-radius:14px;padding:16px;margin-bottom:14px;transition:border-color .35s,box-shadow .35s,transform .2s}
.boss-card.solved{border-color:#10b981;box-shadow:0 0 0 3px rgba(16,185,129,.18)}
.boss-head{display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}
.boss-tag{font-size:.7rem;font-weight:800;padding:3px 9px;border-radius:99px;background:var(--pri-soft);color:var(--pri2);letter-spacing:.04em;text-transform:uppercase}
.boss-title{font-family:'Unbounded',sans-serif;font-weight:800;color:var(--text);font-size:1.02rem;flex:1;min-width:0}
.boss-q{padding:12px 14px;background:var(--pri-soft);border-radius:10px;font-size:.96rem;line-height:1.55;margin-bottom:10px;color:var(--text)}
.boss-input{padding:8px 12px;border:1.5px solid var(--border);border-radius:8px;background:var(--card);color:var(--text);font-family:'JetBrains Mono',monospace;width:140px;text-align:center;font-size:.95rem}
.boss-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:6px}
.boss-fb{padding:10px 14px;border-radius:9px;font-weight:600;font-size:.88rem;margin-top:8px;display:none;line-height:1.45}
.boss-fb.ok{display:block;background:var(--ok-bg);color:#065f46;border-left:4px solid var(--ok)}
.boss-fb.fail{display:block;background:var(--fail-bg);color:#7f1d1d;border-left:4px solid var(--fail)}
</style>
</head>
<body>
<header class="hdr">
<div class="hdr-row">
<div>
<h1>Физика 11 · Глава 7</h1>
<div class="hdr-sub">Ядерная физика и элементарные частицы · ядро, радиоактивность, реакторы, синтез, дозиметрия</div>
</div>
<div class="hdr-side">
<a href="/textbook/physics-11" class="hdr-btn"><svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg> К физике 11</a>
<button id="theme-btn" class="hdr-btn"><svg class="ic" viewBox="0 0 24 24"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg><span id="theme-lab">Тёмная</span></button>
</div>
</div>
</header>
<main class="main">
<div class="col-main">
<section class="hero">
<h2>Ядро, радиоактивность, термояд</h2>
<p>Самая большая глава о ядре атома: от модели ядра до ядерных реакторов и звёздного термоядерного синтеза. 10 параграфов + финал.</p>
<div class="hero-row">
<button class="btn-primary" onclick="goTo('p1')"><svg class="ic" viewBox="0 0 24 24"><polygon points="6 4 20 12 6 20 6 4" fill="currentColor" stroke="none"/></svg> Начать § 35</button>
<div class="hero-progress">
<span class="hp-label">Прогресс по главе</span>
<div class="hp-bar"><div id="hero-hp-fill" class="hp-fill"></div></div>
<span id="hero-hp-text" class="hp-text">0%</span>
</div>
<div id="hero-xp-badge" class="hero-xp-badge" data-gamified></div>
</div>
</section>
<section class="psel">
<div class="psel-title">Параграфы главы</div>
<div id="psel-grid" class="psel-grid"></div>
</section>
<section id="sec-p1" class="sec" data-watermark="A"><div class="sec-header"><span class="sec-num">§ 35</span><h2 class="sec-h">Протонно-нейтронная модель ядра</h2></div><div id="p1-body"></div></section>
<section id="sec-p2" class="sec" data-watermark="Z"><div class="sec-header"><span class="sec-num">§ 36</span><h2 class="sec-h">Ядерные реакции и законы сохранения</h2></div><div id="p2-body"></div></section>
<section id="sec-p3" class="sec" data-watermark="E"><div class="sec-header"><span class="sec-num">§ 37</span><h2 class="sec-h">Энергия связи ядра</h2></div><div id="p3-body"></div></section>
<section id="sec-p4" class="sec" data-watermark="&#945;"><div class="sec-header"><span class="sec-num">§ 38</span><h2 class="sec-h">Радиоактивность</h2></div><div id="p4-body"></div></section>
<section id="sec-p5" class="sec" data-watermark="T"><div class="sec-header"><span class="sec-num">§ 39</span><h2 class="sec-h">Закон радиоактивного распада</h2></div><div id="p5-body"></div></section>
<section id="sec-p6" class="sec" data-watermark="U"><div class="sec-header"><span class="sec-num">§ 40</span><h2 class="sec-h">Деление ядер. Цепные реакции</h2></div><div id="p6-body"></div></section>
<section id="sec-p7" class="sec" data-watermark="&#9881;"><div class="sec-header"><span class="sec-num">§ 41</span><h2 class="sec-h">Ядерный реактор</h2></div><div id="p7-body"></div></section>
<section id="sec-p8" class="sec" data-watermark="H"><div class="sec-header"><span class="sec-num">§ 42</span><h2 class="sec-h">Ядерный синтез</h2></div><div id="p8-body"></div></section>
<section id="sec-p9" class="sec" data-watermark="D"><div class="sec-header"><span class="sec-num">§ 43</span><h2 class="sec-h">Ионизирующее излучение. Дозиметрия</h2></div><div id="p9-body"></div></section>
<section id="sec-p10" class="sec" data-watermark="q"><div class="sec-header"><span class="sec-num">§ 44</span><h2 class="sec-h">Элементарные частицы</h2></div><div id="p10-body"></div></section>
<section id="sec-final" class="sec" data-watermark="&#9733;"><div class="sec-header"><span class="sec-num" style="background:linear-gradient(135deg,#e11d48,#9f1239)">&#9733;</span><h2 class="sec-h">Финал главы 7</h2></div><div id="final-body"></div></section>
</div>
<aside class="col-side"><div id="sidebar-content"></div></aside>
</main>
<footer class="foot">Интерактивный учебник «Физика 11» · Глава 7 · «Ядерная физика» · LearnSpace</footer>
<div id="ach-popup" class="ach-popup"><svg class="ic" viewBox="0 0 24 24" style="width:22px;height:22px"><polygon points="12,2 22,20 2,20"/></svg><span id="ach-text">Достижение!</span></div>
<script>
'use strict';
const STATE = { current:'p1', progress:{}, achievements:new Map(), xp:0, level:1 };
const TOTAL_PARAS = 10;
const _TB_SLUG = 'physics-11-ch7';
const PARAS = [
{ id:'p1', num:'§ 35', name:'p-n модель ядра', sub:'$A = Z + N$', built:true },
{ id:'p2', num:'§ 36', name:'Ядерные реакции', sub:'Законы сохр.', built:true },
{ id:'p3', num:'§ 37', name:'Энергия связи', sub:'$E_{св} = \\Delta m c^2$', built:true },
{ id:'p4', num:'§ 38', name:'Радиоактивность', sub:'$\\alpha, \\beta, \\gamma$', built:true },
{ id:'p5', num:'§ 39', name:'Закон распада', sub:'$N = N_0 \\cdot 2^{-t/T}$', built:true },
{ id:'p6', num:'§ 40', name:'Деление ядер', sub:'Цепные реакции', built:true },
{ id:'p7', num:'§ 41', name:'Ядерный реактор', sub:'АЭС, ИБР', built:true },
{ id:'p8', num:'§ 42', name:'Ядерный синтез', sub:'Термояд, Солнце', built:true },
{ id:'p9', num:'§ 43', name:'Дозиметрия', sub:'Зиверт, Грей', built:true },
{ id:'p10', num:'§ 44', name:'Элем. частицы', sub:'Стандартная модель', built:true },
{ id:'final', num:'★', name:'Финал главы 7', sub:'Интегральные боссы', final:true, built:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
function calcLevel(xp){ return Math.floor(Math.sqrt((xp||0)/100))+1; }
function _xpForLevel(lv){ return (lv-1)*(lv-1)*100; }
const ACH_LABELS = {
p1_done:'§35 — p-n модель освоена', p2_done:'§36 — ядерные реакции освоены',
p3_done:'§37 — энергия связи освоена', p4_done:'§38 — радиоактивность освоена',
p5_done:'§39 — закон распада освоен', p6_done:'§40 — деление ядер освоено',
p7_done:'§41 — реактор освоен', p8_done:'§42 — синтез освоен',
p9_done:'§43 — дозиметрия освоена', p10_done:'§44 — элем. частицы освоены',
ch7_master:'Магистр ядра — пройден финал главы 7!',
start:'Начало главы 7!', ch7_done:'Глава 7 пройдена — Ядерная физика!'
};
function loadProgress(){
try{
const s=localStorage.getItem('physics11_ch7_progress'); if(s) Object.assign(STATE.progress, JSON.parse(s));
const a=localStorage.getItem('physics11_ch7_achievements');
if(a){ const p=JSON.parse(a); if(p&&typeof p==='object'){ for(const[id,t] of Object.entries(p)) STATE.achievements.set(id,(t&&t!==id)?t:(ACH_LABELS[id]||id)); } }
STATE.xp=+(localStorage.getItem('physics11_xp')||0); STATE.level=calcLevel(STATE.xp);
}catch(e){}
}
function saveProgress(){
try{
localStorage.setItem('physics11_ch7_progress', JSON.stringify(STATE.progress));
localStorage.setItem('physics11_ch7_achievements', JSON.stringify(Object.fromEntries(STATE.achievements)));
localStorage.setItem('physics11_xp', String(STATE.xp));
}catch(e){}
}
function bumpProgress(key, delta){
STATE.progress[key]=Math.max(0,Math.min(100,(STATE.progress[key]||0)+delta));
saveProgress(); refreshProgressUI();
if(STATE.progress[key]>=50) markParaRead(key);
}
const _markedRead=new Set();
let _pendingProgressBody=null, _progressTimer=null;
function _flushProgress(){
const body=_pendingProgressBody; _pendingProgressBody=null; if(!body) return;
const tok=(window.LS&&LS.getToken)?LS.getToken():''; if(!tok) return;
fetch('/api/textbooks/'+_TB_SLUG+'/progress',{method:'POST',headers:{'Content-Type':'application/json','Authorization':'Bearer '+tok},body:JSON.stringify(body),keepalive:true}).catch(()=>{});
}
function _queueProgress(patch){ _pendingProgressBody=Object.assign(_pendingProgressBody||{},patch); if(_progressTimer) clearTimeout(_progressTimer); _progressTimer=setTimeout(_flushProgress, 600); }
function markLastPara(id){ _queueProgress({last_para:id}); }
function markParaRead(id){ if(_markedRead.has(id)) return; _markedRead.add(id); _queueProgress({mark_read:id}); }
window.addEventListener('beforeunload', _flushProgress);
function addXp(n,src){
if(!n) return;
const prev=STATE.level; STATE.xp=Math.max(0,(STATE.xp||0)+n); STATE.level=calcLevel(STATE.xp);
saveProgress(); refreshProgressUI();
if(window.LS&&window.LS.xp) window.LS.xp.add(n,'physics11-ch7-'+(src||'misc'));
if(STATE.level>prev){
const pop=document.getElementById('ach-popup');
if(pop){ document.getElementById('ach-text').textContent='Уровень '+STATE.level+'!'; pop.classList.add('show'); setTimeout(()=>pop.classList.remove('show'),2600); }
}
}
function refreshProgressUI(){
const total=Math.round(Object.values(STATE.progress).reduce((a,b)=>a+b,0)/TOTAL_PARAS);
const f=document.getElementById('hero-hp-fill'); if(f) f.style.width=total+'%';
const t=document.getElementById('hero-hp-text'); if(t) t.textContent=total+'% пройдено';
document.querySelectorAll('[data-prog-card]').forEach(el=>{ const k=el.dataset.progCard; const fl=el.querySelector('.psel-prog-fill'); if(fl) fl.style.width=(STATE.progress[k]||0)+'%'; if((STATE.progress[k]||0)>=100) el.classList.add('done'); });
const xpBadge=document.getElementById('hero-xp-badge');
if(xpBadge){ xpBadge.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="width:13px;height:13px"><polygon points="12 2 22 20 2 20"/></svg> Ур. '+STATE.level+' \xb7 '+(STATE.xp||0)+' XP'; }
if(STATE.current && document.getElementById('sidebar-content')){ try{ buildSidebar(STATE.current); }catch(e){} }
}
function achievement(id,text){
if(STATE.achievements.has(id)) return;
STATE.achievements.set(id, text||ACH_LABELS[id]||id); saveProgress();
const pop=document.getElementById('ach-popup');
if(pop){ document.getElementById('ach-text').textContent=text||ACH_LABELS[id]||id; pop.classList.add('show'); setTimeout(()=>pop.classList.remove('show'),3300); }
addXp(20,'ach-'+id);
}
function buildParaSelector(){
const g=document.getElementById('psel-grid'); g.innerHTML='';
PARAS.forEach(p=>{
const card=document.createElement('div');
card.className='psel-card'+(p.final?' final':'')+(p.built?'':' locked');
card.dataset.id=p.id; card.dataset.progCard=p.id;
card.innerHTML='<div class="psel-num">'+p.num+'</div><div class="psel-name">'+p.name+'</div><div class="psel-prog"><div class="psel-prog-fill"></div></div><div class="psel-done"><svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"/></svg></div>';
card.addEventListener('click', ()=>goTo(p.id));
g.appendChild(card);
});
if(window.renderMathInElement) try{ renderMath(g); }catch(e){}
}
const BUILT=new Set();
const BUILDERS = {
p1:()=>buildP(1, '§ 35', P1_THEORY), p2:()=>buildP(2, '§ 36', P2_THEORY),
p3:()=>buildP(3, '§ 37', P3_THEORY), p4:()=>buildP(4, '§ 38', P4_THEORY),
p5:()=>buildP5(), p6:()=>buildP(6, '§ 40', P6_THEORY),
p7:()=>buildP(7, '§ 41', P7_THEORY), p8:()=>buildP(8, '§ 42', P8_THEORY),
p9:()=>buildP(9, '§ 43', P9_THEORY), p10:()=>buildP(10, '§ 44', P10_THEORY),
final:()=>buildFinal()
};
function ensureBuilt(id){ if(BUILT.has(id)) return; const fn=BUILDERS[id]; if(fn){ fn(); BUILT.add(id); } }
function goTo(id){
STATE.current=id; markLastPara(id);
document.querySelectorAll('.sec').forEach(s=>s.classList.remove('active'));
document.querySelectorAll('.psel-card').forEach(c=>c.classList.toggle('active', c.dataset.id===id));
ensureBuilt(id);
const sec=document.getElementById('sec-'+id); if(sec) sec.classList.add('active');
buildSidebar(id);
window.scrollTo({top:0, behavior:'smooth'});
}
const SIDEBARS = {
p1:{title:'§ 35 — Состав ядра', rows:[['Нуклоны','протоны + нейтроны'],['$A$','массовое число'],['$Z$','зарядовое (= номер элемента)'],['Изотопы','одинак. $Z$, разн. $A$']]},
p2:{title:'§ 36 — Ядерные реакции', rows:[['Сохр.','заряда $\\sum Z$'],['Сохр.','нуклонов $\\sum A$'],['Сохр.','энергии $\\sum E$']]},
p3:{title:'§ 37 — Энергия связи', rows:[['Дефект массы','$\\Delta m = Zm_p + Nm_n - m_я$'],['$E_{св}$','$\\Delta m \\cdot c^2$'],['Удельная','$E_{св}/A$ макс. у Fe']]},
p4:{title:'§ 38 — Радиоактивность', rows:[['α','${}^4_2\\text{He}$'],['β⁻','электрон'],['γ','ЭМ-волны']]},
p5:{title:'§ 39 — Закон распада', rows:[['$N(t)$','$N_0 \\cdot 2^{-t/T}$'],['$T$','период полураспада'],['Активность','$A = -dN/dt$']]},
p6:{title:'§ 40 — Деление', rows:[['Делящееся','${}^{235}\\text{U}$, ${}^{239}\\text{Pu}$'],['Коэф. размн.','$k$'],['$k = 1$','цепная стац.']]},
p7:{title:'§ 41 — Реактор', rows:[['Топливо','U/Pu'],['Замедлитель','H₂O, графит'],['Стержни','B, Cd']]},
p8:{title:'§ 42 — Синтез', rows:[['Термоядер. реакц.','D + T → He + n'],['Источник','Солнце, звёзды'],['ИТЭР','токамак']]},
p9:{title:'§ 43 — Дозы', rows:[['Поглощённая','Грей (Гр)'],['Эквивалентная','Зиверт (Зв)'],['Норма','1 мЗв/год']]},
p10:{title:'§ 44 — Частицы', rows:[['Лептоны','e, μ, τ, ν'],['Кварки','u, d, s, c, b, t'],['Бозоны','γ, W, Z, g, H'],['Силы','4 фунд. взаимодействия']]},
final:{title:'Финал главы 7', rows:[['Боссов','5 интегральных'],['Покрытие','§35-§44'],['Награда','+200 XP + Магистр ядра']]}
};
const TIPS = PARAS.map(p => ({sec:p.id, html: 'Главное для ' + p.num + ' — см. формулы в сайдбаре.'}));
function buildSidebar(id){
const box=document.getElementById('sidebar-content');
const sb=SIDEBARS[id]||SIDEBARS[PARAS[0].id];
let html='';
const xpForLv=_xpForLevel(STATE.level), xpNext=_xpForLevel(STATE.level+1);
const xpInLv=STATE.xp-xpForLv, xpRange=xpNext-xpForLv;
const xpPct=xpRange>0?Math.round(xpInLv/xpRange*100):100;
html+='<div class="xp-card" data-gamified><div class="xp-card-title" data-gamified><span>XP-прогресс</span><span class="xp-level">Ур. '+STATE.level+'</span></div><div class="xp-bar"><div class="xp-fill" style="width:'+xpPct+'%"></div></div><div class="xp-nums"><span>'+STATE.xp+' XP</span><span>'+xpNext+' XP</span></div></div>';
html+='<div class="sidecard"><h4>'+sb.title+'</h4>';
sb.rows.forEach(([k,v])=>{ html+='<div class="sidecard-row"><b>'+k+'</b>'+(v?' — '+v:'')+'</div>'; });
html+='</div>';
if(STATE.achievements.size>0){
html+='<div class="sidecard"><h4>Достижения <span style="color:var(--warn);float:right">'+STATE.achievements.size+'</span></h4>';
[...STATE.achievements.values()].slice(-4).forEach(text=>{ html+='<div class="sidecard-row" style="font-size:.78rem;color:var(--ok)">&#10003; '+text+'</div>'; });
html+='</div>';
}
box.innerHTML=html;
if(window.renderMathInElement) try{ renderMath(box); }catch(e){}
}
function initTheme(){
const t=localStorage.getItem('physics11_theme')||localStorage.getItem('theme')||'light';
if(t==='dark') document.documentElement.classList.add('dark');
document.getElementById('theme-lab').textContent=t==='dark'?'Светлая':'Тёмная';
document.getElementById('theme-btn').addEventListener('click', ()=>{
document.documentElement.classList.toggle('dark');
const dark=document.documentElement.classList.contains('dark');
localStorage.setItem('physics11_theme', dark?'dark':'light');
localStorage.setItem('theme', dark?'dark':'light');
document.getElementById('theme-lab').textContent=dark?'Светлая':'Тёмная';
});
}
function renderMath(root){ if(window.renderMathInElement){ try{ renderMathInElement(root, {delimiters:[{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false},{left:'\\[',right:'\\]',display:true},{left:'\\(',right:'\\)',display:false}],throwOnError:false}); }catch(e){} } }
const ICONS = {
repeat:'<svg class="ic" viewBox="0 0 24 24"><polyline points="9 11 12 14 22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>',
theory:'<svg class="ic" viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>',
algo:'<svg class="ic" viewBox="0 0 24 24"><polyline points="17 11 21 7 17 3"/><line x1="21" y1="7" x2="9" y2="7"/><polyline points="7 13 3 17 7 21"/><line x1="3" y1="17" x2="15" y2="17"/></svg>',
rule:'<svg class="ic" viewBox="0 0 24 24"><path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9"/><path d="M10.3 21a1.94 1.94 0 0 0 3.4 0"/></svg>',
example:'<svg class="ic" viewBox="0 0 24 24"><path d="M9 18h6"/><path d="M10 22h4"/><path d="M12 2a7 7 0 0 0-4 13c1 1 2 2 2 4h4c0-2 1-3 2-4a7 7 0 0 0-4-13z"/></svg>'
};
function makeCard(kind, title, num, body){
const labels = {repeat:'Повторение',theory:'Теория',algo:'Алгоритм',rule:'Правило',example:'Пример'};
return '<div class="card"><div class="card-header"><div class="card-icon '+kind+'">'+ICONS[kind]+'</div><div class="card-title">'+(labels[kind]||'')+(title&&title!==labels[kind]?' \xb7 '+title:'')+'</div>'+(num?'<div class="card-num">'+num+'</div>':'')+'</div><div class="card-body">'+body+'</div></div>';
}
function secNavFor(curId){
const idx = PARAS.findIndex(p => p.id === curId);
const prev = idx > 0 ? PARAS[idx-1].id : null;
const next = idx < PARAS.length - 1 ? PARAS[idx+1].id : null;
const NAMES = {p1:'\xA735',p2:'\xA736',p3:'\xA737',p4:'\xA738',p5:'\xA739',p6:'\xA740',p7:'\xA741',p8:'\xA742',p9:'\xA743',p10:'\xA744',final:'Финал'};
let h='<div class="sec-nav">';
h+=prev?'<button class="btn" onclick="goTo(\''+prev+'\')"><svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg> '+NAMES[prev]+'</button>':'<span></span>';
h+=next?'<button class="btn primary" onclick="goTo(\''+next+'\')">'+NAMES[next]+' <svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg></button>':'<span></span>';
h+='</div>'; return h;
}
function readButton(paraId){
const p = PARAS.find(x => x.id === paraId);
const labelTail = p && p.final ? 'финал' : (p ? p.num : '\xA7?');
return '<div style="margin-top:18px;display:flex;justify-content:center"><button class="btn primary" id="'+paraId+'-read-btn">'
+'<svg class="ic" viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>'
+' Я прочитал — '+labelTail+' (+10 XP)</button></div>';
}
function wireReadBtn(paraId){
const btn = document.getElementById(paraId+'-read-btn'); if(!btn) return;
btn.addEventListener('click', ()=>{
addXp(10, paraId+'-read'); bumpProgress(paraId, 30);
btn.textContent='Прочитано! +10 XP'; btn.disabled=true; btn.style.opacity=.6;
const aId = paraId+'_done';
if(ACH_LABELS[aId]) achievement(aId);
});
}
function normalizeAns(s){
return String(s||'').toLowerCase().replace(/\s+/g,'').replace(/°/g,'').replace(/sqrt/g,'√').replace(/корень/g,'√').replace(/,/g,'.');
}
function makeBoss(id, def){
const stage = (typeof def.stage === 'number') ? def.stage : 0;
const solved = !!def.solved;
const total = def.stages.length;
const stageObj = def.stages[Math.min(stage, total-1)];
let optsHtml = '';
if(solved) return '<div class="boss-card solved" id="boss-'+id+'"><div class="boss-head"><span class="boss-tag">'+(def.tag||'Босс')+'</span><span class="boss-title">'+def.title+'</span></div><div class="boss-q">Побеждён! +'+def.xp+' XP получены.</div></div>';
if(stageObj.type === 'mc'){
optsHtml = '<div class="opts-row">';
stageObj.opts.forEach((o,i)=>{ optsHtml += '<button class="opt-btn" data-i="'+i+'">'+o+'</button>'; });
optsHtml += '</div>';
} else {
optsHtml = '<div class="boss-row"><input class="boss-input" id="boss-'+id+'-inp" placeholder="ответ"><button class="btn primary" id="boss-'+id+'-go">Атака</button></div>';
}
return '<div class="boss-card" id="boss-'+id+'"><div class="boss-head"><span class="boss-tag">'+(def.tag||'Босс')+'</span><span class="boss-title">'+def.title+' — этап '+(stage+1)+' / '+total+'</span></div><div class="boss-q">'+stageObj.q+'</div>'+optsHtml+'<div class="boss-fb" id="boss-'+id+'-fb"></div></div>';
}
function bindBoss(id, def, state, save, onWin){
const card = document.getElementById('boss-'+id);
if(!card || state.solved) return;
const stageObj = def.stages[state.stage];
const fb = document.getElementById('boss-'+id+'-fb');
function advance(){
state.stage++;
if(state.stage >= def.stages.length){
state.solved = true; save(); addXp(def.xp, 'boss-'+id);
if(onWin) onWin();
} else save();
rebuildBoss(id, def, state, save, onWin);
}
if(stageObj.type === 'mc'){
card.querySelectorAll('.opt-btn').forEach(btn=>{
btn.addEventListener('click', ()=>{
const i = +btn.dataset.i;
if(i === stageObj.correct){
btn.classList.add('correct');
fb.className='feedback ok'; fb.innerHTML='&#10003; Верно. '+(stageObj.explain||''); fb.style.display='block'; renderMath(fb);
setTimeout(advance, 700);
} else { btn.classList.add('wrong'); fb.className='feedback fail'; fb.innerHTML='&#10007; Не так. '+(stageObj.explain||''); fb.style.display='block'; renderMath(fb); }
});
});
} else {
const inp = document.getElementById('boss-'+id+'-inp');
const go = document.getElementById('boss-'+id+'-go');
function attack(){
const v = normalizeAns(inp.value);
const ans = Array.isArray(stageObj.a) ? stageObj.a.map(normalizeAns) : [normalizeAns(stageObj.a)];
if(ans.indexOf(v) >= 0){ fb.className='feedback ok'; fb.innerHTML='&#10003; Верно! '+(stageObj.explain||''); fb.style.display='block'; renderMath(fb); setTimeout(advance, 600); }
else { fb.className='feedback fail'; fb.innerHTML='&#10007; Не то. '+(stageObj.explain||''); fb.style.display='block'; renderMath(fb); }
}
go.addEventListener('click', attack);
inp.addEventListener('keydown', e=>{ if(e.key==='Enter'){ e.preventDefault(); attack(); } });
}
}
function rebuildBoss(id, def, state, save, onWin){
const card = document.getElementById('boss-'+id);
if(!card) return;
card.outerHTML = makeBoss(id, Object.assign({}, def, state));
bindBoss(id, def, state, save, onWin);
renderMath(document.getElementById('boss-'+id));
}
function makeAndBindBoss(slotId, id, def, state, save, onWin){
const slot = document.getElementById(slotId); if(!slot) return;
slot.innerHTML = makeBoss(id, Object.assign({}, def, state));
bindBoss(id, def, state, save, onWin);
renderMath(slot);
}
function ensureFx(cb){ if(window.PHYS) return cb(); setTimeout(()=>ensureFx(cb), 60); }
function buildP(num, label, theory){
const id = 'p' + num;
const box = document.getElementById(id + '-body'); if(!box) return;
let html = theory;
const idC = 'i' + num + '-calc', idT = 'i' + num + '-th';
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. расчёт</span><span class="wg-title">Расчёты</span></div>'
+ '<div class="wg-help">Решено: <b id="' + idC + '-score">0</b> / 5.</div>'
+ '<div id="' + idC + '-q" style="margin:8px 0"></div><div class="actions"><input class="tinp" id="' + idC + '-inp" placeholder="ответ"><button class="btn primary" id="' + idC + '-go">Проверить</button></div><div class="feedback" id="' + idC + '-fb"></div></div>';
html += '<div class="wg"><div class="wg-header"><span class="wg-badge">Инт. теория</span><span class="wg-title">Теория</span></div>'
+ '<div class="wg-help">Решено: <b id="' + idT + '-score">0</b> / 5.</div>'
+ '<div id="' + idT + '-q" style="margin:8px 0"></div><div class="opts-row" id="' + idT + '-opts"></div><div class="feedback" id="' + idT + '-fb"></div></div>';
html += '<div id="boss-' + num + '-slot"></div>';
html += readButton(id);
html += secNavFor(id);
box.innerHTML = html;
runQuizInput(idC, QUIZ_CALC[num], 16);
runQuizMC(idT, QUIZ_TH[num], 12);
const bs = loadBossState('boss-' + num) || { stage:0, solved:false };
makeAndBindBoss('boss-' + num + '-slot', String(num), BOSS_DEFS['b' + num], bs,
()=>saveBossState('boss-' + num, bs),
()=>{ bumpProgress(id, 40); achievement(id + '_done'); });
wireReadBtn(id);
renderMath(box);
}
function buildP5(){
let theory = P5_THEORY;
theory += '<div class="wg"><div class="wg-header"><span class="wg-badge">Интерактив</span><span class="wg-title">Закон распада N(t)</span></div>'
+ '<div class="wg-help">График $N(t) = N_0 \\cdot 2^{-t/T}$. Через каждый период $T$ количество ядер уменьшается вдвое.</div>'
+ '<div class="fx-holder" id="fx-decay"></div>'
+ '<div class="fx-sliders" id="fx-decay-sl"></div></div>';
buildP(5, '§ 39', theory);
ensureFx(()=>{
const r = new PHYS.RadioactiveDecay(document.getElementById('fx-decay'), {width:600, height:300, T:2});
const slBox = document.getElementById('fx-decay-sl');
const slT = PHYS.util.slider({label:'T', min:0.5, max:5, step:0.1, value:2, fmt:v=>v.toFixed(2), onChange:v=>r.setT(v)});
slBox.innerHTML = slT.html;
slT.wire(slBox);
});
}
function buildFinal(){
const box = document.getElementById('final-body'); if(!box) return;
let html = '';
html += '<div class="card" style="background:linear-gradient(135deg,#ffe4e6,#fecdd3);border-color:#e11d48">'
+ '<div class="card-header"><div class="card-icon rule" style="background:#e11d48;color:#fff">'
+ '<svg class="ic" viewBox="0 0 24 24" stroke-width="2"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>'
+ '</div><div class="card-title">Финал главы 7 — Ядерная физика</div><div class="card-num">★</div></div>'
+ '<div class="card-body"><p>5 интегральных боссов покрывают §35-§44. За победу: <b>Магистр ядра</b> + 200 XP.</p></div></div>';
for (let i = 1; i <= 5; i++) html += '<div id="boss-final-'+i+'-slot"></div>';
html += '<div class="card" id="final-victory" style="display:none;background:linear-gradient(135deg,#fecdd3,#f43f5e);border-color:#9f1239">'
+ '<div class="card-header"><div class="card-icon example" style="background:#9f1239;color:#fff">'
+ '<svg class="ic" viewBox="0 0 24 24" stroke-width="2"><path d="M6 9H4.5a2.5 2.5 0 0 1 0-5H6"/><path d="M18 9h1.5a2.5 2.5 0 0 0 0-5H18"/><path d="M4 22h16"/><path d="M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22"/><path d="M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22"/><path d="M18 2H6v7a6 6 0 0 0 12 0V2Z"/></svg>'
+ '</div><div class="card-title">Магистр ядра!</div></div>'
+ '<div class="card-body"><p><b>Все 5 финальных боссов побеждены!</b> Бонус: <b>+200 XP</b>. Впереди — Глава 8 (картина мира).</p></div></div>';
html += secNavFor('final');
box.innerHTML = html;
for (let i = 1; i <= 5; i++){
const key = 'boss-final-' + i;
const bs = loadBossState(key) || { stage:0, solved:false };
makeAndBindBoss(key+'-slot', 'final-'+i, FINAL_BOSS_DEFS['fb'+i], bs,
()=>{ saveBossState(key, bs); checkFinalDone(); }, ()=>{ checkFinalDone(); });
}
renderMath(box);
}
function checkFinalDone(){
let all = true;
for (let i = 1; i <= 5; i++){
const s = loadBossState('boss-final-'+i);
if (!s || !s.solved){ all = false; break; }
}
if (all){
const v = document.getElementById('final-victory'); if (v) v.style.display = '';
bumpProgress('final', 100);
if (!STATE.achievements.has('ch7_master')){ achievement('ch7_master'); addXp(200, 'ch7-master-bonus'); }
if (!STATE.achievements.has('ch7_done')) achievement('ch7_done');
}
}
function loadBossState(key){ try{ return JSON.parse(localStorage.getItem('physics11_ch7_'+key)||'null'); }catch(e){ return null; } }
function saveBossState(key, state){ try{ localStorage.setItem('physics11_ch7_'+key, JSON.stringify(state)); }catch(e){} }
function runQuizMC(id, items, xpReward){
const state = JSON.parse(localStorage.getItem('physics11_ch7_quiz_'+id)||'null') || { idx:0, solved:0, awarded:false };
const qEl = document.getElementById(id+'-q');
const optsEl = document.getElementById(id+'-opts');
const fbEl = document.getElementById(id+'-fb');
const scoreEl = document.getElementById(id+'-score');
function save(){ localStorage.setItem('physics11_ch7_quiz_'+id, JSON.stringify(state)); }
function render(){
if(state.solved >= items.length){
qEl.innerHTML = '<b style="color:var(--ok)">Все задания решены!</b> +'+xpReward+' XP.';
optsEl.innerHTML = ''; fbEl.style.display='none';
if(scoreEl) scoreEl.textContent = state.solved;
if(!state.awarded){ state.awarded = true; save(); addXp(xpReward, 'quiz-'+id); }
return;
}
const it = items[state.idx % items.length];
qEl.innerHTML = it.q; optsEl.innerHTML = ''; fbEl.style.display='none';
if(scoreEl) scoreEl.textContent = state.solved;
it.opts.forEach((o,i)=>{
const b = document.createElement('button'); b.className = 'opt-btn'; b.innerHTML = o;
b.addEventListener('click', ()=>{
if(i === it.correct){ b.classList.add('correct'); state.solved++; state.idx++; save();
if(scoreEl) scoreEl.textContent = state.solved;
fbEl.className='feedback ok'; fbEl.innerHTML='&#10003; Верно. '+(it.explain||''); fbEl.style.display='block'; renderMath(fbEl);
setTimeout(render, 850);
} else { b.classList.add('wrong'); fbEl.className='feedback fail'; fbEl.innerHTML='&#10007; Не так. '+(it.explain||''); fbEl.style.display='block'; renderMath(fbEl); }
});
optsEl.appendChild(b);
});
renderMath(qEl);
}
render();
}
function runQuizInput(id, items, xpReward){
const state = JSON.parse(localStorage.getItem('physics11_ch7_quiz_'+id)||'null') || { idx:0, solved:0, awarded:false };
const qEl = document.getElementById(id+'-q');
const inp = document.getElementById(id+'-inp');
const go = document.getElementById(id+'-go');
const fbEl = document.getElementById(id+'-fb');
const scoreEl = document.getElementById(id+'-score');
function save(){ localStorage.setItem('physics11_ch7_quiz_'+id, JSON.stringify(state)); }
function render(){
if(state.solved >= items.length){
qEl.innerHTML = '<b style="color:var(--ok)">Все задания решены!</b> +'+xpReward+' XP.';
inp.value=''; inp.disabled=true; go.disabled=true;
if(scoreEl) scoreEl.textContent = state.solved;
if(!state.awarded){ state.awarded = true; save(); addXp(xpReward, 'quiz-'+id); }
return;
}
const it = items[state.idx % items.length];
qEl.innerHTML = it.q; inp.value=''; inp.disabled=false; go.disabled=false; fbEl.style.display='none';
if(scoreEl) scoreEl.textContent = state.solved;
renderMath(qEl);
}
function check(){
const it = items[state.idx % items.length];
const v = normalizeAns(inp.value);
const ans = Array.isArray(it.answer) ? it.answer.map(normalizeAns) : [normalizeAns(it.answer)];
if(ans.indexOf(v) >= 0){
state.solved++; state.idx++; save();
if(scoreEl) scoreEl.textContent = state.solved;
fbEl.className='feedback ok'; fbEl.innerHTML='&#10003; Верно. '+(it.explain||''); fbEl.style.display='block'; renderMath(fbEl);
setTimeout(render, 850);
} else { fbEl.className='feedback fail'; fbEl.innerHTML='&#10007; Не так. '+(it.explain||''); fbEl.style.display='block'; renderMath(fbEl); }
}
go.addEventListener('click', check);
inp.addEventListener('keydown', e=>{ if(e.key==='Enter'){ e.preventDefault(); check(); } });
render();
}
/* ===== Theory blocks ===== */
const P1_THEORY = makeCard('theory', 'Состав атомного ядра', '§ 35',
'<p>Атомное ядро состоит из <b>нуклонов</b>: <b>протонов</b> ($p$, заряд +e) и <b>нейтронов</b> ($n$, заряд 0).</p>'
+ '<p><b>Обозначение</b>: ${}^A_Z X$, где $X$ — символ элемента, $Z$ — зарядовое число (= номер элемента в таблице Менделеева), $A$ — массовое число (= число нуклонов).</p>'
+ '<p>Число нейтронов: $N = A - Z$.</p>'
+ '<p><b>Размер ядра:</b> $R \\approx 1{,}2 \\cdot A^{1/3} \\cdot 10^{-15}$ м.</p>'
+ '<p><b>Ядерные силы</b> — короткодействующие ($\\sim 10^{-15}$ м), сильнее электростатического отталкивания протонов, не зависят от заряда. Это сильное ядерное взаимодействие.</p>'
+ '<p><b>Изотопы</b> — ядра с одинак. $Z$, но разн. $N$ (тот же элемент): ${}^1_1\\text{H}, {}^2_1\\text{D}, {}^3_1\\text{T}$.</p>'
+ '<p><b>Изобары</b> — ядра с одинак. $A$, но разн. $Z$.</p>');
const P2_THEORY = makeCard('theory', 'Ядерные реакции', '§ 36',
'<p><b>Ядерная реакция</b> — процесс взаимодействия ядра с частицей или другим ядром, приводящий к изменению состава ядра.</p>'
+ '<p>Запись: $X + a \\to Y + b$ или $X(a, b)Y$.</p>'
+ '<p><b>Законы сохранения в ядерных реакциях:</b></p>'
+ '<ul>'
+ '<li><b>Заряда</b>: $\\sum Z_{до} = \\sum Z_{после}$.</li>'
+ '<li><b>Массового числа</b> (нуклонов): $\\sum A_{до} = \\sum A_{после}$.</li>'
+ '<li><b>Энергии</b>: $\\sum (E_к + mc^2)_{до} = \\sum (E_к + mc^2)_{после}$.</li>'
+ '<li>Импульса, момента импульса.</li>'
+ '</ul>'
+ '<p><b>Пример:</b> ${}^{14}_7\\text{N} + {}^4_2\\text{He} \\to {}^{17}_8\\text{O} + {}^1_1\\text{H}$ (Резерфорд, 1919, первая искусственная реакция).</p>'
+ '<p><b>Энергетический выход</b> реакции: $Q = (\\Delta m) c^2$, где $\\Delta m$ — изменение массы покоя.</p>');
const P3_THEORY = makeCard('theory', 'Энергия связи и удельная энергия', '§ 37',
'<p>Масса ядра <b>меньше</b> суммы масс свободных нуклонов:</p>'
+ '<p style="text-align:center;margin:8px 0">$$\\Delta m = Z m_p + N m_n - m_я$$</p>'
+ '<p>Это <b>дефект массы</b>. Соответствующая энергия — <b>энергия связи</b>:</p>'
+ '<p style="text-align:center;margin:8px 0">$$E_{св} = \\Delta m \\cdot c^2$$</p>'
+ '<p>Это энергия, которую нужно затратить, чтобы расщепить ядро на отдельные нуклоны.</p>'
+ '<p><b>Удельная энергия связи</b>:</p>'
+ '<p style="text-align:center;margin:8px 0">$$\\varepsilon = E_{св}/A$$</p>'
+ '<p>Максимум $\\varepsilon \\approx 8{,}8$ МэВ у $A \\approx 56$ (Fe, Ni). У лёгких ($A < 30$) и тяжёлых ($A > 200$) ядер $\\varepsilon$ меньше — поэтому <b>при делении тяжёлых и при синтезе лёгких</b> ядер высвобождается энергия.</p>'
+ '<p>1 а.е.м. = $1{,}66 \\cdot 10^{-27}$ кг $\\leftrightarrow$ 931,5 МэВ.</p>');
const P4_THEORY = makeCard('theory', 'Радиоактивность и виды распада', '§ 38',
'<p><b>Радиоактивность</b> — самопроизвольное превращение неустойчивых ядер с испусканием частиц или излучения. Открыта А. Беккерелем (1896).</p>'
+ '<p><b>Три вида распада</b>:</p>'
+ '<ul>'
+ '<li><b>α-распад</b>: испускание α-частицы ${}^4_2\\text{He}$. ${}^A_Z X \\to {}^{A-4}_{Z-2} Y + {}^4_2\\text{He}$.</li>'
+ '<li><b>β⁻-распад</b>: нейтрон $\\to$ протон + электрон + антинейтрино. ${}^A_Z X \\to {}^A_{Z+1} Y + e^- + \\bar{\\nu}_e$.</li>'
+ '<li><b>β⁺-распад</b>: протон $\\to$ нейтрон + позитрон + нейтрино.</li>'
+ '<li><b>γ-излучение</b> — высокочастотные ЭМ-волны от возбуждённых ядер.</li>'
+ '</ul>'
+ '<p><b>Свойства излучений:</b></p>'
+ '<ul>'
+ '<li><b>α</b> — тяжёлая, малая проникающая (бумага задерживает), высокая ионизирующая.</li>'
+ '<li><b>β</b> — лёгкая, средняя проникающая (фольга), средняя ионизирующая.</li>'
+ '<li><b>γ</b> — высокая проникающая (метры свинца), низкая ионизирующая.</li>'
+ '</ul>');
const P5_THEORY = makeCard('rule', 'Закон радиоактивного распада', '§ 39',
'<p>За одинаковые промежутки времени распадается одна и та же <b>доля</b> ядер. Закон:</p>'
+ '<p style="text-align:center;margin:8px 0">$$N(t) = N_0 \\cdot 2^{-t/T}$$</p>'
+ '<p>где $T$ — <b>период полураспада</b> (время, за которое распадается половина ядер).</p>'
+ '<p>Эквивалентная форма: $N = N_0 \\cdot e^{-\\lambda t}$, где $\\lambda = \\ln 2 / T$ — постоянная распада.</p>'
+ '<p><b>Активность</b> — число распадов в секунду: $A = -dN/dt = \\lambda N$. Единица: Беккерель (Бк) = 1 распад/с.</p>'
+ '<p><b>Типичные $T$:</b> ${}^{238}\\text{U}$ — 4,5 млрд лет; ${}^{14}\\text{C}$ — 5730 лет (датирование); ${}^{131}\\text{I}$ — 8 дней; ${}^{220}\\text{Rn}$ — 55 с.</p>');
const P6_THEORY = makeCard('theory', 'Деление тяжёлых ядер и цепные реакции', '§ 40',
'<p><b>Деление ядер</b> — распад тяжёлого ядра на два более лёгких при попадании нейтрона. Открыто О. Ганом и Ф. Штрассманом (1938).</p>'
+ '<p>Пример: ${}^{235}\\text{U} + n \\to {}^{139}\\text{Ba} + {}^{94}\\text{Kr} + 3n$ + энергия $\\sim 200$ МэВ.</p>'
+ '<p>На каждое деление выделяется $\\sim 2{,}5$ нейтронов, которые могут вызвать новые деления.</p>'
+ '<p><b>Коэффициент размножения</b> $k$ — отношение числа нейтронов в данном поколении к предыдущему.</p>'
+ '<ul>'
+ '<li>$k < 1$ — реакция затухает.</li>'
+ '<li>$k = 1$ — стационарная цепная реакция (реактор).</li>'
+ '<li>$k > 1$ — нарастающая лавина (атомная бомба).</li>'
+ '</ul>'
+ '<p><b>Критическая масса</b> — минимальная масса делящегося вещества для $k = 1$ (${}^{235}\\text{U} \\approx 47$ кг шар).</p>');
const P7_THEORY = makeCard('theory', 'Ядерный реактор — устройство', '§ 41',
'<p><b>Ядерный реактор</b> — устройство для управляемой цепной реакции. Первый: Чикаго, Э. Ферми (1942).</p>'
+ '<p><b>Основные элементы:</b></p>'
+ '<ul>'
+ '<li><b>Топливо</b> — ${}^{235}\\text{U}$ (3-5% обогащение) или ${}^{239}\\text{Pu}$.</li>'
+ '<li><b>Замедлитель</b> — вода, тяжёлая вода (D₂O), графит. Замедляет быстрые нейтроны до тепловых, чтобы они эффективнее делили U-235.</li>'
+ '<li><b>Управляющие стержни</b> — бор, кадмий. Поглощают нейтроны, регулируя $k$ около 1.</li>'
+ '<li><b>Теплоноситель</b> — вода, жидкий натрий — отводит тепло.</li>'
+ '<li><b>Биологическая защита</b> — толстый слой бетона + сталь.</li>'
+ '</ul>'
+ '<p><b>Типы:</b> ВВЭР (вода-вода), РБМК (графит-вода), БН (быстрые нейтроны). Аварии: Чернобыль (1986), Фукусима (2011).</p>');
const P8_THEORY = makeCard('theory', 'Реакции ядерного синтеза', '§ 42',
'<p><b>Термоядерный синтез</b> — слияние лёгких ядер в более тяжёлые с выделением энергии. Условие: температура $\\sim 10^7-10^8$ К (преодоление кулоновского барьера).</p>'
+ '<p><b>Энергия Солнца и звёзд</b> — pp-цикл: $4 {}^1\\text{H} \\to {}^4\\text{He} + 2 e^+ + 2 \\nu + 26{,}7$ МэВ.</p>'
+ '<p><b>Земные реакции:</b></p>'
+ '<p style="text-align:center;margin:6px 0">$${}^2\\text{H} + {}^3\\text{H} \\to {}^4\\text{He} + n + 17{,}6 \\text{ МэВ}$$</p>'
+ '<p>Эта реакция — основа водородной бомбы и термоядерных реакторов (ИТЭР, токамаки).</p>'
+ '<p><b>Преимущества</b> синтеза перед делением: топливо (D из воды) практически неисчерпаемо; меньше радиоактивных отходов.</p>'
+ '<p><b>Проблема</b>: удержание плазмы. Подходы — магнитное удержание (токамак), инерциальное (лазерный поджиг).</p>');
const P9_THEORY = makeCard('theory', 'Ионизирующее излучение и дозы', '§ 43',
'<p><b>Ионизирующее излучение</b> — α, β, γ, нейтроны, рентген, протоны. Вызывает ионизацию атомов вещества.</p>'
+ '<p><b>Поглощённая доза</b> $D = E/m$ — энергия излучения на массу вещества. Единица — <b>Грей (Гр)</b> = 1 Дж/кг.</p>'
+ '<p><b>Эквивалентная доза</b> $H = D \\cdot k$ — учитывает биологическое действие разных излучений. Единица — <b>Зиверт (Зв)</b>. Коэф. $k$: γ, β — 1; α — 20; нейтроны — 5-20.</p>'
+ '<p><b>Нормы:</b></p>'
+ '<ul>'
+ '<li>Естественный фон: ~2-3 мЗв/год.</li>'
+ '<li>Норма для населения: 1 мЗв/год сверх фона.</li>'
+ '<li>Норма для проф. персонала: 20 мЗв/год.</li>'
+ '<li>Острая лучевая болезнь: > 1 Зв; смертельно: > 6 Зв.</li>'
+ '</ul>'
+ '<p><b>Защита:</b> расстояние, время, экран (бумага → α; алюминий → β; свинец, бетон → γ).</p>');
const P10_THEORY = makeCard('theory', 'Стандартная модель элементарных частиц', '§ 44',
'<p><b>Элементарные частицы</b> — частицы, у которых на современный момент не обнаружено внутренней структуры.</p>'
+ '<p><b>Стандартная модель</b> (1970-е):</p>'
+ '<ul>'
+ '<li><b>6 кварков</b>: u, d, c, s, t, b (составляют адроны: протон = uud, нейтрон = udd).</li>'
+ '<li><b>6 лептонов</b>: $e^-, \\mu^-, \\tau^-$ и 3 нейтрино.</li>'
+ '<li><b>Калибровочные бозоны</b> — переносчики взаимодействий: фотон $\\gamma$ (ЭМ), $W^\\pm, Z^0$ (слабое), 8 глюонов $g$ (сильное), гипотетический гравитон.</li>'
+ '<li><b>Бозон Хиггса</b> $H^0$ — обнаружен в LHC (2012). Даёт массу частицам.</li>'
+ '</ul>'
+ '<p><b>4 фундаментальных взаимодействия</b>:</p>'
+ '<ol>'
+ '<li><b>Гравитационное</b> — самое слабое, действует на все массивные тела.</li>'
+ '<li><b>Электромагнитное</b> — между заряженными.</li>'
+ '<li><b>Слабое</b> — β-распад.</li>'
+ '<li><b>Сильное</b> — удерживает кварки в адронах и нуклоны в ядре.</li>'
+ '</ol>'
+ '<p><b>Античастицы</b>: у каждой частицы есть античастица (например, позитрон $e^+$). При встрече — <b>аннигиляция</b>.</p>');
/* ===== Quiz items (compact arrays) ===== */
const QUIZ_CALC = {
1: [
{ q:'${}^{235}_{92}\\text{U}$ — число нейтронов?', answer:'143', explain:'$A - Z = 143$.' },
{ q:'${}^{27}_{13}\\text{Al}$ — число нейтронов?', answer:'14', explain:'$27 - 13 = 14$.' },
{ q:'${}^4_2\\text{He}$ — число нуклонов?', answer:'4', explain:'$A = 4$.' },
{ q:'${}^{14}_7\\text{N}$ — число электронов (нейтр. атом)?', answer:'7', explain:'$= Z = 7$.' },
{ q:'$R$ ядра $A = 64$ (м) ≈?', answer:['4.8e-15','5e-15'], explain:'$1{,}2 \\cdot 4 \\cdot 10^{-15}$.' }
],
2: [
{ q:'${}^{14}\\text{N} + {}^4\\text{He} \\to {}^{17}\\text{O} + ?$ ($A$ продукта)?', answer:'1', explain:'${}^1\\text{H}$, $A = 1$.' },
{ q:'${}^{27}\\text{Al} + n \\to {}^{24}\\text{Na} + ?$ ($A$, $Z$ продукта)?', answer:['4,2','4 2','42'], explain:'${}^4_2\\text{He}$.' },
{ q:'Год первой искусств. реакции (Резерфорд)?', answer:'1919', explain:'1919.' },
{ q:'Сохраняется в ядерной реакции:', answer:['заряд','q','z'], explain:'$\\sum Z$ const.' },
{ q:'1 МэВ в Дж ≈?', answer:['1.6e-13','1.6·10⁻¹³'], explain:'$1{,}6 \\cdot 10^{-13}$.' }
],
3: [
{ q:'1 а.е.м. в МэВ?', answer:'931.5', explain:'$931{,}5$ МэВ.' },
{ q:'$\\Delta m = 0{,}03$ а.е.м. $E_{св}$ (МэВ)?', answer:['27.9','28','27.94'], explain:'$0{,}03 \\cdot 931{,}5 \\approx 27{,}9$.' },
{ q:'Удельная $\\varepsilon$ макс. у $A$ ≈?', answer:'56', explain:'Fe-56.' },
{ q:'Макс. $\\varepsilon$ (МэВ)?', answer:'8.8', explain:'$\\approx 8{,}8$ МэВ.' },
{ q:'$E = mc^2$. $m = 1$ а.е.м., $E$ (МэВ)?', answer:'931.5', explain:'$931{,}5$ МэВ.' }
],
4: [
{ q:'α-частица это:', answer:['he','гелий','альфа'], explain:'${}^4_2\\text{He}$.' },
{ q:'$\\beta^-$ — что испускается?', answer:['e-','электрон','е'], explain:'Электрон.' },
{ q:'${}^{226}\\text{Ra} \\to {}^A\\text{Rn} + \\alpha$. $A$ Rn?', answer:'222', explain:'$226 - 4 = 222$.' },
{ q:'Кто открыл радиоактивность (год)?', answer:'1896', explain:'А. Беккерель.' },
{ q:'Что задерживает γ-лучи лучше всего?', answer:['свинец','pb'], explain:'Свинец.' }
],
5: [
{ q:'$N_0 = 1000$, $t = 2T$. $N$?', answer:'250', explain:'$N_0/4 = 250$.' },
{ q:'$t = 3T$. $N/N_0$?', answer:['1/8','0.125'], explain:'$2^{-3} = 1/8$.' },
{ q:'Через сколько $T$ останется 1/16?', answer:'4', explain:'$2^{-4}$.' },
{ q:'$T = 8$ дней. За 24 дня — остаток?', answer:['1/8','0.125'], explain:'$24 = 3T$.' },
{ q:'$T = 5730$ лет (C-14). Возраст образца с $N/N_0 = 1/4$ (лет)?', answer:'11460', explain:'$2T = 11460$.' }
],
6: [
{ q:'Делящийся изотоп урана:', answer:'235', explain:'${}^{235}\\text{U}$.' },
{ q:'Среднее число нейтронов на акт деления:', answer:['2.5','2,5'], explain:'$\\sim 2{,}5$.' },
{ q:'Энергия на 1 акт деления (МэВ) ≈?', answer:'200', explain:'$\\sim 200$.' },
{ q:'$k = 1$ означает:', answer:['стационар','стац','стационарн.'], explain:'Стационарная цепная.' },
{ q:'Критическая масса U-235 (кг) ≈?', answer:'47', explain:'$\\sim 47$ кг.' }
],
7: [
{ q:'Первый реактор (год)?', answer:'1942', explain:'Чикаго, Ферми.' },
{ q:'Замедлитель в РБМК:', answer:['графит'], explain:'Графит.' },
{ q:'Поглотитель нейтронов:', answer:['бор','b','кадмий','cd'], explain:'B, Cd.' },
{ q:'Тип АЭС в СНГ:', answer:['ввэр','рбмк'], explain:'ВВЭР или РБМК.' },
{ q:'Чернобыль (год)?', answer:'1986', explain:'1986.' }
],
8: [
{ q:'D + T → ? + n. Что в продукте?', answer:['he','гелий','α','альфа','he-4'], explain:'${}^4\\text{He}$.' },
{ q:'$T$ нужна для синтеза (К) ≈?', answer:['1e8','100000000','10⁸'], explain:'$\\sim 10^8$ K.' },
{ q:'Энергия реакции D+T (МэВ) ≈?', answer:'17.6', explain:'17,6 МэВ.' },
{ q:'Где идёт термояд в природе:', answer:['солнце','звёзды'], explain:'В звёздах.' },
{ q:'Установка для синтеза:', answer:['токамак','итэр'], explain:'Токамак.' }
],
9: [
{ q:'Поглощённая доза $E = 0{,}1$ Дж, $m = 50$ кг. $D$ (мкГр)?', answer:'2000', explain:'$0{,}1/50 = 2 \\cdot 10^{-3}$ Гр $= 2000$ мкГр.' },
{ q:'Для γ $k$ равен?', answer:'1', explain:'$k = 1$.' },
{ q:'Для α $k$ равен?', answer:'20', explain:'$\\sim 20$.' },
{ q:'Естест. фон (мЗв/год) ≈?', answer:['2','3','2.5'], explain:'$\\sim 2-3$.' },
{ q:'Норма для населения (мЗв/год)?', answer:'1', explain:'1 мЗв.' }
],
10: [
{ q:'Сколько кварков в Стандартной модели?', answer:'6', explain:'u,d,c,s,t,b.' },
{ q:'Сколько лептонов?', answer:'6', explain:'e,μ,τ + 3 ν.' },
{ q:'Сколько фунд. взаимодействий?', answer:'4', explain:'Грав., ЭМ, слабое, сильное.' },
{ q:'Год открытия бозона Хиггса?', answer:'2012', explain:'LHC, 2012.' },
{ q:'Протон состоит из кварков:', answer:['uud','u u d'], explain:'2u + d.' }
]
};
const QUIZ_TH = {
1: [
{ q:'Нуклоны — это:', opts:['Только протоны','Протоны + нейтроны','Электроны','Кварки'], correct:1, explain:'p + n.' },
{ q:'$Z$ — это:', opts:['Нуклоны','Протоны','Нейтроны','Электроны'], correct:1, explain:'Протоны.' },
{ q:'Изотопы:', opts:['Разн. Z','Одинак. Z, разн. N','Одинак. A','Одинак. N'], correct:1, explain:'Одинак. Z.' },
{ q:'Ядерные силы:', opts:['Дальнодейств.','Короткодейств. ($10^{-15}$ м)','Гравит.','ЭМ'], correct:1, explain:'Короткодейств.' },
{ q:'Размер ядра (м):', opts:['$10^{-10}$','$10^{-15}$','$10^{-3}$','$10^{-30}$'], correct:1, explain:'$\\sim 10^{-15}$.' }
],
2: [
{ q:'В ядерных реакциях сохраняется:', opts:['Только заряд','Только нуклоны','Заряд, нуклоны, энергия','Только масса'], correct:2, explain:'Все три.' },
{ q:'Первая искусственная реакция:', opts:['Резерфорд','Ферми','Кюри','Беккерель'], correct:0, explain:'Резерфорд (1919).' },
{ q:'$Q$ реакции = ?', opts:['$\\Delta m \\cdot c$','$\\Delta m \\cdot c^2$','$\\Delta m / c$','$mc$'], correct:1, explain:'$\\Delta m c^2$.' },
{ q:'Положит. $Q$ означает:', opts:['Энергия выделяется','Поглощается','Не меняется','Реакция невозможна'], correct:0, explain:'Экзоэнергет.' },
{ q:'Запись $X(a, b)Y$ означает:', opts:['$X + Y \\to a + b$','$X + a \\to Y + b$','$X = a + b - Y$','Иное'], correct:1, explain:'Стандарт. запись.' }
],
3: [
{ q:'Дефект массы:', opts:['$m_я > \\sum m_n$','$m_я = \\sum m_n$','$m_я < \\sum m_n$','Любое'], correct:2, explain:'$m_я < \\sum m_n$.' },
{ q:'$E_{св}$ это:', opts:['Энергия отрыва $e^-$','Энергия расщепления ядра','$E_к$','$mc^2$'], correct:1, explain:'Расщепить на нуклоны.' },
{ q:'Макс. $\\varepsilon$ у:', opts:['H','Fe','U','He'], correct:1, explain:'Fe-56.' },
{ q:'1 а.е.м. (МэВ):', opts:['511','939','931,5','1000'], correct:2, explain:'931,5.' },
{ q:'При синтезе:', opts:['Поглощается $E$','Выделяется $E$','Ничего','Зависит от ядра'], correct:1, explain:'Выделяется.' }
],
4: [
{ q:'Кто открыл радиоактивность?', opts:['Кюри','Беккерель','Резерфорд','Эйнштейн'], correct:1, explain:'А. Беккерель (1896).' },
{ q:'α-частица:', opts:['$e^-$','Фотон','${}^4_2\\text{He}$','Нейтрон'], correct:2, explain:'Гелий.' },
{ q:'β-распад:', opts:['Испускание $\\alpha$','Электрон','γ-фотон','Нейтрон'], correct:1, explain:'$e^-$.' },
{ q:'γ-излучение:', opts:['Частицы','ЭМ-волны','Звук','Нейтрино'], correct:1, explain:'ЭМ.' },
{ q:'Самая проникающая:', opts:['α','β','γ','Все одинаково'], correct:2, explain:'γ.' }
],
5: [
{ q:'Закон распада:', opts:['$N = N_0 t$','$N = N_0 \\cdot 2^{-t/T}$','$N = N_0 / t$','$N = N_0$'], correct:1, explain:'$2^{-t/T}$.' },
{ q:'$T$ — это:', opts:['Время до полного распада','Время уменьш. вдвое','Период колебаний','Полупериод'], correct:1, explain:'Полураспад.' },
{ q:'C-14 ($T = 5730$ лет) используется:', opts:['Для бомб','Для датирования','В реакторе','В медицине'], correct:1, explain:'Радиоугл. датирование.' },
{ q:'Активность измеряется в:', opts:['Зивертах','Греях','Беккерелях','Ваттах'], correct:2, explain:'Бк.' },
{ q:'$\\lambda$ и $T$:', opts:['$\\lambda = T$','$\\lambda = 1/T$','$\\lambda = \\ln 2 / T$','$\\lambda = T \\cdot \\ln 2$'], correct:2, explain:'$\\lambda = \\ln 2 / T$.' }
],
6: [
{ q:'Деление открыли:', opts:['Резерфорд','Ферми','Ган и Штрассман','Эйнштейн'], correct:2, explain:'1938.' },
{ q:'Делящееся:', opts:['U-238','U-235, Pu-239','He-4','C-14'], correct:1, explain:'U-235, Pu-239.' },
{ q:'$k > 1$ — это:', opts:['Реактор','Бомба','Затухание','Невозможно'], correct:1, explain:'Лавина.' },
{ q:'Энергия деления (МэВ):', opts:['$\\sim 2$','$\\sim 20$','$\\sim 200$','$\\sim 2000$'], correct:2, explain:'$\\sim 200$.' },
{ q:'Чтобы цепная реакция шла:', opts:['$k < 0$','$k = 1$','$k = 0$','Любое $k$'], correct:1, explain:'$k = 1$.' }
],
7: [
{ q:'Первый реактор:', opts:['СССР','США','Англия','Германия'], correct:1, explain:'Чикаго (1942).' },
{ q:'Стержни регулирования из:', opts:['U','B/Cd','Al','Cu'], correct:1, explain:'B, Cd.' },
{ q:'Замедлитель в ВВЭР:', opts:['Графит','H₂O','Pb','Воздух'], correct:1, explain:'H₂O.' },
{ q:'Топливо обогащ. до:', opts:['100%','3-5%','50%','0,7%'], correct:1, explain:'3-5% U-235.' },
{ q:'Чернобыль (тип):', opts:['ВВЭР','РБМК','БН','PWR'], correct:1, explain:'РБМК.' }
],
8: [
{ q:'Термояд требует:', opts:['Низкой T','Высокой T','Высокого давления','Низкого P'], correct:1, explain:'$\\sim 10^8$ К.' },
{ q:'Топливо термояда:', opts:['U','D + T','Pu','C'], correct:1, explain:'Дейтерий + тритий.' },
{ q:'Солнце светит за счёт:', opts:['Горения','Термояда','Гравитации','Электр.'], correct:1, explain:'pp-цикл.' },
{ q:'ИТЭР — это:', opts:['Реактор деления','Термояд. реактор','Спутник','Ускоритель'], correct:1, explain:'Токамак.' },
{ q:'Удержание плазмы:', opts:['Стенками','Магн. полем','Гравитацией','Не требуется'], correct:1, explain:'Маг. удерж.' }
],
9: [
{ q:'Грей измеряет:', opts:['Активность','Поглощ. дозу','Экв. дозу','Энергию'], correct:1, explain:'$D$.' },
{ q:'Зиверт измеряет:', opts:['$D$','$H$','$A$','Время'], correct:1, explain:'Эквив. доза.' },
{ q:'1 Гр для γ = ? Зв', opts:['0,05','1','20','100'], correct:1, explain:'$k = 1$.' },
{ q:'Острая луч. бол. при:', opts:['$> 0{,}1$ Зв','$> 1$ Зв','$> 100$ Зв','Любая'], correct:1, explain:'$> 1$ Зв.' },
{ q:'Защита от γ:', opts:['Бумага','Свинец','Воздух','Вода'], correct:1, explain:'Свинец.' }
],
10: [
{ q:'Нуклон состоит из:', opts:['Электронов','3 кварков','Фотонов','Атомов'], correct:1, explain:'3 кварка.' },
{ q:'Сколько фунд. взаимодействий?', opts:['2','3','4','5'], correct:2, explain:'4.' },
{ q:'Бозон Хиггса (год)?', opts:['1990','2000','2012','2020'], correct:2, explain:'2012, LHC.' },
{ q:'Самое слабое взаимодействие:', opts:['Гравитация','ЭМ','Слабое','Сильное'], correct:0, explain:'Гравитация.' },
{ q:'Фотон — переносчик:', opts:['Сильного','Слабого','ЭМ','Гравитации'], correct:2, explain:'ЭМ.' }
]
};
const BOSS_DEFS = {};
for (let i = 1; i <= 10; i++){
BOSS_DEFS['b' + i] = {
title: 'Босс §' + (34 + i) + ' — ' + PARAS[i-1].name, tag: '§' + (34 + i), xp: 70,
stages: [
Object.assign({type: QUIZ_CALC[i][0].answer ? 'input' : 'mc'}, QUIZ_CALC[i][0], { a: QUIZ_CALC[i][0].answer }),
Object.assign({type:'mc'}, QUIZ_TH[i][0]),
Object.assign({type:'input'}, QUIZ_CALC[i][1], { a: QUIZ_CALC[i][1].answer }),
Object.assign({type:'mc'}, QUIZ_TH[i][1]),
Object.assign({type:'input'}, QUIZ_CALC[i][2], { a: QUIZ_CALC[i][2].answer })
]
};
}
const FINAL_BOSS_DEFS = {
fb1: { title:'Финал §35-§37 — Ядро и связь', tag:'Финал I', xp:50, stages:[
{ q:'${}^{27}_{13}\\text{Al}$ — $N$?', type:'input', a:'14', explain:'$27 - 13$.' },
{ q:'Дефект массы $\\Delta m$:', type:'mc', opts:['$m_я > \\sum m_n$','$m_я < \\sum m_n$','$m_я = 0$','$\\sum m_n = 0$'], correct:1, explain:'Меньше.' },
{ q:'1 а.е.м. (МэВ)?', type:'input', a:'931.5', explain:'931,5.' },
{ q:'Макс. $\\varepsilon$ у:', type:'mc', opts:['H','Fe','U','He'], correct:1, explain:'Fe-56.' },
{ q:'${}^{238}\\text{U}$ — нуклонов?', type:'input', a:'238', explain:'$A$.' }
]},
fb2: { title:'Финал §38-§39 — Радиоактивность', tag:'Финал II', xp:50, stages:[
{ q:'α-частица:', type:'mc', opts:['$e^-$','${}^4\\text{He}$','γ','n'], correct:1, explain:'Гелий.' },
{ q:'Закон распада:', type:'mc', opts:['$N = N_0/t$','$N = N_0 \\cdot 2^{-t/T}$','$N = N_0 t$','$N = N_0$'], correct:1, explain:'$2^{-t/T}$.' },
{ q:'$N_0 = 800$, $t = 3T$. $N$?', type:'input', a:'100', explain:'$800/8$.' },
{ q:'Активность измер. в:', type:'mc', opts:['Гр','Зв','Бк','Дж'], correct:2, explain:'Бк.' },
{ q:'γ-излучение это:', type:'mc', opts:['Частица','ЭМ-волна','Звук','Нейтрино'], correct:1, explain:'ЭМ.' }
]},
fb3: { title:'Финал §40-§41 — Деление и реактор', tag:'Финал III', xp:50, stages:[
{ q:'Делящееся ядро:', type:'mc', opts:['U-238','U-235','He-4','Fe-56'], correct:1, explain:'U-235.' },
{ q:'Энергия деления (МэВ)?', type:'input', a:'200', explain:'$\\sim 200$.' },
{ q:'$k = 1$ — это:', type:'mc', opts:['Бомба','Стационар','Затухание','Невозможно'], correct:1, explain:'Реактор.' },
{ q:'Стержни — из:', type:'mc', opts:['Cu','B/Cd','U','Al'], correct:1, explain:'B, Cd.' },
{ q:'Чернобыль (год)?', type:'input', a:'1986', explain:'1986.' }
]},
fb4: { title:'Финал §42-§43 — Синтез и дозы', tag:'Финал IV', xp:50, stages:[
{ q:'Топливо термояда:', type:'mc', opts:['U','D + T','Pu','C'], correct:1, explain:'Дейтерий + тритий.' },
{ q:'Энергия D+T (МэВ)?', type:'input', a:'17.6', explain:'17,6.' },
{ q:'Зиверт измер.:', type:'mc', opts:['Поглощ. дозу','Эквив. дозу','Активность','Время'], correct:1, explain:'$H$.' },
{ q:'Норма для нас. (мЗв/год)?', type:'input', a:'1', explain:'1.' },
{ q:'Удержание плазмы:', type:'mc', opts:['Стенками','Магн. полем','Гравитацией','Не требуется'], correct:1, explain:'Магнитное.' }
]},
fb5: { title:'Финал §44 — Элементарные частицы', tag:'Финал V', xp:50, stages:[
{ q:'Сколько кварков?', type:'input', a:'6', explain:'6.' },
{ q:'Сколько фунд. взаимод.?', type:'input', a:'4', explain:'4.' },
{ q:'Самое слабое:', type:'mc', opts:['Грав.','ЭМ','Слабое','Сильное'], correct:0, explain:'Гравитация.' },
{ q:'Бозон Хиггса (год)?', type:'input', a:'2012', explain:'2012.' },
{ q:'Протон = ?', type:'mc', opts:['uud','udd','ddd','uuu'], correct:0, explain:'uud.' }
]}
};
function init(){
loadProgress(); initTheme(); buildParaSelector(); goTo('p1'); refreshProgressUI();
if(!STATE.achievements.has('start')) achievement('start');
}
if(document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);
else init();
</script>
</body>
</html>