// entrainement-imm1033.js — générateurs de problèmes à données aléatoires (IMM1033) window.UQO_TRAINING = [ { id: "formule", title: "Équation générale de la méthode du coût", ch: "01", url: "/seance/01/#s-1-3", gen(R) { const vt = R.step(90000, 450000, 5000); const cn = R.step(400000, 2400000, 10000); const dp = Math.round(cn * R.pick([0.18, 0.22, 0.27, 0.31, 0.36]) / 1000) * 1000; const df = R.step(0, 60000, 5000); const de = R.step(0, 80000, 5000); const v = vt + cn - dp - df - de; return { enonce: `Terrain : ${R.money(vt)} ; coût neuf des améliorations : ${R.money(cn)} ; dépréciation physique : ${R.money(dp)} ; fonctionnelle : ${R.money(df)} ; externe (améliorations) : ${R.money(de)}. Quelle est la valeur par la méthode du coût ?`, answer: v, unit: "$", tol: 0.002, steps: `
Dtotale = ${R.money(dp)} + ${R.money(df)} + ${R.money(de)} = ${R.money(dp + df + de)} (${R.pct((dp + df + de) / cn * 100, 1)} du coût neuf).
V = VT + (CN − D) = ${R.money(vt)} + (${R.money(cn)} − ${R.money(dp + df + de)}) = ${R.money(v)}.
`, }; }, }, { id: "coutneuf", title: "Coût neuf total (directs, indirects, profit)", ch: "08", url: "/seance/08/#s-8-7", gen(R) { const sup = R.step(1200, 24000, 100); const cu = R.step(120, 260, 5); const ind = R.pick([15, 17, 19, 20, 22, 25]); const prof = R.pick([8, 10, 12, 15]); const d = sup * cu, i = d * ind / 100, p = (d + i) * prof / 100; return { enonce: `Bâtiment de ${R.num(sup, 0)} pi², coûts directs de ${R.money(cu)}/pi². Coûts indirects : ${ind} % des directs ; profit entrepreneurial : ${prof} % de (directs + indirects). Quel est le coût neuf total ?`, answer: d + i + p, unit: "$", tol: 0.002, steps: `Directs = ${R.num(sup, 0)} × ${R.money(cu)} = ${R.money(d)}.
Indirects = ${ind} % × ${R.money(d)} = ${R.money(i)}.
Profit = ${prof} % × (${R.money(d)} + ${R.money(i)}) = ${R.money(p)}.
CN = ${R.money(d + i + p)} (soit ${R.money2((d + i + p) / sup)}/pi², +${R.pct((i + p) / d * 100, 1)} au-dessus des directs).
`, }; }, }, { id: "indexation", title: "Indexation d’un coût (IPCB)", ch: "05", url: "/seance/05/#s-5-5", gen(R) { const c0 = R.step(300000, 3000000, 10000); const i0 = R.pick([71.6, 78.2, 84.9, 92.3, 100, 103.1]); const i1 = R.pick([105.5, 107.2, 108.7, 110.4]); return { enonce: `Un bâtiment a coûté ${R.money(c0)} à une date où l’indice des prix de la construction (IPCB) valait ${R.num(i0, 1)}. L’indice à la date d’évaluation est de ${R.num(i1, 1)}. Quel est le coût indexé ?`, answer: c0 * i1 / i0, unit: "$", tol: 0.002, steps: `Ccible = Cconnu × Icible/Iconnu = ${R.money(c0)} × ${R.num(i1, 1)}/${R.num(i0, 1)} = ${R.money(c0)} × ${R.num(i1 / i0, 4)} = ${R.money(c0 * i1 / i0)}.
`, }; }, }, { id: "agevie", title: "Âge/vie modifiée", ch: "09", url: "/seance/09/#s-9-6", gen(R) { const cn = R.step(400000, 1800000, 10000); const cur = R.step(8000, 60000, 1000); const age = R.int(6, 40); const vie = R.pick([45, 50, 55, 60, 65, 70]); const inc = (cn - cur) * age / vie; return { enonce: `Coût neuf : ${R.money(cn)} ; entretien différé : ${R.money(cur)} ; âge effectif : ${age} ans ; vie économique : ${vie} ans. Quelle est la dépréciation physique totale (curable + incurable, âge/vie modifiée) ?`, answer: cur + inc, unit: "$", tol: 0.002, steps: `Curable = ${R.money(cur)} (sort en premier).
Incurable = (${R.money(cn)} − ${R.money(cur)}) × ${age}/${vie} = ${R.money(cn - cur)} × ${R.pct(age / vie * 100, 1)} = ${R.money(inc)}.
Total = ${R.money(cur + inc)} (${R.pct((cur + inc) / cn * 100, 1)} du coût neuf).
`, }; }, }, { id: "ct", title: "Incurable court terme d’une composante", ch: "10", url: "/seance/10/#s-10-3", gen(R) { const comp = R.pick([["toiture", 20], ["CVAC", 22], ["fenêtration", 30], ["revêtement de plancher", 15], ["ascenseur", 30]]); const c = R.step(40000, 320000, 1000); const age = R.int(3, comp[1] - 1); return { enonce: `Composante ${comp[0]} : coût neuf ${R.money(c)}, âge effectif ${age} ans, durée de vie ${comp[1]} ans, aucune portion curable. Quelle est sa dépréciation incurable court terme ?`, answer: c * age / comp[1], unit: "$", tol: 0.002, steps: `DCT = Cneuf × âge/vie = ${R.money(c)} × ${age}/${comp[1]} = ${R.money(c)} × ${R.pct(age / comp[1] * 100, 1)} = ${R.money(c * age / comp[1])}.
`, }; }, }, { id: "lt", title: "Base et dépréciation long terme", ch: "10", url: "/seance/10/#s-10-3", gen(R) { const cn = R.step(900000, 3000000, 10000); const cur = R.step(10000, 80000, 1000); const ct = [R.step(60000, 200000, 1000), R.step(80000, 260000, 1000), R.step(50000, 150000, 1000)]; const age = R.int(10, 35), vie = R.pick([45, 50, 55, 60]); const base = cn - cur - ct.reduce((a, b) => a + b, 0); return { enonce: `Coût neuf du bâtiment : ${R.money(cn)} ; entretien différé : ${R.money(cur)} ; coûts neufs des composantes à courte durée de vie : ${ct.map(R.money).join(" ; ")}. Âge effectif global : ${age} ans, vie économique : ${vie} ans. Quelle est la dépréciation incurable long terme ?`, answer: base * age / vie, unit: "$", tol: 0.002, steps: `BaseLT = ${R.money(cn)} − ${R.money(cur)} − ${R.money(ct.reduce((a, b) => a + b, 0))} = ${R.money(base)}.
DLT = ${R.money(base)} × ${age}/${vie} = ${R.money(base * age / vie)}.
Piège évité : le ratio long terme ne s’applique jamais au coût neuf entier.
`, }; }, }, { id: "extraction", title: "Terrain par extraction", ch: "03", url: "/seance/03/#s-3-3", gen(R) { const prix = R.step(500000, 2500000, 10000); const cn = Math.round(prix * R.pick([0.75, 0.8, 0.85, 0.9]) / 1000) * 1000; const dep = R.pick([20, 25, 30, 35, 40]); const amel = cn * (1 - dep / 100); return { enonce: `Une propriété bâtie s’est vendue ${R.money(prix)}. Le coût neuf des améliorations est estimé à ${R.money(cn)} et leur dépréciation totale à ${dep} %. Quelle valeur du terrain obtenez-vous par extraction ?`, answer: prix - amel, unit: "$", tol: 0.002, steps: `Améliorations dépréciées = ${R.money(cn)} × (1 − ${dep} %) = ${R.money(amel)}.
VT = ${R.money(prix)} − ${R.money(amel)} = ${R.money(prix - amel)} (ratio terrain ${R.pct((prix - amel) / prix * 100, 1)}).
`, }; }, }, { id: "harper", title: "Règle 4-3-2-1 de Harper", ch: "04", url: "/seance/04/#s-4-2", gen(R) { const vstd = R.step(90000, 320000, 5000); const pstd = R.pick([100, 120, 150, 200]); const q = pstd / 4; const p = R.pick([1, 2, 3]) * q; const parts = [0.4, 0.3, 0.2, 0.1]; let ratio = 0; for (let i = 0; i < 4; i++) ratio += Math.max(0, Math.min(q, p - i * q)) / q * parts[i]; return { enonce: `Dans un secteur où la profondeur standard est de ${pstd} pi, un lot standard vaut ${R.money(vstd)}. Selon la règle de Harper (4-3-2-1), que vaut un lot de même façade mais de ${p} pi de profondeur ?`, answer: vstd * ratio, unit: "$", tol: 0.002, steps: `Quart = ${q} pi. Le lot couvre ${p / q} quart(s) : ${parts.slice(0, p / q).map((x) => x * 100 + " %").join(" + ")} = ${R.pct(ratio * 100, 0)} de la valeur.
V = ${R.money(vstd)} × ${R.pct(ratio * 100, 0)} = ${R.money(vstd * ratio)}.
`, }; }, }, { id: "intercalaires", title: "Intérêts intercalaires", ch: "08", url: "/seance/08/#s-8-3", gen(R) { const cd = R.step(600000, 4000000, 10000); const i = R.pick([5.5, 5.95, 6.45, 6.95, 7.5]); const t = R.int(8, 24); return { enonce: `Coûts directs de ${R.money(cd)} financés à ${R.num(i, 2)} % pendant un chantier de ${t} mois, décaissements progressifs (facteur ½). Quels sont les intérêts intercalaires ?`, answer: cd * i / 100 * t / 12 * 0.5, unit: "$", tol: 0.003, steps: `I = Cdirects × i × T × ½ = ${R.money(cd)} × ${R.num(i, 2)} % × ${t}/12 × ½ = ${R.money(cd * i / 100 * t / 12 * 0.5)} (${R.pct(i / 100 * t / 12 * 0.5 * 100, 2)} des directs).
`, }; }, }, { id: "allocation", title: "Allocation de la dépréciation externe", ch: "12", url: "/seance/12/#s-12-6", gen(R) { const perte = R.step(6000, 60000, 500); const tga = R.pick([6, 6.5, 7, 7.5, 8]); const vt = R.step(150000, 600000, 10000); const vam = R.step(500000, 2000000, 10000); const dtot = perte / (tga / 100); const ratio = vam / (vam + vt); return { enonce: `Une nuisance externe cause une perte de revenu net de ${R.money(perte)} par an ; TGA de ${R.num(tga, 1)} %. Valeur du terrain avant dépréciation : ${R.money(vt)} ; valeur des améliorations : ${R.money(vam)}. Quelle dépréciation externe appliquez-vous aux améliorations ?`, answer: dtot * ratio, unit: "$", tol: 0.003, steps: `Dtotale = ${R.money(perte)} ÷ ${R.num(tga, 1)} % = ${R.money(dtot)}.
Ratio améliorations = ${R.money(vam)} ÷ ${R.money(vam + vt)} = ${R.pct(ratio * 100, 1)}.
Damél. = ${R.money(dtot)} × ${R.pct(ratio * 100, 1)} = ${R.money(dtot * ratio)} ; la portion terrain (${R.money(dtot * (1 - ratio))}) vit dans VT.
`, }; }, }, { id: "locatives", title: "Améliorations locatives", ch: "13", url: "/seance/13/#s-13-8", gen(R) { const c = R.step(60000, 400000, 5000); const age = R.int(1, 6); const vph = R.pick([12, 15, 20]); const bail = R.int(2, 8); const vie = Math.min(vph, age + bail); return { enonce: `Améliorations locatives : coût neuf ${R.money(c)}, âge ${age} ans, vie physique ${vph} ans, bail restant ${bail} ans (options incluses). Quelle est leur valeur dépréciée ?`, answer: c * (1 - age / vie), unit: "$", tol: 0.003, steps: `Vie utile = min(vie physique ${vph}, âge + bail ${age + bail}) = ${vie} ans.
Dépréciation = ${age}/${vie} = ${R.pct(age / vie * 100, 1)} ; valeur = ${R.money(c)} × (1 − ${R.pct(age / vie * 100, 1)}) = ${R.money(c * (1 - age / vie))}.
`, }; }, }, { id: "unites", title: "Coût unitaire et conversion", ch: "05", url: "/seance/05/#s-5-6", gen(R) { const m2 = R.step(200, 5000, 10); const cpi2 = R.step(90, 320, 5); return { enonce: `Un guide indique ${R.money(cpi2)}/pi² pour un bâtiment de ${R.num(m2, 0)} m². Quel est le coût total ? (1 m² = 10,764 pi²)`, answer: m2 * 10.764 * cpi2, unit: "$", tol: 0.003, steps: `Superficie = ${R.num(m2, 0)} × 10,764 = ${R.num(m2 * 10.764, 0)} pi².
Coût = ${R.num(m2 * 10.764, 0)} × ${R.money(cpi2)} = ${R.money(m2 * 10.764 * cpi2)} (soit ${R.money2(cpi2 * 10.764)}/m²).
`, }; }, }, { id: "superadequation", title: "Superadéquation (nette de la physique)", ch: "11", url: "/seance/11/#s-11-3", gen(R) { const exces = R.step(40000, 200000, 5000); const pct = R.pick([20, 25, 30, 35, 40]); const surcout = R.step(0, 6000, 500); const tga = R.pick([6, 7, 8]); const d = exces * (1 - pct / 100) + surcout / (tga / 100); return { enonce: `Un élément superadéquat présente un excès de coût neuf de ${R.money(exces)}, déjà déprécié physiquement à ${pct} %. Il engendre des surcoûts d’exploitation de ${R.money(surcout)} par an (TGA ${tga} %). Quelle est la dépréciation fonctionnelle incurable ?`, answer: d, unit: "$", tol: 0.003, steps: `Excès net de la physique déjà comptée = ${R.money(exces)} × (1 − ${pct} %) = ${R.money(exces * (1 - pct / 100))}.
Surcoûts capitalisés = ${R.money(surcout)} ÷ ${tga} % = ${R.money(surcout / (tga / 100))}.
D = ${R.money(d)}.
`, }; }, }, ];