exercices/6e/6C12-1.js

import Exercice from '../Exercice.js'
import { listeQuestionsToContenu, range, texteEnCouleurEtGras, sp, numAlpha, contraindreValeur, choice, arrondi, prenomF, rangeMinMax, texNombre3, troncature, estentier, compteOccurences, enleveDoublonNum, combinaisonListes, enleveElementNo, 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 = 'Résoudre des problèmes de masses'
export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true
export const amcType = 'AMCHybride'

// Gestion de la date de publication initiale
export const dateDePublication = '02/11/2021'

/**
 * Description didactique de l'exercice
 * A partir d'une masse, proposer différentes questions qui permettent de répondre, selon les questions,
 * soit de tête (*10), soit après un calcul posé (multiplication, addition ou soustraction),
 * soit après un calcul avec calculatrice (division)
 * Chacune de ces questions indépendantes trouve de l'intérêt par le choix de l'opération à effectuer
 * et donc à donner du sens à chacune des opérations.
 * @author Eric Elter
 * Référence 6C12-1 - Inspiré de 6C12 - Exercice aisément adaptable pour les CM.
 * Date octobre 2021
*/

export const uuid = '4e2b2'
export const ref = '6C12-1'
export default function QuestionsMasses () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.consigne = 'Répondre aux questions suivantes.' // Consigne modifiée, plus bas, à l'intérieur de la fonction
  this.nbQuestionsModifiable = true
  this.nbQuestions = 1
  this.sup = 9
  this.sup2 = false
  this.sup3 = false
  this.sup4 = 3
  this.nbCols = 2 // Uniquement pour la sortie LaTeX
  this.nbColsCorr = 2 // Uniquement pour la sortie LaTeX
  this.tailleDiaporama = 3 // Pour les exercices chronométrés. 50 par défaut pour les exercices avec du texte
  this.video = '' // Id YouTube ou url
  this.interactifType = 'mathLive'

  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    for (let i = 0, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      let QuestionsDisponibles = []

      if (!this.sup) { // Si aucune liste n'est saisie
        QuestionsDisponibles = rangeMinMax(1, 8)
      } else {
        if (typeof (this.sup) === 'number') { // Si c'est un nombre c'est que le nombre a été saisi dans la barre d'adresses
          QuestionsDisponibles[0] = contraindreValeur(1, 9, this.sup, 9)
        } else {
          QuestionsDisponibles = this.sup.split('-')// Sinon on créé un tableau à partir des valeurs séparées par des -
          for (let i = 0; i < QuestionsDisponibles.length; i++) { // on a un tableau avec des strings : ['1', '1', '2']
            QuestionsDisponibles[i] = contraindreValeur(1, 9, parseInt(QuestionsDisponibles[i]), 9) // parseInt en fait un tableau d'entiers
          }
        }
      }
      if (compteOccurences(QuestionsDisponibles, 9) > 0) QuestionsDisponibles = rangeMinMax(1, 8) // Teste si l'utilisateur a choisi tout
      enleveDoublonNum(QuestionsDisponibles)

      if (this.sup2) QuestionsDisponibles = combinaisonListes(QuestionsDisponibles, QuestionsDisponibles.length)
      const Chiffres = range(9, [0])
      const TabPrixUnitaire = []
      const TabAutrePrix = []
      for (let kk = 0; kk < 3; kk++) {
        TabPrixUnitaire[kk] = choice(Chiffres, TabPrixUnitaire)
        TabAutrePrix[kk] = choice(Chiffres, TabAutrePrix)
      }
      (QuestionsDisponibles.length === 1 & this.nbQuestions === 1) ? this.consigne = 'Répondre à la question suivante.' : this.consigne = 'Répondre aux questions suivantes.'
      let PrixUnitaire
      let AutrePrix
      let PrixReduction
      if (this.sup3) {
        PrixUnitaire = choice(rangeMinMax(2, 9))
        AutrePrix = arrondi(10 * TabAutrePrix[0] + TabAutrePrix[1], 0)
        PrixReduction = arrondi(choice(rangeMinMax(1, arrondi(PrixUnitaire / 2, 0)), 0))
      } else {
        PrixUnitaire = arrondi(TabPrixUnitaire[0] + 0.1 * TabPrixUnitaire[1] + 0.01 * TabPrixUnitaire[2])
        AutrePrix = arrondi(10 * choice([1, 2]) + TabAutrePrix[0] + 0.1 * TabAutrePrix[1] + 0.01 * TabAutrePrix[2])
        PrixReduction = arrondi(choice(rangeMinMax(50, arrondi(50 * PrixUnitaire, 0))) / 100, 2)
      }
      const quidame = prenomF()
      const FamilleH = ['père', 'frère', 'cousin', 'grand-père', 'oncle', 'voisin']
      const Personnage1 = choice(FamilleH)
      const FamilleF = ['mère', 'sœur', 'cousine', 'grand-mère', 'tante', 'voisine']
      const Personnage2 = choice(FamilleF)
      const Objets = [
        'pommes', 'cerises', 'prunes', 'fraises',
        'haricots', 'pommes de terre', 'tomates', 'pêches',
        'nectarines', 'mangues', 'carottes', 'cacahuètes fraiches'
      ]
      const NumArticle = choice(range(11))
      const ArticlePluriel = Objets[NumArticle]
      const NbArticles = choice(rangeMinMax(3, 9))
      const NbArticles2 = choice(rangeMinMax(3, 9), [NbArticles])
      const NbArticles3 = choice(rangeMinMax(11, 19), [NbArticles + NbArticles2, NbArticles2 + NbArticles2]) - NbArticles2
      const NbArticles4 = choice(rangeMinMax(3, 9), [NbArticles, NbArticles2, NbArticles3])
      const NbArticles5 = choice(rangeMinMax(2, 9), [NbArticles, NbArticles2, NbArticles3, NbArticles4, NbArticles + NbArticles4, NbArticles2 + NbArticles4, NbArticles3 + NbArticles4, NbArticles4 + NbArticles4]) + NbArticles4
      const DixOuCent = choice([10, 100])
      const Nbpartage = choice(rangeMinMax(2, 8))
      const propositionsAMC = [] // Ce tableau contiendra tous les propositions d'AMC hybride
      let enonceAMC
      let correctionAMC
      let reponseAMC
      let digitAMC
      let decimalesAMC
      let lignesAMC
      let alignementAMC
      let sanscadreAMC
      const enonceAMCInit = `${quidame} repère des ${ArticlePluriel} dans un magazine de publicité à $${texNombre3(PrixUnitaire)}$${sp()}€ le kilogramme. <br>`
      texte = enonceAMCInit + '<br>'
      texteCorr = ''
      correctionAMC = ''
      for (let kk = 0; kk < QuestionsDisponibles.length; kk++) {
        if (QuestionsDisponibles.length > 1) { // Si une seule question, pas besoin de puces numerotees
          enonceAMC = numAlpha(kk)
          correctionAMC = numAlpha(kk)
        } else {
          enonceAMC = ''
          correctionAMC += ''
        }
        lignesAMC = 3
        digitAMC = this.sup3 ? 2 : 4
        switch (QuestionsDisponibles[kk]) {
          case 1:
            enonceAMC += `Quel serait le prix de $${DixOuCent}$ kilogrammes de ${ArticlePluriel}${sp()}?<br><br>`
            reponseAMC = arrondi(DixOuCent * PrixUnitaire)
            correctionAMC += ` $${DixOuCent} \\times ${texNombre3(PrixUnitaire)} = ${texNombre3(reponseAMC)}$<br>`
            correctionAMC += `Le prix de $${DixOuCent}$ kilogrammes de ${ArticlePluriel} serait de ` + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            lignesAMC = 1
            if (DixOuCent === 100) digitAMC++
            break
          case 2:
            enonceAMC += `Quel serait le prix de $${NbArticles}$ kilogrammes de ${ArticlePluriel}${sp()}?<br><br>`
            reponseAMC = arrondi(NbArticles * PrixUnitaire)
            correctionAMC += ` $${NbArticles} \\times ${texNombre3(PrixUnitaire)} = ${texNombre3(arrondi(NbArticles * PrixUnitaire))}$<br>`
            correctionAMC += `Le prix de $${NbArticles}$ kilogrammes de ${ArticlePluriel} serait de ` + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 3:
            enonceAMC += `Si ${quidame} achetait un kilogramme de ${ArticlePluriel} à $${texNombre3(PrixUnitaire)}$${sp()}€ le kilogramme puis d'autres articles pour $${texNombre3(AutrePrix)}$${sp()}€, quel serait le prix final${sp()}?<br><br>`
            reponseAMC = arrondi(PrixUnitaire + AutrePrix)
            correctionAMC += ` $${texNombre3(PrixUnitaire)} + ${texNombre3(AutrePrix)} = ${texNombre3(reponseAMC)}$<br>`
            correctionAMC += `Si ${quidame} achetait un kilogramme de ${ArticlePluriel} ainsi que d'autres articles pour $${texNombre3(AutrePrix)}$${sp()}€, `
            correctionAMC += 'le prix final serait de ' + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 4:
            enonceAMC += `${quidame} dispose d'un bon de réduction de $${texNombre3(PrixReduction)}$${sp()}€. Si ${quidame} achetait un kilogramme de ${ArticlePluriel}, quelle somme d'argent paierait ${quidame} au final${sp()}?<br><br>`
            reponseAMC = arrondi(PrixUnitaire - PrixReduction)
            correctionAMC += ` $${texNombre3(PrixUnitaire)} - ${texNombre3(PrixReduction)} = ${texNombre3(reponseAMC)}$<br>`
            correctionAMC += `Grâce à son bon de réduction, ${quidame} ne paierait que ` + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 5:
            enonceAMC += `Si ${quidame} achetait $${NbArticles2}$ kilogrammes de ${ArticlePluriel} et son ${Personnage1} en achetait également $${NbArticles3}$ kilogrammes, quelle somme d'argent paierait-ils à eux deux${sp()}?<br><br>`
            reponseAMC = arrondi((NbArticles2 + NbArticles3) * PrixUnitaire)
            correctionAMC += ` $${NbArticles2} + ${NbArticles3} = ${NbArticles2 + NbArticles3}$<br>`
            correctionAMC += `${quidame} et son ${Personnage1} achèteraient $${NbArticles2 + NbArticles3}$ ${ArticlePluriel}.<br>`
            correctionAMC += `$${NbArticles2 + NbArticles3} \\times ${texNombre3(PrixUnitaire)} = ${texNombre3(reponseAMC)}$<br>`
            correctionAMC += `Si ${quidame} et son ${Personnage1} achetaient $${NbArticles2 + NbArticles3}$ kilogrammes de ${ArticlePluriel}, `
            correctionAMC += 'le prix final serait de ' + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 6:
            enonceAMC += `Si ${quidame} achetait $${NbArticles5}$ kilogrammes de ${ArticlePluriel} mais que sa ${Personnage2} lui propose de lui en rembourser $${NbArticles4}$ kilogrammes, quelle somme d'argent ${quidame} dépenserait-elle${sp()}?<br><br>`
            reponseAMC = arrondi((NbArticles5 - NbArticles4) * PrixUnitaire)
            correctionAMC += `$${NbArticles5} - ${NbArticles4} = ${NbArticles5 - NbArticles4}$<br>`
            correctionAMC += `${quidame} ne payerait que $${NbArticles5 - NbArticles4}$ ${ArticlePluriel}.<br>`
            correctionAMC += `$${NbArticles5 - NbArticles4} \\times ${texNombre3(PrixUnitaire)} = ${texNombre3(reponseAMC)}$<br>`
            correctionAMC += `Si ${quidame} achetait $${NbArticles5}$ kilogrammes de ${ArticlePluriel} mais que sa ${Personnage2} lui propose de lui en rembourser $${NbArticles4}$ kilogrammes, `
            correctionAMC += `${quidame} dépenserait ` + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 7 :
            enonceAMC += `Si ${quidame} décidait d'acheter un kilogramme de ${ArticlePluriel} avec $9$ amis, quelle somme équitable minimale devraient-ils, chacun, donner${sp()}?<br><br>`
            correctionAMC += '$1 + 9 = 10$<br>'
            correctionAMC += 'Le partage se ferait entre $10$ personnes.<br>'
            if (this.sup3) {
              reponseAMC = arrondi(PrixUnitaire / 10, 3)
              correctionAMC += `$${texNombre3(PrixUnitaire)} \\div 10 = ${texNombre3(reponseAMC)}$<br>`
              correctionAMC += `Si ${quidame} partageait un kilogramme de ${ArticlePluriel} avec $9$ amis, chacun donnerait équitablement ` + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            } else {
              reponseAMC = troncature(arrondi(PrixUnitaire / 10, 3) + 0.01, 2)
              correctionAMC += `$${texNombre3(PrixUnitaire)} \\div 10 = ${texNombre3(arrondi(PrixUnitaire / 10, 3))}$ et $${texNombre3(troncature(arrondi(PrixUnitaire / 10, 3), 2))} < ${texNombre3(arrondi(PrixUnitaire / 10, 3))} < ${texNombre3(reponseAMC)}$<br>`
              correctionAMC += `Si ${quidame} partageait un kilogramme de ${ArticlePluriel} avec $9$ amis, chacun donnerait équitablement au moins ` + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            } break
          case 8 :
            enonceAMC += `Si ${quidame} décidait d'acheter un kilogramme de  ${ArticlePluriel} avec $${Nbpartage}$ camarades, quelle somme équitable minimale devraient-ils, chacun, donner${sp()}?<br><br>`
            correctionAMC += `$1 + ${Nbpartage} = ${Nbpartage + 1}$<br>`
            correctionAMC += `Le partage se ferait entre $${Nbpartage + 1}$ personnes.<br>`
            if (estentier(arrondi(PrixUnitaire * 100, 0) / (Nbpartage + 1))) {
              reponseAMC = arrondi(PrixUnitaire / (Nbpartage + 1), 3)
              correctionAMC += `$${texNombre3(PrixUnitaire)} \\div ${Nbpartage + 1} = ${texNombre3(reponseAMC)}$<br>`
              correctionAMC += `Si ${quidame} partageait un kilogramme de ${ArticlePluriel} avec $${Nbpartage}$ camarades, chacun donnerait équitablement ` + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            } else {
              reponseAMC = troncature(arrondi(PrixUnitaire / (Nbpartage + 1), 3) + 0.01, 2)
              if (estentier(arrondi(PrixUnitaire * 1000, 0) / (Nbpartage + 1))) {
                correctionAMC += `$${texNombre3(PrixUnitaire)} \\div ${Nbpartage + 1} = ${texNombre3(arrondi(PrixUnitaire / (Nbpartage + 1), 3))}$ et $${texNombre3(troncature(arrondi(PrixUnitaire / (Nbpartage + 1), 3), 2))} < ${texNombre3(arrondi(PrixUnitaire / (Nbpartage + 1), 3))} < ${texNombre3(reponseAMC)}$<br>`
              } else {
                correctionAMC += `$${texNombre3(PrixUnitaire)} \\div ${Nbpartage + 1} \\approx ${texNombre3(arrondi(PrixUnitaire / (Nbpartage + 1), 3))}$ et $${texNombre3(troncature(arrondi(PrixUnitaire / (Nbpartage + 1), 3), 2))} < ${texNombre3(arrondi(PrixUnitaire / (Nbpartage + 1), 3))} < ${texNombre3(reponseAMC)}$<br>`
              }
              correctionAMC += `Si ${quidame} partageait un kilogramme de ${ArticlePluriel} avec $${Nbpartage}$ camarades, chacun donnerait équitablement au moins ` + texteEnCouleurEtGras(`$${texPrix(reponseAMC)}$`) + `${sp()}€.<br><br>`
            }
            break
        } // fin du switch
        if (!context.isAmc) {
          texte += enonceAMC
          texteCorr += correctionAMC
        }
        if (this.interactif && !context.isAmc) {
          texte += ajouteChampTexteMathLive(this, 8 * i + kk, 'inline largeur25') + '<br><br>'
          setReponse(this, 8 * i + kk, reponseAMC)
        }
        if (context.isAmc) {
          if (kk === 0) enonceAMC = enonceAMCInit + enonceAMC
          enonceAMC += this.sup4 === 1 ? 'Code la réponse en noircissant les bonnes cases.' : this.sup4 === 2 ? 'Indique, tout d\'abord, le calcul et effectue-le de tête ou bien posé dans le cadre ci-dessous.' : 'Indique tout d\'abord, ci-dessous, le calcul et effectue-le de tête ou bien posé sur cette feuille. Puis code la réponse en noircissant les bonnes cases.'
          decimalesAMC = this.sup3 ? 0 : 2
          alignementAMC = this.sup4 === 1 ? 'center' : 'flushright'
          sanscadreAMC = !(this.sup4 === 2)
          propositionsAMC[2 * kk] = {
            type: 'AMCOpen',
            propositions:
            [
              {
                texte: correctionAMC,
                statut: lignesAMC,
                enonce: enonceAMC,
                sanscadre: sanscadreAMC
              }
            ]
          }
          propositionsAMC[2 * kk + 1] = {
            type: 'AMCNum',
            propositions:
             [
               {
                 texte: (this.sup4 === 1) ? correctionAMC : '',
                 statut: '',
                 reponse:
                   {
                     texte: (this.sup4 === 1) ? enonceAMC : '',
                     valeur: [reponseAMC],
                     alignement: alignementAMC,
                     param:
                       {
                         digits: digitAMC,
                         decimals: decimalesAMC,
                         signe: false
                       }
                   }
               }
             ]
          }
        }
      }
      if (this.sup4 === 1) {
        for (let kk = arrondi(propositionsAMC.length / 2); kk >= 0; kk--) {
          enleveElementNo(propositionsAMC, 2 * kk)
        }
      } else if (this.sup4 === 2) {
        for (let kk = arrondi(propositionsAMC.length / 2); kk >= 0; kk--) {
          enleveElementNo(propositionsAMC, 2 * kk + 1)
        }
      }
      if (this.questionJamaisPosee(i, PrixUnitaire)) {
        if (context.isAmc) {
          this.autoCorrection[i] = {
            propositions: propositionsAMC,
            enonceAvant: false
          }
        }
        // Si la question n'a jamais été posée, on en crée une autre
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    } // fin du for

    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireTexte = ['Choix des questions', 'Nombres séparés par des tirets\n1 : Multiplication du prix par 10 ou 100\n2 : Multiplication du prix par un entier entre 3 et 9\n3 : Somme du prix avec un autre prix\n4 : Différence du prix avec un autre prix\n5 : Prix de la somme de deux quantités différentes du même article\n6 : Prix de la différence de deux quantités différentes du même article\n7 : Division du prix par 10\n8 : Division du prix par un entier entre 3 et 9\n9 : Toutes les questions\n']
  this.besoinFormulaire2CaseACocher = ['Ordre aléatoire des questions']
  this.besoinFormulaire3CaseACocher = ['Prix unitaire entier']
  if (context.isAmc) {
    this.besoinFormulaire4Numerique = ['Choix AMC', 3, '1 : Des cases à cocher pour noter chaque question\n2 : Un texte libre de réponses pour chaque question\n3 : Les deux en même temps\n']
  }
}