exercices/6e/6N31-5.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, combinaisonListes, calcul, texNombre, miseEnEvidence, nombreDeChiffresDe, sp } from '../../modules/outils.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import { setReponse } from '../../modules/gestionInteractif.js'

export const dateDePublication = '28/09/22'
export const titre = 'Encadrer un décimal'
export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true
export const amcType = 'AMCHybride'
/**
 * * Encadrer_un_decimal_selon_une_precision_donnée
 * * 6N31-5
 * @author Mickael Guironnet (rendu AMC par Eric Elter)
 */
export const ref = '6N31-5'
export const uuid = 'a8c21'
export default function EncadrerUnDecimal () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.sup = '1-2-3' // Type de question
  this.nbQuestions = 4
  this.consigneCorrection = 'Encadrer'
  this.nbCols = 1
  this.nbColsCorr = 1
  context.isHtml ? this.spacing = 1.5 : this.spacing = 1.5
  context.isHtml ? this.spacingCorr = 1.2 : this.spacingCorr = 1.5

  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []

    let listeTypeDeQuestions = []
    if (!this.sup) { // Si aucune liste n'est saisie ou mélange demandé
      listeTypeDeQuestions = combinaisonListes([1, 2, 3], this.nbQuestions)
    } else {
      const quests = this.sup.split('-')// Sinon on créé un tableau à partir des valeurs séparées par des -
      for (let i = 0; i < quests.length; i++) { // on a un tableau avec des strings : ['1', '1', '2']
        const choixtp = parseInt(quests[i])
        if (choixtp >= 1 && choixtp <= 3) {
          listeTypeDeQuestions.push(choixtp)
        }
      }
      if (listeTypeDeQuestions.length === 0) { listeTypeDeQuestions = [1, 2, 3] }
      listeTypeDeQuestions = combinaisonListes(listeTypeDeQuestions, this.nbQuestions)
    }

    for (let i = 0, indexQ = 0, texte, typesDeQuestions, texteCorr, reponseMin, reponseMax, cpt = 0; i < this.nbQuestions && cpt < 50; cpt++) {
      typesDeQuestions = listeTypeDeQuestions[i]
      const m = randint(1, 9)
      const c = randint(1, 9)
      const d = randint(1, 9)
      const u = (typesDeQuestions === 1 ? randint(7, 9) : randint(1, 9))
      const di = (typesDeQuestions === 2 ? randint(7, 9) : randint(1, 9))
      const ci = (typesDeQuestions === 3 ? randint(7, 9) : randint(1, 9))
      const mi = randint(1, 9)

      if (!this.questionJamaisPosee(i, m, c, u, di, ci, mi)) {
        continue
      }

      switch (typesDeQuestions) {
        case 3: { // encadrement au centième
          reponseMin = m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + ci * 0.01)
          if (!context.isAmc) setReponse(this, indexQ, reponseMin)
          texte = `Encadrer $${texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + ci * 0.01 + mi * 0.001))}$ au centième.<br>`
          if (this.interactif) {
            texte += ajouteChampTexteMathLive(this, indexQ, 'largeur25 inline nospacebefore') + '$'
          } else if (context.isAmc) {
            texte += 'Ainsi  :' + sp(15) + 'a '
          } else {
            texte += '$ \\ldots\\ldots\\ldots '
          }
          indexQ++
          texte += ` < ${texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + ci * 0.01 + mi * 0.001))} < `
          reponseMax = m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + (ci + 1) * 0.01)
          if (!context.isAmc) setReponse(this, indexQ, reponseMax)
          if (this.interactif) {
            texte += '$' + ajouteChampTexteMathLive(this, indexQ, 'largeur25 inline nospacebefore')
          } else if (context.isAmc) {
            texte += ' b'
          } else {
            texte += ' \\ldots\\ldots\\ldots $'
          }
          indexQ++
          const nombreStr = texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + 0 * 0.01 + mi * 0.001)).replace('0', miseEnEvidence(ci))
          texteCorr = `au centième: $ ${miseEnEvidence(texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + ci * 0.01)))} < ${nombreStr} <  ${miseEnEvidence(texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + (ci + 1) * 0.01)))}$`
          break
        }
        case 2: { // encadrement au dixième
          reponseMin = m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1)
          if (!context.isAmc) setReponse(this, indexQ, reponseMin)
          texte = `Encadrer $${texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + ci * 0.01 + mi * 0.001))}$ au dixième.<br>`
          if (this.interactif) {
            texte += ajouteChampTexteMathLive(this, indexQ, 'largeur25 inline nospacebefore') + '$'
          } else if (context.isAmc) {
            texte += 'Ainsi  :' + sp(15) + 'a '
          } else {
            texte += '$ \\ldots\\ldots\\ldots '
          }
          indexQ++
          texte += ` < ${texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + ci * 0.01 + mi * 0.001))} < `
          reponseMax = m * 1000 + c * 100 + d * 10 + u * 1 + calcul((di + 1) * 0.1)
          if (!context.isAmc) setReponse(this, indexQ, reponseMax)
          if (this.interactif) {
            texte += '$' + ajouteChampTexteMathLive(this, indexQ, 'largeur25 inline nospacebefore')
          } else if (context.isAmc) {
            texte += ' b'
          } else {
            texte += '\\ldots\\ldots\\ldots $ '
          }
          indexQ++
          const nombreStr = texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(0 * 0.1 + ci * 0.01 + mi * 0.001)).replace('0', miseEnEvidence(di))
          texteCorr = `au dixième: $ ${miseEnEvidence(texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1)))} < ${nombreStr} <  ${miseEnEvidence(texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul((di + 1) * 0.1)))}$`
          break
        }
        case 1: { // encadrement à l'unité
          reponseMin = m * 1000 + c * 100 + d * 10 + u * 1
          if (!context.isAmc) setReponse(this, indexQ, reponseMin)
          texte = `Encadrer $${texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + ci * 0.01 + mi * 0.001))}$ à l'unité.<br>`
          if (this.interactif) {
            texte += ajouteChampTexteMathLive(this, indexQ, 'largeur25 inline nospacebefore') + '$'
          } else if (context.isAmc) {
            texte += 'Ainsi  :' + sp(15) + 'a '
          } else {
            texte += '$ \\ldots\\ldots\\ldots '
          }
          indexQ++
          texte += ` < ${texNombre(m * 1000 + c * 100 + d * 10 + u * 1 + calcul(di * 0.1 + ci * 0.01 + mi * 0.001))} < `
          reponseMax = m * 1000 + c * 100 + d * 10 + (u + 1) * 1
          if (!context.isAmc) setReponse(this, indexQ, reponseMax)
          if (this.interactif) {
            texte += '$' + ajouteChampTexteMathLive(this, indexQ, 'largeur25 inline nospacebefore')
          } else if (context.isAmc) {
            texte += ' b'
          } else {
            texte += '\\ldots\\ldots\\ldots $ '
          }
          indexQ++
          const nombreStr = texNombre(m * 1000 + c * 100 + d * 10 + u * 0 + calcul(di * 0.1 + ci * 0.01 + mi * 0.001)).replace('0', miseEnEvidence(u))
          texteCorr = `à l'unité: $ ${miseEnEvidence(texNombre(m * 1000 + c * 100 + d * 10 + u * 1))} < ${nombreStr} <  ${miseEnEvidence(texNombre(m * 1000 + c * 100 + d * 10 + (u + 1) * 1))}$`
          break
        }
      }
      if (context.isAmc) {
        this.autoCorrection[i] = {
          enonceAvant: false,
          options: { multicols: true },
          propositions: [
            {
              type: 'AMCNum',
              propositions: [
                {
                  texte: texteCorr,
                  reponse: {
                    texte: texte + '<br>Valeur de a :',
                    valeur: reponseMin,
                    param: {
                      signe: false,
                      digits: nombreDeChiffresDe(reponseMin) + 2,
                      decimals: 3
                    }
                  }
                }
              ]
            },
            {
              type: 'AMCNum',
              propositions: [
                {
                  texte: '',
                  reponse: {
                    texte: 'Valeur de b :',
                    valeur: reponseMax,
                    param: {
                      signe: false,
                      digits: nombreDeChiffresDe(reponseMax) + 2,
                      decimals: 3
                    }
                  }
                }
              ]
            }
          ]
        }
      }
      this.listeQuestions.push(texte)
      this.listeCorrections.push(texteCorr)
      i++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireTexte = [
    'Type de question', [
      'Choix séparés par des tirets',
      '0 : Mélange',
      '1 : Encadrer à l\'unité',
      '2 : Encadrer au dixième',
      '3 : Encadrer au centième'
    ].join('\n')
  ]
}