exercices/2e/2S10-2.js

import Exercice from '../Exercice.js'
import Decimal from 'decimal.js'
import { listeQuestionsToContenu, randint, choice, combinaisonListes, texNombre, texPrix } from '../../modules/outils.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import { context } from '../../modules/context.js'
export const titre = 'Calculer une proportion ou appliquer un pourcentage'
export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true // Pour en bénéficier avec le générateur AMC
export const amcType = 'AMCNum' // Les réponses sont des valeurs numériques à encoder
export const dateDePublication = '9/12/2021'

/**
* Problèmes de proportions
*
* * Situations variées : spectacle, cadeau, réserve
*
* * Déterminer l'effectif de la sous population
* * Calculer une proportion
* * Retrouver l'effectif de la population totale'
* * Mélange des 3 types de problèmes
* @author Florence Tapiero
* * ajout de lignes pour l'export AMC par Jean-Claude Lhote
* 2S10-1
*/
export const uuid = '612a5'
export const ref = '2S10-2'
export default function Proportions () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.interactifReady = interactifReady
  this.interactifType = interactifType
  this.consigne = ''
  this.nbQuestions = 4
  this.nbCols = 1
  this.nbColsCorr = 1
  this.sup = 4 // type de questions
  this.spacing = 1
  this.spacingCorr = 2

  this.nouvelleVersion = function () {
    this.sup = parseInt(this.sup)
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = [] // Cette ligne doit être ajoutée afin de vider les précédentes valeurs pour AMC
    let typesDeQuestionsDisponibles = []
    if (this.sup === 1) {
      typesDeQuestionsDisponibles = ['sous-population']
    }
    if (this.sup === 2) {
      typesDeQuestionsDisponibles = ['proportion']
    }
    if (this.sup === 3) {
      typesDeQuestionsDisponibles = ['population-totale']
    }
    if (this.sup === 4) {
      typesDeQuestionsDisponibles = ['sous-population', 'proportion', 'population-totale']
    }
    const situationsDisponibles = ['spectacle', 'cadeau', 'réserve']
    // const situationsDisponibles = ['cadeau'] pour test de chaque situation
    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions) // Tous les types de questions sont posées mais l'ordre diffère à chaque "cycle"
    const typesDeSituations = combinaisonListes(situationsDisponibles, this.nbQuestions) // Tous les types de questions sont posées mais l'ordre diffère à chaque "cycle"
    let prénom, espèces
    for (let i = 0, texte, texteCorr, sous, sous2, totale, taux, p, reponse, paramAMC, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      switch (typesDeSituations[i]) {
        case 'spectacle':
          // Le nombre de spectateurs doit être entier
          // Multiple de 50 et multiple de 2%
          // Multiple de 20 et multiple de 5%
          // Multiple de 100 et n%
          switch (randint(1, 3)) {
            case 1:
              totale = 50 * randint(2, 60)
              taux = 2 * randint(3, 30)
              break
            case 2:
              totale = 20 * randint(5, 150)
              taux = 5 * randint(1, 16)
              break
            case 3:
              totale = 100 * randint(1, 30)
              taux = randint(10, 80)
              break
          }
          p = new Decimal(taux).div(100)
          sous = p.mul(totale)
          sous2 = sous.mul(-1).plus(totale)
          switch (listeTypeDeQuestions[i]) {
            case 'sous-population':
              switch (randint(1, 2)) {
                case 1:
                  texte = `$${texNombre(totale, 0)}$ personnes assistent à un concert. $${taux}~\\%$ ont moins de $18$ ans. <br>Calculer le nombre de personnes mineures dans le public.`
                  texteCorr = `Pour appliquer une proportion à une valeur, on multiplie celle-ci par la proportion $p$. <br>Comme $${taux}~\\%$ des $${texNombre(totale, 0)}$ personnes sont mineures, le nombre de personnes mineures est donné par :`
                  texteCorr += `<br>$\\dfrac{${taux}}{100} \\times ${texNombre(totale, 0)} = ${texNombre(p, 2)} \\times ${texNombre(totale, 0)}=${texNombre(sous, 2)}$`
                  texteCorr += `<br>Il y a donc $${texNombre(sous)}$ personnes mineures dans le public.`
                  reponse = sous
                  break
                case 2:
                  texte = `$${texNombre(totale, 0)}$ personnes assistent à un concert. $${taux}~\\%$ ont moins de $18$ ans. <br>Calculer le nombre de personnes majeures dans le public.`
                  texteCorr = `<br>On commence par déterminer la proportion de personnes majeures avec ce calcul : <br> $100-${taux}=${100 - taux}$.`
                  texteCorr += 'Pour appliquer une proportion à une valeur, on multiplie celle-ci par la proportion $p$.'
                  texteCorr += `<br>Comme $${100 - taux}~\\%$ des $${texNombre(totale, 0)}$ personnes sont majeures, le nombre de personnes majeures est donné par :`
                  texteCorr += `<br>$\\dfrac{${100 - taux}}{100} \\times ${texNombre(totale, 0)} = ${texNombre(p.mul(-1).add(1))} \\times ${texNombre(totale, 0)} = ${texNombre(sous2, 2)}$`
                  texteCorr += `<br>Il y a donc $${texNombre(sous2, 2)}$ personnes majeures dans le public.`
                  reponse = sous2
                  break
              }
              paramAMC = { digits: 4, decimals: 0, signe: false, approx: 0 } // on mets 4 chiffres même si la plupart des réponses n'en ont que 3 pour ne pas contraindre les réponses
              break
            case 'population-totale':
              texte = `Lors d'un concert, il y a $${texNombre(sous, 2)}$ spectacteurs de plus de $60$ ans, ce qui représente $${taux}~\\%$ du public. <br>Combien de spectateurs ont assisté au concert ?`
              texteCorr = `Soit $x$ le nombre total de spectateur. <br> Comme $${taux}~\\%$ de $x$ est égal à $${texNombre(sous, 2)}$, on a :`
              texteCorr += `<br>$\\begin{aligned}
              \\dfrac{${taux}}{100} \\times x &= ${texNombre(sous, 2)} \\\\\\
              ${texNombre(p, 2)} \\times x &= ${texNombre(sous, 2)} \\\\
              x &= \\dfrac{${texNombre(sous, 2)}}{${texNombre(p, 2)}} \\\\
              x &= ${texNombre(totale, 0)}
              \\end{aligned}$`
              texteCorr += `<br>Il y avait donc $${texNombre(totale, 0)}$ spectateurs.`
              reponse = totale
              paramAMC = { digits: 4, decimals: 0, signe: false, approx: 0 } // Le nombre attendu a bien 4 chiffres maxi
              break
            case 'proportion':
              texte = `Parmi les $${texNombre(totale, 0)}$ spectacteurs d'un concert, $${texNombre(sous, 2)}$ ont moins de $18$ ans. <br>Calculer la proportion des personnes mineures dans le public en pourcentage.`
              texteCorr = `La proportion $p$ est donnée par le quotient : $\\dfrac{${texNombre(sous, 2)}}{${texNombre(totale, 0)}} = ${texNombre(p, 2)}$.`
              texteCorr += `<br>$${texNombre(p, 2)}=\\dfrac{${texNombre(taux, 0)}}{100}$. Il y a donc $${taux}~\\%$ de personnes mineures dans le public.`
              reponse = taux
              paramAMC = { digits: 2, decimals: 0, signe: false, approx: 0 } // Le taux est ici inférieur à 100%
              break
          }
          break
        case 'cadeau' :
          switch (randint(1, 3)) {
            case 1:
              totale = 50 * randint(1, 3, 2)
              taux = 2 * randint(3, 17)
              break
            case 2:
              totale = 20 * randint(2, 8, 5)
              taux = 5 * randint(2, 7)
              break
            case 3:
              totale = 10 * randint(1, 15)
              taux = 10 * randint(1, 3)
              break
          }
          p = new Decimal(taux).div(100)
          sous = p.mul(totale)
          sous2 = sous.mul(-1).plus(totale)
          prénom = choice(['Frédéric', 'Brice', 'Marion', 'Christelle', 'Léo', 'Gabriel', 'Maël', 'Louise', 'Lina', 'Mia', 'Rose', 'Mohamed', 'Mehdi', 'Rayan', 'Karim', 'Yasmine', 'Noûr', 'Kaïs', 'Louna', 'Nora', 'Fatima', 'Nora', 'Nadia', 'Sohan', 'Timothée', 'Jamal'])
          switch (listeTypeDeQuestions[i]) {
            case 'sous-population':
              texte = `Le cadeau commun que nous souhaitons faire à ${prénom} coûte $${texPrix(totale)}$ €. Je participe à hauteur de $${taux}~\\%$ du prix total. <br>Combien ai-je donné pour le cadeau de ${prénom} ?`
              texteCorr = `Pour appliquer une proportion à une valeur, on multiplie celle-ci par la proportion $p$. <br>Comme ma participation représente $${taux}~\\%$ de $${texPrix(totale)}$, j'ai donné :`
              texteCorr += `<br>$\\dfrac{${taux}}{100} \\times ${texNombre(totale, 0)} = ${texNombre(p, 2)} \\times ${texNombre(totale, 0)}=${texNombre(sous, 2)}$`
              texteCorr += `<br>Ma participation au cadeau est de $${texPrix(sous)}$ €.`
              reponse = sous
              paramAMC = { digits: 3, decimals: 0, signe: false, approx: 0 } // la participation n'a que 2 chiffres mais on ne contraint pas la réponse
              break
            case 'population-totale':
              texte = `Pour le cadeau de ${prénom}, j'ai donné $${texPrix(sous)}$ €. Cela représente $${taux}~\\%$ du prix total du cadeau. <br>Quel est le montant du cadeau ?`
              texteCorr = `Soit $x$ le montant du cadeau. <br> Comme $${taux}~\\%$ de $x$ est égal à $${texPrix(sous)}$, on a :`
              texteCorr += `<br>$\\begin{aligned}
              \\dfrac{${taux}}{100} \\times x &= ${sous} \\\\\\
              ${texNombre(p, 2)} \\times x &= ${sous} \\\\
              x &= \\dfrac{${texPrix(sous, 2)}}{${texNombre(p, 2)}} \\\\
              x &= ${texPrix(totale)}
              \\end{aligned}$`
              texteCorr += `<br>Le cadeau coûte $${texPrix(totale)}$ €.`
              reponse = totale
              paramAMC = { digits: 3, decimals: 0, signe: false, approx: 0 }
              break
            case 'proportion':
              texte = `Le cadeau commun que nous souhaitons faire à ${prénom} coûte $${texPrix(totale)}$ €. Je participe à hauteur de $${texPrix(sous)}$ €. <br>Calculer la proportion de ma participation sur le prix total du cadeau.`
              texteCorr = `La proportion $p$ est donnée par le quotient : $\\dfrac{${texPrix(sous)}}{${texPrix(totale)}} = ${texNombre(p, 2)}$.`
              texteCorr += `<br>$${texNombre(p, 2)}=\\dfrac{${texNombre(taux, 0)}}{100}$. J'ai donc donné $${taux}~\\%$ du montant total du cadeau.`
              reponse = taux
              paramAMC = { digits: 2, decimals: 0, signe: false, approx: 0 } // Le taux est ici inférieur à 100%
              break
          }
          break
        case 'réserve' :
          switch (randint(1, 3)) {
            case 1:
              totale = 50 * randint(10, 60)
              taux = 2 * randint(3, 20)
              break
            case 2:
              totale = 20 * randint(25, 150)
              taux = 5 * randint(1, 9)
              break
            case 3:
              totale = 100 * randint(5, 30)
              taux = randint(8, 40)
              break
          }
          p = new Decimal(taux).div(100)
          sous = p.mul(totale)
          sous2 = sous.mul(-1).plus(totale)
          // espèce = choice(['pic noir', 'pipit farlouse', 'bruant des roseaux']) au singulier, inutile à priori
          espèces = choice(['pics noir', 'pipits farlouse', 'bruants des roseaux'])
          switch (listeTypeDeQuestions[i]) {
            case 'sous-population':
              texte = `Une réserve de protection d'oiseaux contient $${texNombre(totale, 0)}$ individus d'oiseaux. On dénombre $${taux}~\\%$ de ${espèces}.<br>Quel est le nombre de ${espèces} ?`
              texteCorr = `Pour appliquer une proportion à une valeur, on multiplie celle-ci par la proportion $p$. <br>Comme les ${espèces} représentent $${taux}~\\%$ de $${texNombre(totale, 0)}$, leur nombre est donné par :`
              texteCorr += `<br>$\\dfrac{${taux}}{100} \\times ${texNombre(totale, 0)} = ${texNombre(p, 2)} \\times ${texNombre(totale, 0)}=${texNombre(sous, 2)}$`
              texteCorr += `<br>Il y a $${texNombre(sous, 2)}$ ${espèces} dans la réserve.`
              reponse = sous
              paramAMC = { digits: 4, decimals: 0, signe: false, approx: 0 } // on mets 4 chiffres même si la plupart des réponses n'en ont que 3 pour ne pas contraindre les réponses

              break
            case 'population-totale':
              texte = `Dans une réserve de protection d'oiseaux, il y a $${texNombre(sous, 2)}$ ${espèces}, ce qui représente $${taux}~\\%$ du nombre total d'oiseaux. <br>Quel est le nombre d'oiseaux de cette réserve ?`
              texteCorr = `Soit $x$ le nombre d'oiseaux. <br> Comme $${taux}~\\%$ de $x$ est égal à $${texNombre(sous, 2)}$, on a :`
              texteCorr += `<br>$\\begin{aligned}
                \\dfrac{${taux}}{100} \\times x &= ${texNombre(sous, 2)} \\\\\\
                ${texNombre(p, 2)} \\times x &= ${texNombre(sous, 2)} \\\\
                x &= \\dfrac{${texNombre(sous, 2)}}{${texNombre(p, 2)}} \\\\
                x &= ${texNombre(totale, 0)}
                \\end{aligned}$`
              texteCorr += `<br>Il y a $${texNombre(totale, 0)}$ oiseaux dans la réserve.`
              reponse = totale
              paramAMC = { digits: 4, decimals: 0, signe: false, approx: 0 } // population à 4 chiffres (souvent)

              break
            case 'proportion':
              texte = `Une réserve de protection d'oiseaux contient $${texNombre(totale, 0)}$ individus d'oiseaux. On dénombre $${texNombre(sous, 2)}$ ${espèces}. <br>Calculer la proportion de ${espèces} dans la réserve.`
              texteCorr = `La proportion $p$ est donnée par le quotient : $\\dfrac{${texNombre(sous, 2)}}{${texNombre(totale, 0)}} = ${texNombre(p, 2)}$.`
              texteCorr += `<br>$${texNombre(p, 2)}=\\dfrac{${texNombre(taux, 0)}}{100}$. Le pourcentage de ${espèces} dans la réserve est donc de $${taux}~\\%$.`
              reponse = taux
              paramAMC = { digits: 2, decimals: 0, signe: false, approx: 0 } // Le taux est ici inférieur à 100%
              break
          }
          break
      }
      setReponse(this, i, reponse, paramAMC)
      if (context.isAmc && listeTypeDeQuestions[i] === 'proportion') {
        this.autoCorrection[i].reponse.textePosition = 'left'
        this.autoCorrection[i].reponse.texte = '\\\\En \\% : '
      }
      texte += ajouteChampTexteMathLive(this, i, 'largeur10 inline')
      // à cause de ajouteChampTexteMathLive qui inclus un Id unique, toutes les questions sont différentes, comparer les textes ne suffit plus
      if (this.questionJamaisPosee(i, taux, totale, sous)) { // on utilise donc cette fonction basée sur les variables aléatoires pour éviter les doublons
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireNumerique = ['Niveau de difficulté', 4, '1 : Déterminer l\'effectif d\'une sous-population \n2 : Calculer une proportion en pourcentage\n3 : Calculer l\'effectif de la population totale \n4 : Mélange']
}