exercices/6e/6G42-1.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, combinaisonListes, rangeMinMax, contraindreValeur, compteOccurences, choisitLettresDifferentes, choice, numAlpha, texteEnCouleurEtGras, enleveDoublonNum } from '../../modules/outils.js'
import { pave3d, point3d } from '../../modules/3d.js'
import { fixeBordures, mathalea2d } from '../../modules/2dGeneralites.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { propositionsQcm } from '../../modules/interactif/questionQcm.js'
export const titre = 'Nommer des faces dans un pavé droit'
export const amcReady = true
export const amcType = 'AMCHybride' // type de question AMC
export const interactifReady = true
export const interactifType = ['qcm', 'mathLive']

export const dateDePublication = '06/11/2022'

/**
 * Nommer des faces dans un pavé droit
 * @author Eric Elter
 */

export const uuid = '6809f'
export const ref = '6G42-1'
export default function LireFacePaveDroit () {
  'use strict'
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.nbQuestions = 4
  this.nbCols = 1
  this.nbColsCorr = 1
  this.sup = 3
  this.sup2 = 7
  this.sup3 = 1
  this.sup4 = 6

  /**
* Inverse une chaîne de caractères
* @param {string} str Chaîne à inverser
* @author Eric Elter (enfin copié sur le net)
* @example inverseChaine('laval') renvoie 'laval' /// Hihihihi...
* @example inverseChaine('parfait') renvoie 'tiafrap'
* @example inverseChaine('1234') renvoie '4321'
*/
  function inverseChaine (str) {
    return (str === '') ? '' : inverseChaine(str.substr(1)) + str.charAt(0)
  }
  function differentsNomsPossiblesDUneFace (face, nomSolide) {
    let nouvelleFaceChiffree = ''
    let nouvelleFace = ''
    const tabChiffre = [face, inverseChaine(face)]
    const tab = []
    for (let i = 0; i < face.length - 1; i++) {
      nouvelleFaceChiffree = tabChiffre[2 * i][3] + tabChiffre[2 * i].slice(0, 3)
      tabChiffre.push(nouvelleFaceChiffree, inverseChaine(nouvelleFaceChiffree))
    }
    for (let i = 0; i < tabChiffre.length; i++) {
      nouvelleFace = ''
      for (let j = 0; j < face.length; j++) {
        nouvelleFace += nomSolide[tabChiffre[i][j]]
      }
      tab.push(nouvelleFace)
    }
    return tab
  }

  this.nouvelleVersion = function () {
    this.sup4 = contraindreValeur(2, 6, this.sup4, 6)
    this.interactifType = this.sup3 === 2 ? 'mathLive' : 'qcm'
    this.autoCorrection = []
    let typesDeQuestionsIndisponibles = []
    if (!this.sup2) { // Si aucune liste n'est saisie
      typesDeQuestionsIndisponibles = 7
    } else {
      if (typeof (this.sup2) === 'number') { // Si c'est un nombre c'est que le nombre a été saisi dans la barre d'adresses
        typesDeQuestionsIndisponibles[0] = contraindreValeur(1, 6, this.sup2, 1)
      } else {
        typesDeQuestionsIndisponibles = this.sup2.split('-')// Sinon on créé un tableau à partir des valeurs séparées par des -
        for (let i = 0; i < typesDeQuestionsIndisponibles.length; i++) { // on a un tableau avec des strings : ['1', '1', '2']
          typesDeQuestionsIndisponibles[i] = contraindreValeur(1, 6, parseInt(typesDeQuestionsIndisponibles[i]), 1) // parseInt en fait un tableau d'entiers
        }
      }
    }
    if (compteOccurences(typesDeQuestionsIndisponibles, 7) > 0) typesDeQuestionsIndisponibles = [] // Teste si l'utilisateur a choisi rien
    enleveDoublonNum(typesDeQuestionsIndisponibles)

    function comparerNombres (a, b) {
      return a - b
    }

    typesDeQuestionsIndisponibles.sort(comparerNombres)
    let choixFace = rangeMinMax(0, 5)
    for (let i = typesDeQuestionsIndisponibles.length - 1; i >= 0; i--) {
      choixFace.splice(typesDeQuestionsIndisponibles[i], 1)
    }
    choixFace = combinaisonListes(choixFace, choixFace.length)
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []
    let indiceQuestion

    for (let i = 0, texte, texteCorr, objetsEnonce, A, B, D, E, solideDessine, nomSolide, enonceAMC, enonceFigure,
      L, p, choixProfondeur, facesPossibles, h, resultatsPossibles, resultatsImpossibles, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      texte = ''
      texteCorr = ''
      objetsEnonce = []
      context.anglePerspective = choice([-30, -60, 30, 60])

      L = randint(5, 20)
      h = randint(5, 20, [L])
      p = randint(5, 20, [L, h])
      A = point3d(0, 0, 0)
      B = point3d(L, 0, 0)
      D = point3d(0, 0, h)
      choixProfondeur = choice([p, -p])
      E = point3d(0, choixProfondeur, 0)

      nomSolide = choisitLettresDifferentes(8, 'OQWXD').join('')
      solideDessine = pave3d(A, B, D, E, 'blue', true, nomSolide)
      objetsEnonce.push(...solideDessine.c2d)
      // enonceFigure = (context.isAmc ? '' : '<br>') + mathalea2d(Object.assign({}, fixeBordures(objetsEnonce), { scale: context.isHtml ? 0.7 : 0.2, style: 'block' }), objetsEnonce) + '<br>'
      enonceFigure = mathalea2d(Object.assign({}, fixeBordures(objetsEnonce), { scale: context.isHtml ? 0.7 : 0.3, style: 'block' }), objetsEnonce) + '<br>'
      texte += enonceFigure
      facesPossibles = [['de devant', '0123'], ['de derrière', '4567'], ['de gauche', '0374'], ['de droite', '1265'], ['du dessus', '2376'], ['du dessous', '0154']]

      if (context.isAmc) {
        this.autoCorrection[i] = {
          enonce: enonceFigure,
          enonceCentre: false,
          options: {
            ordered: false
          }
        }
        this.autoCorrection[i].propositions = []
      }

      for (let ee = 0; ee < Math.min(choixFace.length, this.sup); ee++) {
        indiceQuestion = i * Math.min(choixFace.length, this.sup) + ee

        enonceAMC = this.sup === 1 ? '' : (((ee === 0) ? '' : '<br>') + numAlpha(ee))

        enonceAMC += `Comment peut se nommer la face ${facesPossibles[choixFace[ee]][0]} du pavé droit ${nomSolide} ?`
        texte += enonceAMC
        resultatsPossibles = combinaisonListes(differentsNomsPossiblesDUneFace(facesPossibles[choixFace[ee]][1], nomSolide))
        texteCorr += this.sup === 1 ? '' : numAlpha(ee)
        texteCorr += `La face ${facesPossibles[choixFace[ee]][0]} du pavé droit ${nomSolide} peut se nommer ${texteEnCouleurEtGras(resultatsPossibles[0])} mais aussi `
        for (let j = 1; j < resultatsPossibles.length - 2; j++) texteCorr += `${resultatsPossibles[j]}, `
        texteCorr += `${resultatsPossibles[resultatsPossibles.length - 2]} ou ${resultatsPossibles[resultatsPossibles.length - 1]}.<br>`

        if ((this.interactifType && this.interactifType === 'qcm') || context.isAmc) {
          resultatsImpossibles = []
          for (let j = 0; j < 6; j++) {
            if (j !== choixFace[ee]) {
              resultatsImpossibles.push(combinaisonListes(differentsNomsPossiblesDUneFace(facesPossibles[j][1], nomSolide))[0])
            }
          }
        }
        if (this.interactif) {
          this.autoCorrection[indiceQuestion] = {}
          if (this.interactifType === 'qcm') {
            this.autoCorrection[indiceQuestion].enonce = `${texte}\n`
            this.autoCorrection[indiceQuestion].propositions = [{
              texte: `${resultatsPossibles[0]}`,
              statut: true
            }]
            for (let j = 0; j < Math.min(resultatsImpossibles.length, this.sup4 - 1); j++) {
              this.autoCorrection[indiceQuestion].propositions.push({
                texte: `${resultatsImpossibles[j]}`,
                statut: false
              })
            }

            this.autoCorrection[indiceQuestion].options = {}
            texte += propositionsQcm(this, indiceQuestion).texte
          } else {
            setReponse(this, indiceQuestion, resultatsPossibles, { formatInteractif: 'texte' })
            texte += ajouteChampTexteMathLive(this, indiceQuestion, 'largeur25 inline') + '<br>'
          }
        }
        if (context.isAmc) {
          this.autoCorrection[i].propositions.push(
            {
              type: 'qcmMono',
              enonce: enonceAMC,
              propositions: [
                {
                  texte: `${resultatsPossibles[0]}`,
                  statut: true
                }
              ]
            }
          )
          for (let j = 0; j < Math.min(resultatsImpossibles.length, this.sup4 - 1); j++) {
            this.autoCorrection[i].propositions[ee].propositions.push({
              texte: `${resultatsImpossibles[j]}`,
              statut: false
            })
          }
        }
      }

      if (this.questionJamaisPosee(i, nomSolide)) {
        // 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 = ['Nombre de faces à trouver', 6, 'Entre 1 et 6']
  this.besoinFormulaire2Texte = ['Faces à exclure du choix', 'Nombres séparés par des tirets\n1 : de devant\n2 : de derrière\n3 : de gauche\n4 : de droite\n5 : du dessus\n6 : du dessous\n7 : aucune à exclure']
  this.besoinFormulaire3Numerique = ['Type d\'exercice interactif ou AMC', 2, '1 : QCM\n2 : Numérique']
  this.besoinFormulaire4Numerique = ['Nombre de réponses dans le QCM', 6, 'Entre 2 et 6']
}