exercices/6e/6N11-2.js

import Exercice from '../Exercice.js'
import { mathalea2d } from '../../modules/2dGeneralites.js'
import { listeQuestionsToContenu, randint, combinaisonListes, calcul, htmlConsigne, texNombre, egal, shuffle, stringNombre, lettreIndiceeDepuisChiffre } from '../../modules/outils.js'
import { pointCliquable } from '../../modules/2dinteractif.js'
import { droiteGraduee, labelPoint, point, tracePoint } from '../../modules/2d.js'
import { context } from '../../modules/context.js'

export const titre = 'Placer un point d\'abscisse entière (grands nombres)'
export const interactifReady = true
export const interactifType = 'custom'
export const amcReady = true
export const amcType = 'AMCOpen'
/**
 * Placer un point d'abscisse entière
 * @author Jean-Claude Lhote et Rémi Angot
 * référence 6N11-2
 * Relecture : Novembre 2021 par EE
 * Correction : Problème de score 19/10/22 par Rémi ANGOT
 */
export const uuid = '4f2a3'
export const ref = '6N11-2'
export default function PlacerUnPointAbscisseEntiere2d () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.nbQuestions = 5
  this.nbQuestionsModifiable = true
  this.nbCols = 1
  this.nbColsCorr = 1
  this.spacing = 1
  this.spacingCorr = 1
  this.sup = 1

  this.nouvelleVersion = function () {
    if (this.interactif) {
      this.consigne = 'Placer un point sur un axe gradué.'
    } else {
      this.consigne = 'Placer trois points sur un axe gradué.'
    }
    // numeroExercice est 0 pour l'exercice 1
    let typesDeQuestions
    this.listeQuestions = []
    this.listeCorrections = []
    this.autoCorrection = []
    this.contenu = '' // Liste de questions
    this.contenuCorrection = '' // Liste de questions corrigées
    if (parseInt(this.sup) === 4) { typesDeQuestions = combinaisonListes([1, 2, 3], this.nbQuestions) } else {
      typesDeQuestions = combinaisonListes(
        [parseInt(this.sup)],
        this.nbQuestions
      )
    }
    const pointsSolutions = []
    const pointsNonSolutions = [] // Pour chaque question, la liste des points qui ne doivent pas être cliqués
    const tailleUnite = 4
    const d = []
    let abscisse = []
    this.contenu = htmlConsigne(this.consigne)
    for (let i = 0, abs0, l1, l2, l3, x1, x2, x3, x11, x22, x33, A, B, C, traceA, traceB, traceC, labels, pas1, texte = '', texteCorr = ''; i < this.nbQuestions; i++) {
      l1 = lettreIndiceeDepuisChiffre(i * 3 + 1)
      l2 = lettreIndiceeDepuisChiffre(i * 3 + 2)
      l3 = lettreIndiceeDepuisChiffre(i * 3 + 3)
      this.autoCorrection[3 * i] = { propositions: [{ statut: 4, feedback: '' }] }
      this.autoCorrection[3 * i + 1] = { propositions: [{ statut: 4, feedback: '' }] }
      this.autoCorrection[3 * i + 2] = { propositions: [{ statut: 4, feedback: '' }] }
      switch (typesDeQuestions[i]) {
        case 1: // Placer des entiers sur un axe (milliers)
          abs0 = randint(1, 9) * 1000
          pas1 = 1000
          break

        case 2: // Placer des entiers sur un axe (dizaines de mille)
          abs0 = randint(5, 15) * 10000
          pas1 = 10000
          break

        case 3: // Placer des entiers sur un axe (centaines de mille)
          abs0 = randint(35, 85) * 100000
          pas1 = 100000
          break
      }
      x1 = randint(0, 2) + randint(1, 9) / 10
      x2 = randint(3, 4) + randint(1, 9) / 10
      x3 = randint(5, 6) + randint(1, 9) / 10
      x11 = abs0 + x1 * pas1
      x22 = abs0 + x2 * pas1
      x33 = abs0 + x3 * pas1
      abscisse = shuffle([[x1, x11], [x2, x22], [x3, x33]])
      d[2 * i] = droiteGraduee({
        Unite: 4,
        Min: 0,
        Max: 7.1,
        axeStyle: '->',
        pointTaille: 5,
        pointStyle: 'x',
        labelsPrincipaux: false,
        thickSec: true,
        step1: 10,
        labelListe: [[0, !context.isAmc ? stringNombre(abs0) : texNombre(abs0, 0)], [1, !context.isAmc ? stringNombre(calcul(abs0 + pas1)) : texNombre(calcul(abs0 + pas1))]]
      })
      d[2 * i + 1] = droiteGraduee({
        Unite: 4,
        Min: 0,
        Max: 7.1,
        axeStyle: '->',
        pointTaille: 5,
        pointStyle: 'x',
        labelsPrincipaux: false,
        labelListe: [[0, !context.isAmc ? stringNombre(abs0) : texNombre(abs0, 0)], [1, !context.isAmc ? stringNombre(calcul(abs0 + pas1)) : texNombre(calcul(abs0 + pas1))]],
        thickSec: true,
        step1: 10
      })
      const mesObjets = [d[2 * i]]
      if (this.interactif) {
        texte = `Placer le point $${l1}\\left(${texNombre(abscisse[0][1])}\\right).$`
      } else {
        texte = `Placer les points $${l1}\\left(${texNombre(abscisse[0][1])}\\right)$, $~${l2}\\left(${texNombre(abscisse[1][1])}\\right)$ et $~${l3}\\left(${texNombre(abscisse[2][1])}\\right)$.`
      }
      pointsNonSolutions[i] = []
      if (this.interactif) {
        for (let indicePoint = 0, monPoint; indicePoint < 70; indicePoint++) {
          monPoint = pointCliquable(indicePoint / 10 * tailleUnite, 0, { size: 5, width: 3, color: 'blue', radius: tailleUnite / 25 })
          mesObjets.push(monPoint)
          if (egal(indicePoint * pas1 / 10 + abs0, abscisse[0][1])) {
            pointsSolutions[i] = monPoint
          } else {
            pointsNonSolutions[i].push(monPoint)
          }
        }
      }
      texte += (context.isHtml ? '' : '\\\\') + mathalea2d({ xmin: -2, ymin: -1, xmax: 30, ymax: 1, pixelsParCm: 20, scale: 0.5 }, mesObjets)
      if (this.interactif) {
        texte += `<div id="resultatCheckEx${this.numeroExercice}Q${i}"></div>`
      }

      A = point(abscisse[0][0] * tailleUnite, 0, l1)
      traceA = tracePoint(A, 'blue')
      traceA.epaisseur = 3
      traceA.taille = 5
      labels = labelPoint(A)
      if (!this.interactif) {
        A.nom = lettreIndiceeDepuisChiffre(i * 3 + 1)
        B = point(abscisse[1][0] * tailleUnite, 0, l2)
        traceB = tracePoint(B, 'blue')
        traceB.epaisseur = 3
        traceB.taille = 5
        C = point(abscisse[2][0] * tailleUnite, 0, l3)
        traceC = tracePoint(C, 'blue')
        traceC.epaisseur = 3
        traceC.taille = 5
        labels = labelPoint(A, B, C)
      }
      if (this.interactif) {
        texteCorr = `$${l1}\\left(${stringNombre(abscisse[0][1])}\\right).$`
        texteCorr += '<br>' + mathalea2d({ xmin: -2, xmax: 30, ymin: -1, ymax: 1, pixelsParCm: 20, scale: 0.5 }, d[2 * i + 1], traceA, labels)
      } else {
        texteCorr = `$${l1}\\left(${stringNombre(abscisse[0][1])}\\right)$, $~${l2}\\left(${stringNombre(abscisse[1][1])}\\right)$ et $~${l3}\\left(${stringNombre(abscisse[2][1])}\\right)$`
        texteCorr += '<br>' + mathalea2d({ xmin: -2, xmax: 30, ymin: -1, ymax: 1, pixelsParCm: 20, scale: 0.5 }, d[2 * i + 1], traceA, traceB, traceC, labels)
      }
      if (context.isAmc) {
        this.autoCorrection[i] =
          {
            enonce: texte + '<br>',
            propositions: [
              {
                texte: texteCorr,
                statut: 3, // OBLIGATOIRE (ici c'est le nombre de lignes du cadre pour la réponse de l'élève sur AMC)
                sanscadre: true
              }
            ]
          }
      }

      this.listeQuestions.push(texte)
      this.listeCorrections.push(texteCorr)
    }
    // Pour distinguer les deux types de codage de recuperation des résultats
    this.exoCustomResultat = true
    // Gestion de la correction
    this.correctionInteractive = (i) => {
      let resultat
      let aucunMauvaisPointsCliques = true
      const divFeedback = document.querySelector(`#resultatCheckEx${this.numeroExercice}Q${i}`)
      pointsSolutions[i].stopCliquable()
      for (const monPoint of pointsNonSolutions[i]) {
        if (monPoint.etat) aucunMauvaisPointsCliques = false
        monPoint.stopCliquable()
        if (aucunMauvaisPointsCliques && pointsSolutions[i].etat) {
          divFeedback.innerHTML = '😎'
          resultat = 'OK'
        } else {
          divFeedback.innerHTML = '☹️'
          resultat = 'KO'
        }
      }
      return resultat
    }
    listeQuestionsToContenu(this)
  }
  this.besoinFormulaireNumerique = [
    'Niveau de difficulté',
    4,
    '1 : Ordre de grandeur : milliers\n2 : Ordre de grandeur : dizaines de mille\n3 : Ordre de grandeur : centaines de mille\n4 : Mélange'
  ]
}