exercices/6e/6P11-1.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, prenom, texPrix, numAlpha, nombreDeChiffresDe, nombreDeChiffresDansLaPartieDecimale, arrondi, checkSum, shuffle, choice, texteEnCouleurEtGras, miseEnEvidence, combinaisonListes, rangeMinMax, sp } from '../../modules/outils.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
export let titre = 'Résoudre un problème relevant de la proportionnalité avec les propriétés de linéarité'
export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true
export const amcType = 'AMCHybride'
export const dateDeModifImportante = '23/02/2022'

/**
 * Résoudre un problème relevant de la proportionnalité avec les propriétés de linéarité
 * * 6P11-1
 * @author Sébastien Lozano (et Eric Elter pour divers enrichissements)
 */

export const uuid = 'c511f'
export const ref = '6P11-1'
export default function ProportionnaliteParLineariteBis () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.beta = false
  if (this.beta) {
    this.nbQuestions = 3
  } else {
    this.nbQuestions = 1
  };

  this.consigne = ''
  context.isHtml ? this.spacing = 2 : this.spacing = 1

  this.nbCols = 1
  this.nbColsCorr = 1
  if (context.isAmc) {
    titre = 'Résoudre un problème relevant de la proportionnalité'
  }

  this.nouvelleVersion = function () {
    const tabHash = []
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    const sousChoix = combinaisonListes(rangeMinMax(0, 4), this.nbQuestions)
    const prenomliste = prenom(6)
    const situations = [
      { lieu: 'À la boulangerie', achat_sing: 'pain au chocolat', achat_plur: 'pains au chocolat', pu: choice([0.7, 0.75, 0.8, 0.85]) },
      { lieu: 'À la boulangerie', achat_sing: 'croissant', achat_plur: 'croissants', pu: choice([1.05, 1.15, 0.95, 1.25]) },
      { lieu: 'À la boulangerie', achat_sing: 'baguette', achat_plur: 'baguettes', pu: choice([0.9, 1.3, 1.1, 1.2]) },
      { lieu: 'Au supermarché', achat_sing: 'bouteille de jus de fruits', achat_plur: 'bouteilles de jus de fruits', pu: choice([1.8, 1.9, 2.1, 2.3]) },
      { lieu: 'À la charcuterie', achat_sing: 'tranche de jambon', achat_plur: 'tranches de jambon', pu: choice([1.6, 1.7, 2.2, 2.4]) }
    ]

    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      // une fonction pour gérer le pluriel
      function pluriel (n, obj) {
        if (n > 1) {
          return obj.achat_plur
        } else {
          return obj.achat_sing
        };
      };

      // un compteur pour les sous-questions
      let k = 0
      let kCorr = 0
      // on crée un tableau d'objets pour les situations possibles
      let n1, n2, n3, n4, n5, nMax, choixN, choixMult
      do {
        n2 = randint(2, 8)
        n1 = randint(n2 + 1, 9, [n2, 2 * n2, 3 * n2, 4 * n2]) // n1 est plus grand que n2 et non mulitple de n2
        n3 = n1 + n2
        n4 = n1 - n2
        do {
          choixN = choice([n1, n2])
          choixMult = randint(2, 5)
          n5 = choixMult * choixN // n5 est un multiple de n1 ou n2, différent de n3 et n4.
        } while (n5 === n4 || n5 === n3)
        nMax = randint(10, 19, [n3, n5])
      } while (n4 === 1)
      const situation = situations[sousChoix[i]]
      const consigneQuestions = shuffle([n3, n4, n5])
      texte = `${situation.lieu}, ${prenomliste[0]} achète $${n1}$ ${pluriel(n1, situation)} et paie $${texPrix(n1 * situation.pu)}$${sp()}€.
      <br>${prenomliste[1]} achète $${n2}$ ${pluriel(n2, situation)} et paie $${texPrix(n2 * situation.pu)}$${sp()}€.`
      const enonceQ1 = `<br>${numAlpha(k++)} Combien paiera ${prenomliste[2]} pour $${consigneQuestions[k - 1]}$ ${pluriel(consigneQuestions[k - 1], situation)} ? ${ajouteChampTexteMathLive(this, 4 * i, 'largeur25 inline')}`
      let enonceAMC = texte + '<br>' + enonceQ1
      texte += enonceQ1
      const propositionsAMC = [
        {
          type: 'AMCNum',
          propositions: [{
            texte: texteCorr,
            statut: '',
            reponse: {
              texte: enonceAMC,
              valeur: arrondi(consigneQuestions[0] * situation.pu, 2),
              param: {
                digits: nombreDeChiffresDe(arrondi(consigneQuestions[0] * situation.pu, 2)),
                decimals: nombreDeChiffresDansLaPartieDecimale(arrondi(consigneQuestions[0] * situation.pu, 2)),
                signe: false,
                approx: 0
              }
            }
          }]
        }
      ]
      enonceAMC = `${numAlpha(k++)} Combien paiera ${prenomliste[3]} pour $${consigneQuestions[k - 1]}$ ${pluriel(consigneQuestions[k - 1], situation)} ? ${ajouteChampTexteMathLive(this, 4 * i + 1, 'largeur25 inline')}`
      texte += '<br>' + enonceAMC
      propositionsAMC.push(
        {
          type: 'AMCNum',
          propositions: [{
            texte: '',
            statut: '',
            reponse: {
              texte: enonceAMC,
              valeur: arrondi(consigneQuestions[1] * situation.pu, 2),
              param: {
                digits: nombreDeChiffresDe(arrondi(consigneQuestions[1] * situation.pu, 2)),
                decimals: nombreDeChiffresDansLaPartieDecimale(arrondi(consigneQuestions[1] * situation.pu, 2)),
                signe: false,
                approx: 0
              }
            }
          }]
        }
      )
      enonceAMC = `${numAlpha(k++)} Combien paiera ${prenomliste[4]} pour $${consigneQuestions[k - 1]}$ ${pluriel(consigneQuestions[k - 1], situation)} ? ${ajouteChampTexteMathLive(this, 4 * i + 2, 'largeur25 inline')}`
      texte += '<br>' + enonceAMC
      propositionsAMC.push(
        {
          type: 'AMCNum',
          propositions: [{
            texte: '',
            statut: '',
            reponse: {
              texte: enonceAMC,
              valeur: arrondi(consigneQuestions[2] * situation.pu, 2),
              param: {
                digits: nombreDeChiffresDe(arrondi(consigneQuestions[2] * situation.pu, 2)),
                decimals: nombreDeChiffresDansLaPartieDecimale(arrondi(consigneQuestions[2] * situation.pu, 2)),
                signe: false,
                approx: 0
              }
            }
          }]
        }
      )
      enonceAMC = `${numAlpha(k++)} Quel est le nombre maximum de ${situation.achat_plur} que ${prenomliste[5]} peut acheter avec $${texPrix(nMax * situation.pu)}$${sp()}€ ? ${ajouteChampTexteMathLive(this, 4 * i + 3, 'largeur25 inline')}`
      texte += '<br>' + enonceAMC
      propositionsAMC.push(
        {
          type: 'AMCNum',
          propositions: [{
            texte: '',
            statut: '',
            reponse: {
              texte: enonceAMC,
              valeur: nMax,
              param: {
                digits: 2,
                decimals: 0,
                signe: false,
                approx: 0
              }
            }
          }]
        }
      )
      texteCorr = `
        C'est une situation de proportionnalité. Nous pouvons donc utiliser les propriétés de linéarité de la proportionnalité.
        <br>C'est ce que nous allons faire pour les trois premières questions.
        <br>`
      const texteCorrInit = `
        Pour $${n1}$ ${pluriel(n1, situation)}, on paie $${texPrix(n1 * situation.pu)}$${sp()}€.
        <br> Pour $${n2}$ ${pluriel(n2, situation)}, on paie $${texPrix(n2 * situation.pu)}$${sp()}€.`
      const texteCorrn3 = `
        <br> Donc pour $${n1}+${n2}$ ${pluriel(n3, situation)}, on paie $${texPrix(n1 * situation.pu)}$${sp()}€ + $${texPrix(n2 * situation.pu)}$${sp()}€.
        <br> ${texteEnCouleurEtGras(`${prenomliste[2]} paiera donc $${miseEnEvidence(texPrix(n3 * situation.pu))}$${sp()}€ pour $${miseEnEvidence(n3)}$ ${pluriel(n3, situation)}.`)}
        <br>`
      const texteCorrn4 = `
        <br> Donc pour $${n1}-${n2}$ ${pluriel(n4, situation)}, on paie $${texPrix(n1 * situation.pu)}$${sp()}€ - $${texPrix(n2 * situation.pu)}$${sp()}€.
        <br> ${texteEnCouleurEtGras(`${prenomliste[3]} paiera donc $${miseEnEvidence(texPrix(n4 * situation.pu))}$${sp()}€ pour $${miseEnEvidence(n4)}$ ${pluriel(n4, situation)}.`)}
        <br>`
      const texteCorrn5 = `
        <br> Donc pour $${choixMult}\\times${choixN}$ ${pluriel(n5, situation)}, on paie $${choixMult}\\times${texPrix(choixN * situation.pu)}$${sp()}€.
        <br> ${texteEnCouleurEtGras(`${prenomliste[4]} paiera donc $${miseEnEvidence(texPrix(n5 * situation.pu))}$${sp()}€ pour $${miseEnEvidence(n5)}$ ${pluriel(n5, situation)}.`)}
        <br>`
      for (let kk = 0; kk < 3; kk++) {
        texteCorr += `<br>${numAlpha(kCorr++)} ` + texteCorrInit
        switch (consigneQuestions[kk]) {
          case n3 :
            texteCorr += texteCorrn3
            break
          case n4 :
            texteCorr += texteCorrn4
            break
          case n5 :
            texteCorr += texteCorrn5
            break
        }
      }
      texteCorr += `
        ${numAlpha(kCorr++)} On peut utiliser l'une ou l'autre des informations de l'énoncé pour répondre en revenant à l'unité.
        <br> Par exemple, pour $${n1}$ ${pluriel(n1, situation)}, on paie $${texPrix(n1 * situation.pu)}$${sp()}€.
        <br> Donc $1$ ${situation.achat_sing} coûte $${texPrix(n1 * situation.pu)}$${sp()}€ $\\div ${n1} = ${texPrix(situation.pu)}$${sp()}€.
        <br> Pour $${texPrix(nMax * situation.pu)}$${sp()}€, nous aurons donc $${texPrix(nMax * situation.pu)}$ ${sp()}€ $\\div ${texPrix(situation.pu)}$${sp()}€ $= ${nMax}$.
        <br> ${texteEnCouleurEtGras(`Avec $${miseEnEvidence(texPrix(nMax * situation.pu))}$${sp()}€, ${prenomliste[5]} peut donc acheter $${miseEnEvidence(nMax)}$ ${pluriel(nMax, situation)}.`)}
        `

      if (tabHash.indexOf(checkSum(prenomliste[3], n3, n2, nMax)) === -1) { // Si la question n'a jamais été posée, on en crée une autre
        tabHash.push(checkSum(prenomliste[3], n3, n2, nMax))
        if (!context.isAmc) {
          setReponse(this, 4 * i, arrondi(consigneQuestions[0] * situation.pu, 2))
          setReponse(this, 4 * i + 1, arrondi(consigneQuestions[1] * situation.pu, 2))
          setReponse(this, 4 * i + 2, arrondi(consigneQuestions[2] * situation.pu, 2))
          setReponse(this, 4 * i + 3, nMax)
        } else {
          this.autoCorrection[i] = {
            enonce: '',
            enonceAvant: false,
            options: { barreseparation: true, multicolsAll: true }, // facultatif. Par défaut, multicols est à false. Ce paramètre provoque un multicolonnage (sur 2 colonnes par défaut) : pratique quand on met plusieurs AMCNum. !!! Attention, cela ne fonctionne pas, nativement, pour AMCOpen. !!!
            propositions: propositionsAMC
          }
        }
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
}