exercices/6e/6N43-3.js

import Exercice from '../Exercice.js'
import { listeQuestionsToContenu, combinaisonListes, sommeDesChiffres, calcul, texNombre, randint, choice } from '../../modules/outils.js'
import { propositionsQcm } from '../../modules/interactif/questionQcm.js'
export const amcReady = true
export const amcType = 'qcmMono' // type de question AMC
export const interactifReady = true
export const interactifType = 'qcm'
export const titre = 'Reconnaître diviseur, multiple, divisible'

/**
 * Vrai ou faux sur les notions de diviseur ou multiple
 * @author Rémi Angot
 * Référence 6N43-3
*/
export const uuid = 'bbdd6'
export const ref = '6N43-3'
export default function ExerciceVraiFauxDivisibleMultipleDiviseur () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.consigne = 'Pour chaque affirmation, indiquer si elle est vraie ou fausse.'
  this.nbQuestions = 5
  this.nbCols = 2 // Uniquement pour la sortie LaTeX
  this.nbColsCorr = 2 // Uniquement pour la sortie LaTeX
  this.sup = 1 // Niveau de difficulté
  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

  function justification (N, a, booleen) {
    let result
    if (booleen === true) {
      if (N === 2) {
        result = ', car son chiffre des unités est $0$, $2$, $4$, $6$ ou $8$.'
      } else if (N === 5) {
        result = ', car son chiffre des unités est $0$, ou $5$.'
      } else if (N === 3 || N === 9) {
        result = `, car la somme de ses chiffres est $${sommeDesChiffres(a)[1]}=${sommeDesChiffres(a)[0]}$ qui est divisible par $${N}$.`
      } else {
        result = `, car $${texNombre(a)} = ${N}\\times ${calcul(a / N)}$.`
      }
    }
    if (booleen === false) {
      if (N === 2) {
        result = ", car son chiffre des unités n'est pas $0$, $2$, $4$, $6$ ou $8$."
      } else if (N === 5) {
        result = ", car son chiffre des unités n'est pas $0$, ou $5$."
      } else if (N === 3 || N === 9) {
        result = `, car la somme de ses chiffres est $${sommeDesChiffres(a)[1]}=${sommeDesChiffres(a)[0]}$ qui n'est pas divisible par $${N}$.`
      } else {
        result = `, car $${texNombre(a)} = ${N}\\times ${Math.floor(a / N)}+ ${a % N}$.`
      }
    }
    return result
  }

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

    let typeDeQuestionsDisponibles = ['Ndiviseur', 'divisibleParN', 'multipleDeN', 'NdiviseurF', 'divisibleParNF', 'multipleDeNF', 'NdiviseurEnvers', 'divisibleParNEnvers', 'multipleDeNEnvers']
    if (this.nbQuestions < 8) {
      typeDeQuestionsDisponibles = [choice(['Ndiviseur', 'divisibleParN']), 'multipleDeN', choice(['NdiviseurF', 'divisibleParNF']), 'multipleDeNF', choice(['NdiviseurEnvers', 'divisibleParNEnvers', 'multipleDeNEnvers'])]
    }
    const listeTypeDeQuestions = combinaisonListes(typeDeQuestionsDisponibles, this.nbQuestions) // Tous les types de questions sont posés mais l'ordre diffère à chaque "cycle"
    let listeDeNDisponibles
    if (this.sup === 1) {
      listeDeNDisponibles = [2, 5]
    }
    if (this.sup === 2) {
      listeDeNDisponibles = [2, 3, 5, 9]
    }
    if (this.sup === 3) {
      listeDeNDisponibles = [7, 11, 13, 20, 30, 25]
    }
    const listeDeN = combinaisonListes(listeDeNDisponibles, this.nbQuestions) // Tous les types de questions sont posés mais l'ordre diffère à chaque "cycle"
    for (let i = 0, texte, texteCorr, N, a, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      // Boucle principale où i+1 correspond au numéro de la question
      N = listeDeN[i]
      a = randint(199, 999) * N
      this.autoCorrection[i] = {}
      this.autoCorrection[i].enonce = `${texte}\n`
      this.autoCorrection[i].propositions = [
        {
          texte: 'Vrai',
          statut: false
        },
        {
          texte: 'Faux',
          statut: false
        },
        {
          texte: 'Je ne sais pas',
          statut: false
        }
      ]
      this.autoCorrection[i].options = { ordered: true } // On ne mélange pas les propositions 'Oui', 'Non' et 'Je ne sais pas'
      switch (listeTypeDeQuestions[i]) { // Suivant le type de question, le contenu sera différent
        case 'Ndiviseur':
          texte = `$${N}$ est un diviseur de $${texNombre(a)}$.`
          texteCorr = texte.replace('.', ' ') + ' : Vrai'
          texteCorr += justification(N, a, true)
          this.autoCorrection[i].propositions[0].statut = true
          break
        case 'divisibleParN':
          texte = `$${texNombre(a)}$ est divisible par $${N}$.`
          texteCorr = texte.replace('.', ' ') + ' : Vrai'
          texteCorr += justification(N, a, true)
          this.autoCorrection[i].propositions[0].statut = true
          break
        case 'multipleDeN':
          texte = `$${texNombre(a)}$ est un multiple de $${N}$.`
          texteCorr = texte.replace('.', ' ') + ' : Vrai'
          texteCorr += justification(N, a, true)
          this.autoCorrection[i].propositions[0].statut = true
          break
        case 'NdiviseurF':
          a += randint(1, N - 1)
          texte = `$${N}$ est un diviseur de $${texNombre(a)}$.`
          texteCorr = texte.replace('.', ' ') + ' : Faux'
          texteCorr += justification(N, a, false)
          this.autoCorrection[i].propositions[1].statut = true
          break
        case 'divisibleParNF':
          a += randint(1, N - 1)
          texte = `$${texNombre(a)}$ est divisible par $${N}$.`
          texteCorr = texte.replace('.', ' ') + ' : Faux'
          texteCorr += justification(N, a, false)
          this.autoCorrection[i].propositions[1].statut = true
          break
        case 'multipleDeNF':
          a += randint(1, N - 1)
          texte = `$${texNombre(a)}$ est un multiple de $${N}$.`
          texteCorr = texte.replace('.', ' ') + ' : Faux'
          texteCorr += justification(N, a, false)
          this.autoCorrection[i].propositions[1].statut = true
          break
        case 'NdiviseurEnvers':
          texte = `$${texNombre(a)}$ est un diviseur de $${N}$.`
          texteCorr = texte.replace('.', ' ') + ' : Faux'
          texteCorr += `, il faudrait plutôt dire $${N}$ est un diviseur de $${texNombre(a)}$`
          texteCorr += justification(N, a, true)
          this.autoCorrection[i].propositions[1].statut = true
          break
        case 'divisibleParNEnvers':
          texte = `$${N}$ est divisible par $${texNombre(a)}$.`
          texteCorr = texte.replace('.', ' ') + ' : Faux'
          texteCorr += `, il faudrait plutôt dire $${texNombre(a)}$ est divisible par $${N}$`
          texteCorr += justification(N, a, true)
          this.autoCorrection[i].propositions[1].statut = true
          break
        case 'multipleDeNEnvers':
          texte = `$${N}$ est un multiple de $${texNombre(a)}$.`
          texteCorr = texte.replace('.', ' ') + ' : Faux'
          texteCorr += `, il faudrait plutôt dire $${a}$ est un multiple de $${N}$`
          texteCorr += justification(N, a, true)
          this.autoCorrection[i].propositions[1].statut = true
          break
      }
      if (this.interactif) {
        texte += '<br>' + propositionsQcm(this, i).texte
      }
      if (this.listeQuestions.indexOf(texte) === -1) {
        this.autoCorrection[i].enonce = `${texte}\n`
        // 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++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireNumerique = ['Niveau de difficulté', 3, '1 : Critères de divisibilité par 2 et 5\n2 : Critères de divisibilité par 2, 3, 5 et 9\n3 : Sans critère de divisibilité']
}

// python3 list-to-js.py pour faire apparaître l'exercice dans le menu