exercices/4e/4C33-1.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenuSansNumero, randint, choice, combinaisonListes, lettreDepuisChiffre, texteGras, simpNotPuissance, eclatePuissance, reorganiseProduitPuissance, modalPdf } from '../../modules/outils.js'

import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
export const titre = 'Puissances : Le sens des règles de calculs'

export const interactifReady = true
export const interactifType = 'mathLive'
export const amcReady = true // pour définir que l'exercice est exportable AMC
export const amcType = 'AMCNum'

/**
 * Puissances d'un relatif (1)
 * * L\'objectif est de travailler le sens des règles de calcul sur les puissances plutôt que les formules magiques
 *
 * Paramétrages possibles :
 * * 1 : produit de puissances de même base
 * * 2 : quotient de puissances de même base
 * * 3 : puissance de puissance
 * * 4 : produit de puissances de même exposant
 * * 5 : mélange des trois autres niveaux
 * @author Sébastien Lozano
 * 4C33-1
 */
export const uuid = 'bae57'
export const ref = '4C33-1'
export default function PuissancesDunRelatif1 () {
  'use strict'
  Exercice.call(this) // Héritage de la classe Exercice()
  this.sup = 1
  this.titre = titre
  context.isHtml
    ? (this.consigne = 'Écrire sous la forme $\\mathbf{a^n}$.')
    : (this.consigne = 'Écrire sous la forme $a^n$.')
  context.isHtml ? (this.spacing = 3) : (this.spacing = 2)
  context.isHtml ? (this.spacingCorr = 2) : (this.spacingCorr = 1)
  this.nbQuestions = 5
  this.correctionDetailleeDisponible = true
  this.nbColsCorr = 1
  this.sup = 5

  this.listePackages = 'bclogo'

  this.nouvelleVersion = function (numeroExercice) {
    this.sup = Number(this.sup)
    let typesDeQuestions
    this.boutonAide = modalPdf(
      numeroExercice,
      'assets/pdf/FichePuissances-4N21.pdf',
      'Aide mémoire sur les puissances (Sébastien Lozano)',
      'Aide mémoire'
    )

    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []

    let typesDeQuestionsDisponibles = []
    if (this.sup === 1) {
      typesDeQuestionsDisponibles = [1] // produit de puissances de même base
    } else if (this.sup === 2) {
      typesDeQuestionsDisponibles = [2] // quotient de puissances de même base
    } else if (this.sup === 3) {
      typesDeQuestionsDisponibles = [3] // puissance de puissance
    } else if (this.sup === 4) {
      typesDeQuestionsDisponibles = [4] // produit de puissances de même exposant
    } else if (this.sup === 5) {
      typesDeQuestionsDisponibles = [1, 2, 3, 4] // mélange
    }

    const listeTypeDeQuestions = combinaisonListes(
      typesDeQuestionsDisponibles,
      this.nbQuestions
    )

    // pour pouvoir adapter les couleurs en cas de besoin
    const coul0 = 'red'
    const coul1 = 'blue'

    for (
      let i = 0,
        base0,
        base1,
        base,
        baseUtile,
        baseUtileBisAMC,
        exp0,
        exp1,
        exp,
        couleurExp0,
        couleurExp1,
        lettre,
        texte,
        texteCorr,
        reponseInteractive,
        exposantInteractif,
        cpt = 0;
      i < this.nbQuestions && cpt < 50;

    ) {
      // une fonction pour des infos supp sur les exposants
      function remarquesPuissances (base, baseUtile, exposant) {
        let sortie = ''
        if (base < 0 && exposant % 2 === 0) {
          sortie += '<br>'
          sortie += `${texteGras('Remarque : ')} Dans ce cas comme les puissances d'exposant pair de deux nombres opposés sont égaux, on peut écrire $${simpNotPuissance(base, exposant)}$ à la place de $${baseUtile}^{${exposant}}$`
        };
        if (base < 0 && exposant % 2 === 1) {
          sortie += '<br>'
          sortie += `${texteGras('Remarque : ')} Dans ce cas comme les puissances d'exposant impair de deux nombres négatifs sont opposées, on pourrait écrire $${simpNotPuissance(base, exposant)}$  à la place de $${baseUtile}^{${exposant}}$`
        };

        return sortie
      };

      typesDeQuestions = listeTypeDeQuestions[i]

      base = randint(2, 9) * choice([-1, 1]) // on choisit une base sauf 1 ... penser à gérer le cas des bases qui sont des puissances
      exp0 = randint(1, 9)
      exp1 = randint(1, 9, [exp0])
      exp = [exp0, exp1] // on choisit deux exposants différents c'est mieux
      lettre = lettreDepuisChiffre(i + 1) // on utilise des lettres pour les calculs

      if (base < 0) {
        baseUtile = '(' + base + ')' // on définit une base avec des parenthèses pour l'affichage du cas negatif
      } else {
        baseUtile = base
      }

      texteCorr = ''

      switch (typesDeQuestions) {
        case 1: // produit de puissances de même base
          texte = `$${lettre}=${baseUtile}^${exp[0]}\\times ${baseUtile}^${exp[1]}$`

          texteCorr += `$${lettre}=${baseUtile}^${exp[0]}\\times ${baseUtile}^${exp[1]}$`
          if (this.correctionDetaillee) {
            texteCorr += '<br>'
            texteCorr += `$${lettre}=${eclatePuissance(
              baseUtile,
              exp[0],
              coul0
            )} \\times ${eclatePuissance(baseUtile, exp[1], coul1)}$`
          }
          texteCorr += '<br>'
          texteCorr += `Il y a donc $\\mathbf{\\color{${coul0}}{${exp[0]}}~\\color{black}{+}~\\color{${coul1}}{${exp[1]}}}$ facteurs tous égaux à $${baseUtile}$`
          texteCorr += '<br>'
          texteCorr += `$${lettre}=${baseUtile}^{${exp[0]}+${exp[1]}} = ${baseUtile}^{${exp[0] + exp[1]}}`
          // attention la baseUtile est de type str alors que la fonction switch sur un type number
          if ((base < 0) && ((exp[1] + exp[0]) % 2 === 0)) {
            texteCorr += `=${simpNotPuissance(base, exp[1] + exp[0])}$`
          } else {
            texteCorr += '$'
          }
          texteCorr += remarquesPuissances(base, baseUtile, exp[1] + exp[0])
          texteCorr += '<br>'
          if (base < 0 && ((exp[0] + exp[1]) % 2) === 0) {
            reponseInteractive = [`${baseUtile}^${exp[1] + exp[0]}`, `${-base}^${exp[1] + exp[0]}`]
            baseUtileBisAMC = -base
          } else {
            reponseInteractive = `${baseUtile}^${exp[1] + exp[0]}`
          }
          exposantInteractif = exp[1] + exp[0]
          break
        case 2: // quotient de puissances de même base
          // Pour que la couleur de la base associée à l'exposant max soit toujours rouge.
          if (Math.max(exp[0], exp[1]) === exp[0]) {
            couleurExp0 = coul0
            couleurExp1 = coul1
          } else {
            couleurExp0 = coul1
            couleurExp1 = coul0
          };

          texte = `$${lettre}=\\dfrac{${baseUtile}^${exp[0]}}{${baseUtile}^${exp[1]}}$`

          texteCorr += `$${lettre}=\\dfrac{${baseUtile}^${exp[0]}}{${baseUtile}^${exp[1]}}$`

          if (this.correctionDetaillee) {
            texteCorr += '<br><br>'
            texteCorr += `$${lettre}=\\dfrac{${eclatePuissance(baseUtile, exp[0], couleurExp0)}}{${eclatePuissance(baseUtile, exp[1], couleurExp1)}}$`
          }
          texteCorr += '<br><br>'
          texteCorr += `Il y a donc $\\mathbf{\\color{${coul1}}{${Math.min(exp[0], exp[1])}}}$ simplifications par $${baseUtile}$ possibles.`
          if (this.correctionDetaillee) {
            texteCorr += '<br><br>'
          }
          if (exp[0] - exp[1] === 0) {
            if (this.correctionDetaillee) {
              texteCorr += `$${lettre}=\\dfrac{${eclatePuissance(
                `\\cancel{${baseUtile}}`,
                exp[0],
                couleurExp0
              )}}{${eclatePuissance(
                `\\cancel{${baseUtile}}`,
                exp[0],
                couleurExp1
              )}}$`
            }
            texteCorr += '<br><br>'
            texteCorr += `$${lettre}=1$`
          } else if (exp[0] - exp[1] < 0) {
            if (this.correctionDetaillee) {
              texteCorr += `$${lettre}=\\dfrac{${eclatePuissance(
                `\\cancel{${baseUtile}}`,
                exp[0],
                couleurExp0
              )}}{${eclatePuissance(
                `\\cancel{${baseUtile}}`,
                exp[0],
                couleurExp1
              )}\\times${eclatePuissance(
                baseUtile,
                exp[1] - exp[0],
                couleurExp1
              )}}$`
            }
            texteCorr += '<br><br>'
            texteCorr += `$${lettre}=\\dfrac{1}{${baseUtile}^{${exp[1]}-${exp[0]}}}=\\dfrac{1}{${baseUtile}^{${exp[1] - exp[0]}}}`
            if ((base < 0) && ((exp[1] - exp[0]) % 2 === 0)) {
              texteCorr += `=\\dfrac{1}{${simpNotPuissance(
                base,
                exp[1] - exp[0]
              )}}=${simpNotPuissance(base, exp[0] - exp[1])}$`
            } else {
              texteCorr += `=${baseUtile}^{${exp[0] - exp[1]}}$`
            }
          } else {
            if (this.correctionDetaillee) {
              texteCorr += `$${lettre}=\\dfrac{${eclatePuissance(
                `\\cancel{${baseUtile}}`,
                exp[1],
                couleurExp0
              )}\\times${eclatePuissance(
                baseUtile,
                exp[0] - exp[1],
                couleurExp0
              )}}{${eclatePuissance(
                `\\cancel{${baseUtile}}`,
                exp[1],
                couleurExp1
              )}}$`
            }
            texteCorr += '<br><br>'
            texteCorr += `$${lettre}=${baseUtile}^{${exp[0]}-${exp[1]}}=${baseUtile}^{${exp[0] - exp[1]}}`
            if ((base < 0) && ((exp[0] - exp[1]) % 2 === 0)) {
              texteCorr += `=${simpNotPuissance(base, exp[0] - exp[1])}$`
            } else {
              texteCorr += '$'
            }
          }
          texteCorr += remarquesPuissances(base, baseUtile, exp[0] - exp[1])
          texteCorr += '<br>'
          if (base < 0 && ((exp[0] - exp[1]) % 2) === 0) {
            reponseInteractive = [`${baseUtile}^${exp[0] - exp[1]}`, `${-base}^${exp[0] - exp[1]}`]
            baseUtileBisAMC = -base
          } else {
            reponseInteractive = `${baseUtile}^${exp[0] - exp[1]}`
          }
          exposantInteractif = exp[0] - exp[1]
          break
        case 3: // exponentiation
          exp = [randint(2, 4), randint(2, 4)] // on redéfinit les deux exposants pour ne pas avoir d'écritures trop longues et pour éviter 1
          texte = `$${lettre}=(${baseUtile}^${exp[0]})^{${exp[1]}}$`

          texteCorr += `$${lettre}=(${baseUtile}^${exp[0]})^{${exp[1]}}$`

          if (this.correctionDetaillee) {
            texteCorr += '<br>'
            texteCorr += `$${lettre}=\\color{${coul0}}{\\underbrace{${eclatePuissance(
              `(${baseUtile}^${exp[0]})`,
              exp[1],
              coul0
            )}}_{${exp[1]}\\thickspace\\text{facteurs}}}$`
            texteCorr += '<br>'
            texteCorr += `$${lettre}=\\color{${coul0}}{\\underbrace{${eclatePuissance(
              `(\\color{${coul1}}{\\underbrace{${eclatePuissance(
                baseUtile,
                exp[0],
                coul1
              )}}_{${exp[0]}\\thickspace\\text{facteurs}}}\\color{${coul0}})`,
              exp[1],
              coul0
            )}}_{${exp[1]}\\times\\color{${coul1}}{${exp[0]
              }}\\thickspace\\color{black}{\\text{facteurs}}}}$`
          }
          texteCorr += '<br>'
          texteCorr += `Il y a donc $\\mathbf{\\color{${coul0}}{${exp[1]}}~\\color{black}{\\times}~\\color{${coul1}}{${exp[0]}}}$ facteurs tous égaux à $${baseUtile}$`
          texteCorr += '<br>'
          texteCorr += `$${lettre}=${baseUtile}^{${exp[0]}\\times${exp[1]
            }} = ${baseUtile}^{${exp[0] * exp[1]}}`
          if ((base < 0) && ((exp[1] * exp[0]) % 2 === 0)) {
            texteCorr += `= ${simpNotPuissance(base, exp[0] * exp[1])}$`
          } else {
            texteCorr += '$'
          }
          texteCorr += remarquesPuissances(base, baseUtile, exp[0] * exp[1])
          texteCorr += '<br>'
          if (base < 0 && (exp[0] * exp[1] % 2) === 0) {
            reponseInteractive = [`${baseUtile}^${exp[0] * exp[1]}`, `${-base}^${exp[0] * exp[1]}`]
            baseUtileBisAMC = -base
          } else {
            reponseInteractive = `${baseUtile}^${exp[0] * exp[1]}`
          }
          exposantInteractif = exp[0] * exp[1]
          break
        case 4: // produit de puissances de même exposant
          base0 = randint(2, 8, [4, 6])
          base1 = randint(2, 8, [4, 6, base0])
          base = [base0, base1] // on choisit 2 bases différentes c'est mieux
          exp = randint(2, 5, 6) // on choisit un exposant
          texte = `$${lettre}=${base[0]}^${exp}\\times ${base[1]}^${exp}$`
          texteCorr += '<br>'
          texteCorr += `$${lettre}=${base[0]}^${exp}\\times ${base[1]}^${exp}$`

          if (this.correctionDetaillee) {
            texteCorr += '<br>'
            texteCorr += `$${lettre}=${eclatePuissance(
              base[0],
              exp,
              coul0
            )} \\times ${eclatePuissance(base[1], exp, coul1)}$`
            texteCorr += '<br>'
            texteCorr += `$${lettre}=${reorganiseProduitPuissance(
              base[0],
              base[1],
              exp,
              coul0,
              coul1
            )}$`
          }
          texteCorr += '<br>'
          texteCorr += `$${lettre}= (\\color{${coul0}}{\\mathbf{${base[0]
            }}} \\color{black}{\\times} \\color{${coul1}}{\\mathbf{${base[1]
            }}}\\color{black}{)^{${exp}}}=${base[0] * base[1]}^${exp}$`
          texteCorr += '<br>'
          // Ici la base ne peut jamais être négative
          reponseInteractive = `${base[0] * base[1]}^${exp}`
          baseUtile = base[0] * base[1]
          baseUtileBisAMC = base[0] * base[1] // juste pour ne pas avoir à ajouter un batterie de ligne spécifique pour ce cas, je mets deux fois la même chose
          base = baseUtile
          exposantInteractif = exp
          break
      }
      if (this.interactif && !context.isAmc) {
        setReponse(this, i, reponseInteractive, { formatInteractif: 'puissance' })
        texte += ajouteChampTexteMathLive(this, i, 'largeur25 inline', { texte: ' $=$' })
      }
      if (context.isAmc) {
        setReponse(this, i, reponseInteractive, { formatInteractif: 'puissance', basePuissance: base, exposantPuissance: exposantInteractif, exposantNbChiffres: 2, signe: true, aussiCorrect: baseUtileBisAMC })
      }
      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++
    }
    listeQuestionsToContenuSansNumero(this)
  }
  this.besoinFormulaireNumerique = [
    'Règle à travailler',
    5,
    '1 : Produit de deux puissances de même base\n2 : Quotient de deux puissances de même base\n3 : Puissance de puissances\n4 : Produit de puissances de même exposant\n5 : Mélange'
  ]
}