exercices/5e/5A10.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, combinaisonListesSansChangerOrdre, listeDiviseurs, texteOuPas, contraindreValeur, texNombre } from '../../modules/outils.js'

import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
export const dateDeModifImportante = '28/10/2021'
export const titre = 'Écrire la liste de tous les diviseurs d\'un entier'

export const interactifReady = true
export const interactifType = 'mathLive'

/**
 * 5A10 - Division Euclidienne; diviseurs, multiples, critères de divisibilité
 * Exercice bilan
 * @author Sébastien Lozano & Jean Claude Lhote
 */
export const uuid = '4828d'
export const ref = '5A10'
export default function ListeDesDiviseurs5e () {
  'use strict'
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.consigne = ''
  // this.consigne += `<br>`;
  context.isHtml ? this.spacing = 2 : this.spacing = 1
  context.isHtml ? this.spacingCorr = 2 : this.spacingCorr = 1
  this.nbQuestions = 3
  this.nbCols = 1
  this.nbColsCorr = 1
  this.sup = '2-2-2'
  this.sup2 = '6-6-6'
  this.sup3 = 10

  this.nouvelleVersion = function () {
    let typesDeQuestions
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.contenu = '' // Liste de questions
    this.contenuCorrection = '' // Liste de questions corrigées
    this.autoCorrection = []
    let nombresDeChiffresMax
    let nombresDeDiviseursMax

    this.sup3 = contraindreValeur(2, 16, parseInt(this.sup3), 10)
    if (typeof this.sup === 'number') {
      nombresDeChiffresMax = [contraindreValeur(1, 5, parseInt(this.sup), 2)]
    } else {
      nombresDeChiffresMax = this.sup.split('-')
      for (let i = 0; i < nombresDeChiffresMax.length; i++) {
        nombresDeChiffresMax[i] = contraindreValeur(1, 5, parseInt(nombresDeChiffresMax[i]), 2)
      }
    }
    if (typeof this.sup2 === 'number') {
      nombresDeDiviseursMax = [contraindreValeur(2, parseInt(this.sup3), parseInt(this.sup2), 6)]
    } else {
      nombresDeDiviseursMax = this.sup2.split('-')
      for (let i = 0; i < nombresDeDiviseursMax.length; i++) {
        nombresDeDiviseursMax[i] = contraindreValeur(2, parseInt(this.sup3), parseInt(nombresDeDiviseursMax[i]), 6)
      }
    }
    const typesDeQuestionsDisponibles = [1, 1, 2]
    const nbChiffresMax = combinaisonListesSansChangerOrdre(nombresDeChiffresMax, this.nbQuestions)
    const nbDiviseursMax = combinaisonListesSansChangerOrdre(nombresDeDiviseursMax, this.nbQuestions)

    const listeTypeDeQuestions = combinaisonListesSansChangerOrdre(typesDeQuestionsDisponibles, this.nbQuestions)

    for (let i = 0, listeDiviseursM = [], nbDiviseursM, M, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      typesDeQuestions = listeTypeDeQuestions[i]
      if (nbDiviseursMax[i] > 10) {
        nbChiffresMax[i] = Math.min(nbChiffresMax[i], 3)
      }
      do {
        M = randint(10 ** (nbChiffresMax[i] - 1), 10 ** nbChiffresMax[i] - 1)
        listeDiviseursM = listeDiviseurs(M)
        nbDiviseursM = listeDiviseursM.length
      } while (nbDiviseursM < Math.max(2, nbDiviseursMax[i] - 3) || nbDiviseursM > nbDiviseursMax[i])

      switch (typesDeQuestions) {
        case 1:
          texte = ''
          if (this.interactif) {
            texte += `À l'aide du tableau, écrire la liste de tous les diviseurs de $${texNombre(M)}$ <b>dans l'ordre croissant séparés par une virgule.</b>`
          } else {
            texte += `Compléter le tableau suivant et faire la liste de tous les diviseurs de ${texNombre(M)}.`
          }
          if (!context.isHtml) {
            texte += '$\\medskip$'
          };
          texte += '<br>'
          if (context.isHtml) {
            texte += '$\\def\\arraystretch{2.5}\\begin{array}{|c|c|c|}\n'
          } else {
            texte += '$\\begin{array}{|c|c|c|}\n'
          };
          texte += '\\hline\n'
          texte += `\\text{Facteur n°1} & \\text{Facteur n°2} & \\text{Produit donnant } ${M} \\\\\n`
          texte += '\\hline\n'

          if (nbDiviseursM % 2 === 0) { // si il y a un nombre pair de diviseurs
            for (let m = 0; m < (listeDiviseurs(M).length / 2); m++) {
              texte += texteOuPas(listeDiviseurs(M)[m]) + ' & ' + texteOuPas(listeDiviseurs(M)[(listeDiviseurs(M).length - m - 1)]) + `& ${texteOuPas(M)} \\\\\n`
              texte += '\\hline\n'
            };
          } else { // sinon il est impair, cela n'arrive qu'avvec les carrés parfaits
            for (let m = 0; m < ((listeDiviseurs(M).length - 1) / 2); m++) {
              texte += texteOuPas(listeDiviseurs(M)[m]) + ' & ' + texteOuPas(listeDiviseurs(M)[(listeDiviseurs(M).length - m - 1)]) + `& ${texteOuPas(M)} \\\\\n`
            };
            texte += texteOuPas(listeDiviseurs(M)[(nbDiviseursM - 1) / 2]) + ' & ' + texteOuPas(listeDiviseurs(M)[(nbDiviseursM - 1) / 2]) + `& ${texteOuPas(M)} \\\\\n`
            texte += '\\hline\n'
          };
          texte += '\\end{array}\n$'
          texte += '<br>'
          // correction
          texteCorr = `Le tableau suivant contient tous les couples de facteurs dont le produit vaut ${M}.`
          if (!context.isHtml) {
            texteCorr += '$\\medskip$'
          };
          texteCorr += '<br>'
          if (context.isHtml) {
            texteCorr += '$\\def\\arraystretch{2.5}\\begin{array}{|c|c|c|}\n'
          } else {
            texteCorr += '$\\begin{array}{|c|c|c|}\n'
          };
          texteCorr += '\\hline\n'
          texteCorr += `\\text{Facteur n°1} & \\text{Facteur n°2} & \\text{Produit donnant } ${M} \\\\\n`
          texteCorr += '\\hline\n'

          if (nbDiviseursM % 2 === 0) { // si il y a un nombre pair de diviseurs
            for (let m = 0; m < (listeDiviseurs(M).length / 2); m++) {
              texteCorr += listeDiviseurs(M)[m] + ' & ' + listeDiviseurs(M)[(listeDiviseurs(M).length - m - 1)] + `& ${M} \\\\\n`
              texteCorr += '\\hline\n'
            };
          } else { // sinon il est impair, cela n'arrive qu'avvec les carrés parfaits
            for (let m = 0; m < ((listeDiviseurs(M).length - 1) / 2); m++) {
              texteCorr += listeDiviseurs(M)[m] + ' & ' + listeDiviseurs(M)[(listeDiviseurs(M).length - m - 1)] + `& ${M} \\\\\n`
            };
            texteCorr += listeDiviseurs(M)[(nbDiviseursM - 1) / 2] + ' & ' + listeDiviseurs(M)[(nbDiviseursM - 1) / 2] + `& ${M} \\\\\n`
            texteCorr += '\\hline\n'
          };
          texteCorr += '\\end{array}\n$'
          if (!context.isHtml) {
            texteCorr += '$\\medskip$'
          };
          texteCorr += '<br>'
          texteCorr += `${M} a donc ${nbDiviseursM} diviseurs qui sont : `
          texteCorr += '1'
          for (let w = 1; w < listeDiviseurs(M).length; w++) {
            texteCorr += ' ; ' + listeDiviseurs(M)[w]
          };
          texteCorr += '.'
          break
        case 2: // liste des diviseurs
          texte = ''
          if (this.interactif) {
            texte += `Écrire la liste de tous les diviseurs de $${texNombre(M)}$ <b>dans l'ordre croissant séparés par une virgule.</b>`
          } else {
            texte += `Écrire la liste de tous les diviseurs de ${texNombre(M)}.`
          }
          texteCorr = `Pour trouver la liste des diviseurs de ${M}, on cherche tous les produits de deux facteurs qui donnent ${M}, en écrivant toujours le plus petit facteur en premier.<br>`
          texteCorr += `On vérifie si les nombres de 1 à ${Math.trunc(Math.sqrt(M))} sont des diviseurs de ${M} (inutile d’aller au-delà car $${1 + Math.trunc(Math.sqrt(M))} \\times ${1 + Math.trunc(Math.sqrt(M))} = ${(1 + Math.trunc(Math.sqrt(M))) ** 2})$, on trouve alors :<br>`
          // texteCorr += `Il est suffisant de chercher des diviseurs inférieurs au plus grand nombre dont le carré vaut ${M}, par exemple ici, ${Math.trunc(Math.sqrt(M))}$\\times $${Math.trunc(Math.sqrt(M))} = ${Math.trunc(Math.sqrt(M)) * Math.trunc(Math.sqrt(M))}<${M}`
          // texteCorr += ` et ${Math.trunc(Math.sqrt(M)) + 1}$\\times $${Math.trunc(Math.sqrt(M)) + 1} = ${(Math.trunc(Math.sqrt(M)) + 1) * (Math.trunc(Math.sqrt(M)) + 1)}>${M} donc il suffit d'arrêter la recherche de facteur à ${Math.trunc(Math.sqrt(M))}.`
          // texteCorr += ` En effet, si ${M} est le produit de deux entiers p et q  (p$\\times $q = ${M}) avec p < q alors, si p$\\times $p > ${M}, c'est que q$\\times $q < ${M} mais dans ce cas p serait supérieur à q sinon p$\\times $q serait inférieur à ${M} ce qui ne doit pas être le cas.<br>`
          if (listeDiviseurs(M).length % 2 === 0) { // si il y a un nombre pair de diviseurs
            for (let m = 0; m < (listeDiviseurs(M).length / 2); m++) {
              texteCorr += '' + listeDiviseurs(M)[m] + '$\\times $' + listeDiviseurs(M)[(listeDiviseurs(M).length - m - 1)] + ` = ${M}<br>`
            };
          } else {
            for (let m = 0; m < ((listeDiviseurs(M).length - 1) / 2); m++) {
              texteCorr += '' + listeDiviseurs(M)[m] + '$\\times $' + listeDiviseurs(M)[(listeDiviseurs(M).length - m - 1)] + '<br>'
            };
            texteCorr += '' + listeDiviseurs(M)[(listeDiviseurs(M).length - 1) / 2] + '$\\times $' + listeDiviseurs(M)[(listeDiviseurs(M).length - 1) / 2] + ` = ${M}<br>`
          };
          texteCorr += `Chacun des facteurs de la liste ci-dessus est un diviseur de ${M}.<br>`
          texteCorr += `La liste des diviseurs de ${M} est donc `
          texteCorr += '1'
          for (let w = 1; w < listeDiviseurs(M).length; w++) {
            texteCorr += ' ; ' + listeDiviseurs(M)[w]
          };
          texteCorr += '.'
          break
      };
      setReponse(this, i, JSON.stringify(listeDiviseurs(M)).replace('[', '').replace(']', ''), { formatInteractif: 'texte' })
      texte += ajouteChampTexteMathLive(this, i, 'largeur35 inline', { texte: `<br> Les diviseurs de $${texNombre(M)}$ sont : ` })

      if (this.listeQuestions.indexOf(texte) === -1) { // Si la question n'a jamais été posée, on en créé une autre
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }

    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireTexte = ['Nombres de chiffres des entiers (un par question) séparés par des tirets', '2-2-2']
  this.besoinFormulaire2Texte = ['Nombre maximum de diviseurs des entiers (un par question) séparés par des tirets', '6-6-6']
}