spb/uqo-imm1003
Public
JavaScript 68%
CSS 32%
1// entrainement-imm1033.js — générateurs de problèmes à données aléatoires (IMM1033)2window.UQO_TRAINING = [3 {4 id: "formule", title: "Équation générale de la méthode du coût", ch: "01", url: "/seance/01/#s-1-3",5 gen(R) {6 const vt = R.step(90000, 450000, 5000);7 const cn = R.step(400000, 2400000, 10000);8 const dp = Math.round(cn * R.pick([0.18, 0.22, 0.27, 0.31, 0.36]) / 1000) * 1000;9 const df = R.step(0, 60000, 5000);10 const de = R.step(0, 80000, 5000);11 const v = vt + cn - dp - df - de;12 return {13 enonce: `Terrain : <b>${R.money(vt)}</b> ; coût neuf des améliorations : <b>${R.money(cn)}</b> ; dépréciation physique : <b>${R.money(dp)}</b> ; fonctionnelle : <b>${R.money(df)}</b> ; externe (améliorations) : <b>${R.money(de)}</b>. Quelle est la <b>valeur</b> par la méthode du coût ?`,14 answer: v, unit: "$", tol: 0.002,15 steps: `<p>D<sub>totale</sub> = ${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).</p><p>V = V<sub>T</sub> + (C<sub>N</sub> − D) = ${R.money(vt)} + (${R.money(cn)} − ${R.money(dp + df + de)}) = <b>${R.money(v)}</b>.</p>`,16 };17 },18 },19 {20 id: "coutneuf", title: "Coût neuf total (directs, indirects, profit)", ch: "08", url: "/seance/08/#s-8-7",21 gen(R) {22 const sup = R.step(1200, 24000, 100);23 const cu = R.step(120, 260, 5);24 const ind = R.pick([15, 17, 19, 20, 22, 25]);25 const prof = R.pick([8, 10, 12, 15]);26 const d = sup * cu, i = d * ind / 100, p = (d + i) * prof / 100;27 return {28 enonce: `Bâtiment de <b>${R.num(sup, 0)} pi²</b>, coûts directs de <b>${R.money(cu)}/pi²</b>. Coûts indirects : <b>${ind} % des directs</b> ; profit entrepreneurial : <b>${prof} % de (directs + indirects)</b>. Quel est le <b>coût neuf total</b> ?`,29 answer: d + i + p, unit: "$", tol: 0.002,30 steps: `<p>Directs = ${R.num(sup, 0)} × ${R.money(cu)} = ${R.money(d)}.</p><p>Indirects = ${ind} % × ${R.money(d)} = ${R.money(i)}.</p><p>Profit = ${prof} % × (${R.money(d)} + ${R.money(i)}) = ${R.money(p)}.</p><p>C<sub>N</sub> = <b>${R.money(d + i + p)}</b> (soit ${R.money2((d + i + p) / sup)}/pi², +${R.pct((i + p) / d * 100, 1)} au-dessus des directs).</p>`,31 };32 },33 },34 {35 id: "indexation", title: "Indexation d’un coût (IPCB)", ch: "05", url: "/seance/05/#s-5-5",36 gen(R) {37 const c0 = R.step(300000, 3000000, 10000);38 const i0 = R.pick([71.6, 78.2, 84.9, 92.3, 100, 103.1]);39 const i1 = R.pick([105.5, 107.2, 108.7, 110.4]);40 return {41 enonce: `Un bâtiment a coûté <b>${R.money(c0)}</b> à une date où l’indice des prix de la construction (IPCB) valait <b>${R.num(i0, 1)}</b>. L’indice à la date d’évaluation est de <b>${R.num(i1, 1)}</b>. Quel est le <b>coût indexé</b> ?`,42 answer: c0 * i1 / i0, unit: "$", tol: 0.002,43 steps: `<p>C<sub>cible</sub> = C<sub>connu</sub> × I<sub>cible</sub>/I<sub>connu</sub> = ${R.money(c0)} × ${R.num(i1, 1)}/${R.num(i0, 1)} = ${R.money(c0)} × ${R.num(i1 / i0, 4)} = <b>${R.money(c0 * i1 / i0)}</b>.</p>`,44 };45 },46 },47 {48 id: "agevie", title: "Âge/vie modifiée", ch: "09", url: "/seance/09/#s-9-6",49 gen(R) {50 const cn = R.step(400000, 1800000, 10000);51 const cur = R.step(8000, 60000, 1000);52 const age = R.int(6, 40);53 const vie = R.pick([45, 50, 55, 60, 65, 70]);54 const inc = (cn - cur) * age / vie;55 return {56 enonce: `Coût neuf : <b>${R.money(cn)}</b> ; entretien différé : <b>${R.money(cur)}</b> ; âge effectif : <b>${age} ans</b> ; vie économique : <b>${vie} ans</b>. Quelle est la <b>dépréciation physique totale</b> (curable + incurable, âge/vie modifiée) ?`,57 answer: cur + inc, unit: "$", tol: 0.002,58 steps: `<p>Curable = ${R.money(cur)} (sort en premier).</p><p>Incurable = (${R.money(cn)} − ${R.money(cur)}) × ${age}/${vie} = ${R.money(cn - cur)} × ${R.pct(age / vie * 100, 1)} = ${R.money(inc)}.</p><p>Total = <b>${R.money(cur + inc)}</b> (${R.pct((cur + inc) / cn * 100, 1)} du coût neuf).</p>`,59 };60 },61 },62 {63 id: "ct", title: "Incurable court terme d’une composante", ch: "10", url: "/seance/10/#s-10-3",64 gen(R) {65 const comp = R.pick([["toiture", 20], ["CVAC", 22], ["fenêtration", 30], ["revêtement de plancher", 15], ["ascenseur", 30]]);66 const c = R.step(40000, 320000, 1000);67 const age = R.int(3, comp[1] - 1);68 return {69 enonce: `Composante <b>${comp[0]}</b> : coût neuf <b>${R.money(c)}</b>, âge effectif <b>${age} ans</b>, durée de vie <b>${comp[1]} ans</b>, aucune portion curable. Quelle est sa <b>dépréciation incurable court terme</b> ?`,70 answer: c * age / comp[1], unit: "$", tol: 0.002,71 steps: `<p>D<sub>CT</sub> = C<sub>neuf</sub> × âge/vie = ${R.money(c)} × ${age}/${comp[1]} = ${R.money(c)} × ${R.pct(age / comp[1] * 100, 1)} = <b>${R.money(c * age / comp[1])}</b>.</p>`,72 };73 },74 },75 {76 id: "lt", title: "Base et dépréciation long terme", ch: "10", url: "/seance/10/#s-10-3",77 gen(R) {78 const cn = R.step(900000, 3000000, 10000);79 const cur = R.step(10000, 80000, 1000);80 const ct = [R.step(60000, 200000, 1000), R.step(80000, 260000, 1000), R.step(50000, 150000, 1000)];81 const age = R.int(10, 35), vie = R.pick([45, 50, 55, 60]);82 const base = cn - cur - ct.reduce((a, b) => a + b, 0);83 return {84 enonce: `Coût neuf du bâtiment : <b>${R.money(cn)}</b> ; entretien différé : <b>${R.money(cur)}</b> ; coûts neufs des composantes à courte durée de vie : <b>${ct.map(R.money).join(" ; ")}</b>. Âge effectif global : <b>${age} ans</b>, vie économique : <b>${vie} ans</b>. Quelle est la <b>dépréciation incurable long terme</b> ?`,85 answer: base * age / vie, unit: "$", tol: 0.002,86 steps: `<p>Base<sub>LT</sub> = ${R.money(cn)} − ${R.money(cur)} − ${R.money(ct.reduce((a, b) => a + b, 0))} = ${R.money(base)}.</p><p>D<sub>LT</sub> = ${R.money(base)} × ${age}/${vie} = <b>${R.money(base * age / vie)}</b>.</p><p>Piège évité : le ratio long terme ne s’applique jamais au coût neuf entier.</p>`,87 };88 },89 },90 {91 id: "extraction", title: "Terrain par extraction", ch: "03", url: "/seance/03/#s-3-3",92 gen(R) {93 const prix = R.step(500000, 2500000, 10000);94 const cn = Math.round(prix * R.pick([0.75, 0.8, 0.85, 0.9]) / 1000) * 1000;95 const dep = R.pick([20, 25, 30, 35, 40]);96 const amel = cn * (1 - dep / 100);97 return {98 enonce: `Une propriété bâtie s’est vendue <b>${R.money(prix)}</b>. Le coût neuf des améliorations est estimé à <b>${R.money(cn)}</b> et leur dépréciation totale à <b>${dep} %</b>. Quelle <b>valeur du terrain</b> obtenez-vous par extraction ?`,99 answer: prix - amel, unit: "$", tol: 0.002,100 steps: `<p>Améliorations dépréciées = ${R.money(cn)} × (1 − ${dep} %) = ${R.money(amel)}.</p><p>V<sub>T</sub> = ${R.money(prix)} − ${R.money(amel)} = <b>${R.money(prix - amel)}</b> (ratio terrain ${R.pct((prix - amel) / prix * 100, 1)}).</p>`,101 };102 },103 },104 {105 id: "harper", title: "Règle 4-3-2-1 de Harper", ch: "04", url: "/seance/04/#s-4-2",106 gen(R) {107 const vstd = R.step(90000, 320000, 5000);108 const pstd = R.pick([100, 120, 150, 200]);109 const q = pstd / 4;110 const p = R.pick([1, 2, 3]) * q;111 const parts = [0.4, 0.3, 0.2, 0.1];112 let ratio = 0;113 for (let i = 0; i < 4; i++) ratio += Math.max(0, Math.min(q, p - i * q)) / q * parts[i];114 return {115 enonce: `Dans un secteur où la profondeur standard est de <b>${pstd} pi</b>, un lot standard vaut <b>${R.money(vstd)}</b>. Selon la règle de Harper (4-3-2-1), que vaut un lot de même façade mais de <b>${p} pi</b> de profondeur ?`,116 answer: vstd * ratio, unit: "$", tol: 0.002,117 steps: `<p>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.</p><p>V = ${R.money(vstd)} × ${R.pct(ratio * 100, 0)} = <b>${R.money(vstd * ratio)}</b>.</p>`,118 };119 },120 },121 {122 id: "intercalaires", title: "Intérêts intercalaires", ch: "08", url: "/seance/08/#s-8-3",123 gen(R) {124 const cd = R.step(600000, 4000000, 10000);125 const i = R.pick([5.5, 5.95, 6.45, 6.95, 7.5]);126 const t = R.int(8, 24);127 return {128 enonce: `Coûts directs de <b>${R.money(cd)}</b> financés à <b>${R.num(i, 2)} %</b> pendant un chantier de <b>${t} mois</b>, décaissements progressifs (facteur ½). Quels sont les <b>intérêts intercalaires</b> ?`,129 answer: cd * i / 100 * t / 12 * 0.5, unit: "$", tol: 0.003,130 steps: `<p>I = C<sub>directs</sub> × i × T × ½ = ${R.money(cd)} × ${R.num(i, 2)} % × ${t}/12 × ½ = <b>${R.money(cd * i / 100 * t / 12 * 0.5)}</b> (${R.pct(i / 100 * t / 12 * 0.5 * 100, 2)} des directs).</p>`,131 };132 },133 },134 {135 id: "allocation", title: "Allocation de la dépréciation externe", ch: "12", url: "/seance/12/#s-12-6",136 gen(R) {137 const perte = R.step(6000, 60000, 500);138 const tga = R.pick([6, 6.5, 7, 7.5, 8]);139 const vt = R.step(150000, 600000, 10000);140 const vam = R.step(500000, 2000000, 10000);141 const dtot = perte / (tga / 100);142 const ratio = vam / (vam + vt);143 return {144 enonce: `Une nuisance externe cause une perte de revenu net de <b>${R.money(perte)}</b> par an ; TGA de <b>${R.num(tga, 1)} %</b>. Valeur du terrain avant dépréciation : <b>${R.money(vt)}</b> ; valeur des améliorations : <b>${R.money(vam)}</b>. Quelle <b>dépréciation externe</b> appliquez-vous aux <b>améliorations</b> ?`,145 answer: dtot * ratio, unit: "$", tol: 0.003,146 steps: `<p>D<sub>totale</sub> = ${R.money(perte)} ÷ ${R.num(tga, 1)} % = ${R.money(dtot)}.</p><p>Ratio améliorations = ${R.money(vam)} ÷ ${R.money(vam + vt)} = ${R.pct(ratio * 100, 1)}.</p><p>D<sub>amél.</sub> = ${R.money(dtot)} × ${R.pct(ratio * 100, 1)} = <b>${R.money(dtot * ratio)}</b> ; la portion terrain (${R.money(dtot * (1 - ratio))}) vit dans V<sub>T</sub>.</p>`,147 };148 },149 },150 {151 id: "locatives", title: "Améliorations locatives", ch: "13", url: "/seance/13/#s-13-8",152 gen(R) {153 const c = R.step(60000, 400000, 5000);154 const age = R.int(1, 6);155 const vph = R.pick([12, 15, 20]);156 const bail = R.int(2, 8);157 const vie = Math.min(vph, age + bail);158 return {159 enonce: `Améliorations locatives : coût neuf <b>${R.money(c)}</b>, âge <b>${age} ans</b>, vie physique <b>${vph} ans</b>, bail restant <b>${bail} ans</b> (options incluses). Quelle est leur <b>valeur dépréciée</b> ?`,160 answer: c * (1 - age / vie), unit: "$", tol: 0.003,161 steps: `<p>Vie utile = min(vie physique ${vph}, âge + bail ${age + bail}) = ${vie} ans.</p><p>Dépréciation = ${age}/${vie} = ${R.pct(age / vie * 100, 1)} ; valeur = ${R.money(c)} × (1 − ${R.pct(age / vie * 100, 1)}) = <b>${R.money(c * (1 - age / vie))}</b>.</p>`,162 };163 },164 },165 {166 id: "unites", title: "Coût unitaire et conversion", ch: "05", url: "/seance/05/#s-5-6",167 gen(R) {168 const m2 = R.step(200, 5000, 10);169 const cpi2 = R.step(90, 320, 5);170 return {171 enonce: `Un guide indique <b>${R.money(cpi2)}/pi²</b> pour un bâtiment de <b>${R.num(m2, 0)} m²</b>. Quel est le <b>coût total</b> ? (1 m² = 10,764 pi²)`,172 answer: m2 * 10.764 * cpi2, unit: "$", tol: 0.003,173 steps: `<p>Superficie = ${R.num(m2, 0)} × 10,764 = ${R.num(m2 * 10.764, 0)} pi².</p><p>Coût = ${R.num(m2 * 10.764, 0)} × ${R.money(cpi2)} = <b>${R.money(m2 * 10.764 * cpi2)}</b> (soit ${R.money2(cpi2 * 10.764)}/m²).</p>`,174 };175 },176 },177 {178 id: "superadequation", title: "Superadéquation (nette de la physique)", ch: "11", url: "/seance/11/#s-11-3",179 gen(R) {180 const exces = R.step(40000, 200000, 5000);181 const pct = R.pick([20, 25, 30, 35, 40]);182 const surcout = R.step(0, 6000, 500);183 const tga = R.pick([6, 7, 8]);184 const d = exces * (1 - pct / 100) + surcout / (tga / 100);185 return {186 enonce: `Un élément superadéquat présente un excès de coût neuf de <b>${R.money(exces)}</b>, déjà déprécié physiquement à <b>${pct} %</b>. Il engendre des surcoûts d’exploitation de <b>${R.money(surcout)}</b> par an (TGA <b>${tga} %</b>). Quelle est la <b>dépréciation fonctionnelle incurable</b> ?`,187 answer: d, unit: "$", tol: 0.003,188 steps: `<p>Excès net de la physique déjà comptée = ${R.money(exces)} × (1 − ${pct} %) = ${R.money(exces * (1 - pct / 100))}.</p><p>Surcoûts capitalisés = ${R.money(surcout)} ÷ ${tga} % = ${R.money(surcout / (tga / 100))}.</p><p>D = <b>${R.money(d)}</b>.</p>`,189 };190 },191 },192];193