exercices/6e/6C12.js

import Exercice from '../Exercice.js'
import { listeQuestionsToContenu, range, texteEnCouleurEtGras, sp, numAlpha, contraindreValeur, choice, arrondi, prenomF, rangeMinMax, texNombre3, troncature, estentier, compteOccurences, enleveDoublonNum, combinaisonListes, enleveElementNo } 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 prix'
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'un prix, 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 (ES6 : Loïc Geeraerts)
 * Référence 6C12 - Exercice aisément adaptable pour les CM.
 * Date octobre 2021
*/

export const uuid = '28d56'
export const ref = '6C12'
export default class QuestionsPrix extends Exercice {
  constructor () {
    super()
    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.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']
    }
  }

  nouvelleVersion () {
    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 = arrondi(10 * choice([1, 2]) + TabPrixUnitaire[0], 0)
        AutrePrix = arrondi(10 * TabAutrePrix[0] + TabAutrePrix[1], 0)
        PrixReduction = arrondi(choice(rangeMinMax(5, arrondi(PrixUnitaire / 2, 0)), 0))
      } else {
        PrixUnitaire = arrondi(10 * choice([1, 2]) + 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(101, 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 = [
        'un', 'jeu vidéo', 'jeux vidéo', 'ce',
        'un', 'pantalon', 'pantalons', 'ce',
        'une', 'casquette', 'casquettes', 'cette',
        'une', 'carte de collection', 'cartes de collection', 'cette',
        'un', 'jouet', 'jouets', 'ce',
        'un', 'livre', 'livres', 'ce',
        'une', 'serviette', 'serviettes', 'cette'
      ]
      const NumArticle = choice(range(6))
      const ArticleIndef = Objets[4 * NumArticle]
      const ArticleSingulier = Objets[4 * NumArticle + 1]
      const ArticlePluriel = Objets[4 * NumArticle + 2]
      const ArticleDemonst = Objets[4 * NumArticle + 3]
      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()}€ l'unité.<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 ? 3 : 5
        switch (QuestionsDisponibles[kk]) {
          case 1:
            enonceAMC += `Quel serait le prix de $${DixOuCent}$ ${ArticlePluriel}${sp()}?<br><br>`
            reponseAMC = arrondi(DixOuCent * PrixUnitaire)
            correctionAMC += ` $${DixOuCent} \\times ${texNombre3(PrixUnitaire)} = ${texNombre3(reponseAMC)}$<br>`
            correctionAMC += `Le prix de $${DixOuCent}$ ${ArticlePluriel} serait de ` + texteEnCouleurEtGras(`$${texNombre3(reponseAMC)}$`) + `${sp()}€.<br><br>`
            lignesAMC = 1
            if (DixOuCent === 100) digitAMC++
            break
          case 2:
            enonceAMC += `Quel serait le prix de $${NbArticles}$ ${ArticlePluriel}${sp()}?<br><br>`
            reponseAMC = arrondi(NbArticles * PrixUnitaire)
            correctionAMC += ` $${NbArticles} \\times ${texNombre3(PrixUnitaire)} = ${texNombre3(arrondi(NbArticles * PrixUnitaire))}$<br>`
            correctionAMC += `Le prix de $${NbArticles}$ ${ArticlePluriel} serait de ` + texteEnCouleurEtGras(`$${texNombre3(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 3:
            enonceAMC += `Si ${quidame} achetait ${ArticleIndef} ${ArticleSingulier} à $${texNombre3(PrixUnitaire)}$${sp()}€ l'unité 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 ${ArticleIndef} ${ArticleSingulier} ainsi que d'autres articles pour $${texNombre3(AutrePrix)}$${sp()}€, `
            correctionAMC += 'le prix final serait de ' + texteEnCouleurEtGras(`$${texNombre3(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 4:
            enonceAMC += `${quidame} dispose d'un bon de réduction de $${texNombre3(PrixReduction)}$${sp()}€. Si ${quidame} achetait ${ArticleIndef} ${ArticleSingulier}, 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(`$${texNombre3(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 5:
            enonceAMC += `Si ${quidame} achetait $${NbArticles2}$ ${ArticlePluriel} et son ${Personnage1} en achetait également $${NbArticles3}$, quelle somme d'argent paieraient-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}$ ${ArticlePluriel}, `
            correctionAMC += 'le prix final serait de ' + texteEnCouleurEtGras(`$${texNombre3(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 6:
            enonceAMC += `Si ${quidame} achetait $${NbArticles5}$ ${ArticlePluriel} mais que sa ${Personnage2} lui propose de lui en rembourser $${NbArticles4}$, 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}$ ${ArticlePluriel} mais que sa ${Personnage2} lui propose de lui en rembourser $${NbArticles4}$, `
            correctionAMC += `${quidame} dépenserait ` + texteEnCouleurEtGras(`$${texNombre3(reponseAMC)}$`) + `${sp()}€.<br><br>`
            break
          case 7 :
            enonceAMC += `Si ${quidame} décidait d'acheter ${ArticleDemonst} ${ArticleSingulier} 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 ${ArticleDemonst} ${ArticleSingulier} avec $9$ amis, chacun donnerait équitablement ` + texteEnCouleurEtGras(`$${texNombre3(reponseAMC)}$`) + `${sp()}€.<br><br>`
            } else {
              reponseAMC = troncature(arrondi(PrixUnitaire / 10, 3) + 0.01, 2)
              correctionAMC += `$${texNombre3(PrixUnitaire)} \\div 10 \\approx ${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 ${ArticleDemonst} ${ArticleSingulier} avec $9$ amis, chacun donnerait équitablement au moins ` + texteEnCouleurEtGras(`$${texNombre3(reponseAMC)}$`) + `${sp()}€.<br><br>`
            } break
          case 8 :
            enonceAMC += `Si ${quidame} décidait d'acheter ${ArticleDemonst} ${ArticleSingulier} 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 ${ArticleDemonst} ${ArticleSingulier} avec $${Nbpartage}$ camarades, chacun donnerait équitablement ` + texteEnCouleurEtGras(`$${texNombre3(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 ${ArticleDemonst} ${ArticleSingulier} avec $${Nbpartage}$ camarades, chacun donnerait équitablement au moins ` + texteEnCouleurEtGras(`$${texNombre3(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: '',
               alignement: alignementAMC,
               reponse:
                 {
                   texte: (this.sup4 === 1) ? enonceAMC : '',
                   valeur: [reponseAMC],
                   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)
  }
}