SPB Git forge

spb/uqo-imm1003

Public
7commits 1branches 0releases
189.5 MBsize
maindefault branch
6 h agolast push
JavaScript 68% CSS 32%
12.6 KB · 193 lines javascript
Raw Blame History
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