exercices/5e/5R20-3.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import {
  listeQuestionsToContenu,
  randint,
  choice,
  ecritureNombreRelatif,
  ecritureNombreRelatifc,
  ecritureAlgebrique,
  ecritureAlgebriquec,
  signe,
  sommeDesTermesParSigne,
  triePositifsNegatifs,
  lettreDepuisChiffre,
  nombreDeChiffresDansLaPartieEntiere
} from '../../modules/outils.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
export const titre = 'Additions de 5 nombres relatifs'
export const interactifReady = true

export const amcReady = true
export const amcType = 'AMCNum'
export const interactifType = 'mathLive'

/**
 * Effectuer la somme de 5 nombres relatifs.
 *
 * Pour la correction, on commence par effectuer la somme des termes de même signe
 *
 * * On peut paramétrer les distances à zéro qui sont par défaut inférieures à 20
 * * On peut utiliser des écritures simplifiées (ce qui n'est pas le cas par défaut)
 * @author Rémi Angot
 * 5R20-3
 */
export const uuid = '36e2a'
export const ref = '5R20-3'
export default function ExerciceAdditionsDe5Relatifs (max = 20) {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.sup = max
  this.sup2 = false // écriture simplifiée
  this.titre = titre
  this.consigne = 'Calculer.'
  this.spacing = 2
  this.nbCols = 1
  this.nbColsCorr = 1
  this.interactifReady = interactifReady
  this.interactifType = interactifType
  this.amcType = amcType
  this.amcReady = amcReady

  this.nouvelleVersion = function () {
    if (!context.isHtml) this.interactif = false
    this.sup = parseInt(this.sup)
    if (this.interactif) {
      this.spacing = 3
    }
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    for (let i = 0, a, b, c, d, e, s1, s2, s3, s4, relatifs, texte, texteCorr, reponse, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      // On limite le nombre d'essais pour chercher des valeurs nouvelles
      a = randint(1, this.sup) * choice([-1, 1])
      b = randint(1, this.sup) * choice([-1, 1])
      if ((a === 1) & (b === 1)) {
        // On s'assure que les 3 premières termes n'ont pas le même signe
        c = -1
      } else if ((a === -1) & (b === -1)) {
        c = 1
      } else {
        c = randint(1, this.sup) * choice([-1, 1])
      }
      d = randint(1, this.sup) * choice([-1, 1])
      e = randint(1, this.sup) * choice([-1, 1])
      s1 = 1 // Que des additions
      s2 = 1
      s3 = 1
      s4 = 1
      reponse = a + b + c + d + e
      if (this.sup2) {
        texte = `$ ${lettreDepuisChiffre(i + 1)} = ${a}${ecritureAlgebrique(b)}${ecritureAlgebrique(c)}${ecritureAlgebrique(d)}${ecritureAlgebrique(
          e
        )}$`
        if (this.interactif && !context.isAmc) {
          texte = `$ ${lettreDepuisChiffre(i + 1)} = ${a}${ecritureAlgebrique(b)}${ecritureAlgebrique(c)}${ecritureAlgebrique(d)}${ecritureAlgebrique(e)} = $`
          texte += ajouteChampTexteMathLive(this, i, 'inline largeur25 nospacebefore')
        }
        if (!context.isHtml && !context.isAmc) {
          texte += `<br>$ ${lettreDepuisChiffre(i + 1)} =$`
        }
        texteCorr = `$ ${lettreDepuisChiffre(i + 1)} =  ${a}${ecritureAlgebrique(b)}${ecritureAlgebrique(c)}${ecritureAlgebrique(d)}${ecritureAlgebrique(
          e
        )} = ${sommeDesTermesParSigne([a, b, c, d, e])[0]}${ecritureAlgebrique(sommeDesTermesParSigne([a, b, c, d, e])[1])} = ${a + b + c + d + e} $`
      } else {
        texte = `$ ${lettreDepuisChiffre(i + 1)} =  ${ecritureNombreRelatif(a)}${signe(s1)}${ecritureNombreRelatif(b)}${signe(s2)}${ecritureNombreRelatif(
          c
        )}${signe(s3)}${ecritureNombreRelatif(d)}${signe(s4)}${ecritureNombreRelatif(e)}$`
        if (this.interactif && !context.isAmc) {
          texte = `$ ${lettreDepuisChiffre(i + 1)} =  ${ecritureNombreRelatif(a)}${signe(s1)}${ecritureNombreRelatif(b)}${signe(s2)}${ecritureNombreRelatif(
            c)}${signe(s3)}${ecritureNombreRelatif(d)}${signe(s4)}${ecritureNombreRelatif(e)} = $`
          texte += ajouteChampTexteMathLive(this, i, 'inline largeur25 nospacebefore')
        }

        if (!context.isHtml && !context.isAmc) {
          texte += `<br>$ ${lettreDepuisChiffre(i + 1)} =$`
        }
        texteCorr = `$ ${lettreDepuisChiffre(i + 1)} =  ${ecritureNombreRelatif(a)}${signe(s1)}${ecritureNombreRelatif(b)}${signe(s2)}${ecritureNombreRelatif(
          c
        )}${signe(s3)}${ecritureNombreRelatif(d)}${signe(s4)}${ecritureNombreRelatif(e)} $`
        relatifs = triePositifsNegatifs([a, s1 * b, s2 * c, s3 * d, s4 * e])

        if ((relatifs[0] > 0) & (relatifs[4] < 0)) {
          texteCorr += `<br>$ ${lettreDepuisChiffre(i + 1)}= ${ecritureNombreRelatifc(relatifs[0])}+${ecritureNombreRelatifc(relatifs[1])}+${ecritureNombreRelatifc(
            relatifs[2]
          )}+${ecritureNombreRelatifc(relatifs[3])}+${ecritureNombreRelatifc(relatifs[4])} $`
        }
        const sommesSignees = sommeDesTermesParSigne([relatifs[0], relatifs[1], relatifs[2], relatifs[3], relatifs[4]])
        if (sommesSignees[0] !== 0 && sommesSignees[1] !== 0) {
          texteCorr += `<br>$ ${lettreDepuisChiffre(i + 1)}= ${ecritureNombreRelatifc(sommesSignees[0])}+${ecritureNombreRelatifc(sommesSignees[1])} $`
          texteCorr += `<br>$ ${lettreDepuisChiffre(i + 1)}= ${ecritureAlgebriquec(a + s1 * b + s2 * c + s3 * d + s4 * e)}$<br>`
        } else if (sommesSignees[0] !== 0) {
          texteCorr += `<br>$ ${lettreDepuisChiffre(i + 1)}=${ecritureAlgebriquec(sommesSignees[0])}$`
        } else {
          texteCorr += `<br>$ ${lettreDepuisChiffre(i + 1)}=${ecritureAlgebriquec(sommesSignees[1])}$<br>`
        }
      }
      if (this.listeQuestions.indexOf(texte) === -1) {
        // Si la question n'a jamais été posée, on en créé une autre
        setReponse(this, i, reponse, { signe: true, digits: Math.max(2, nombreDeChiffresDansLaPartieEntiere(reponse)), decimals: 0 })
        this.listeQuestions.push(texte)
        this.listeCorrections.push(texteCorr)
        i++
      }
      cpt++
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireNumerique = ['Valeur maximale', 99999]
  this.besoinFormulaire2CaseACocher = ['Avec des écritures simplifiées']
}