exercices/5e/5P11-1.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, combinaisonListes, randint, choice, prenomF, prenomM, texNombre, nombreAvecEspace, calcul, minToHour, stringNombre } from '../../modules/outils.js'
import { setReponse } from '../../modules/gestionInteractif.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
export const titre = 'Problème de vitesse'
export const interactifReady = true
export const interactifType = 'mathLive'

/**
 * Recherche de la vitesse, du temps ou de la distance en utilisant un tableau de proportionnalité et le produit en croix
 * @author Rémi Angot
 * Référence 5P11-1
*/
export const uuid = 'a29bd'
export const ref = '5P11-1'
export default function VitesseDistanceTemps () {
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.interactifReady = interactifReady
  this.interactifType = interactifType
  this.consigne = ''
  this.nbQuestions = 3
  this.nbCols = 1 // Uniquement pour la sortie LaTeX
  this.nbColsCorr = 1 // Uniquement pour la sortie LaTeX
  this.tailleDiaporama = 3 // Pour les exercices chronométrés. 50 par défaut pour les exercices avec du texte
  this.video = '' // Id YouTube ou url
  this.consigneCorrection = ' À vitesse constante, la distance et le temps du trajet sont proportionnels. On peut donc utiliser la technique du produit en croix.'

  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    this.autoCorrection = []

    const typesDeQuestionsDisponibles = ['vitesse', 'temps', 'distance']
    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions) // Tous les types de questions sont posés mais l'ordre diffère à chaque "cycle"
    for (let i = 0, d, v, t, pronomgenre, prenom, destination, texte, texteCorr, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      // Boucle principale où i+1 correspond au numéro de la question
      v = randint(8, 26, [12]) * 5 // On évite le 60 km/h trop trivial
      if (v % 2 === 0) {
        t = randint(5, 39) * 3
      } else {
        t = randint(2, 19) * 6
      } // On s'assure que le produit v*t est divisible par 6
      d = calcul(v * t / 60)
      pronomgenre = choice(['il', 'elle'])
      if (pronomgenre === 'il') {
        prenom = prenomM()
      } else {
        prenom = prenomF()
      }
      if (d < 60) {
        destination = choice(['à son travail', "à l'école de ses enfants", 'au cinéma', 'au centre de loisirs'])
      } else {
        destination = choice(["jusqu'à sa location de vacances", 'dans la maison de ses parents', 'à une conférence'])
      }
      switch (listeTypeDeQuestions[i]) { // Suivant le type de question, le contenu sera différent
        case 'vitesse':
          texte = `${prenom} met ${minToHour(t)} pour aller ${destination} qui est à une distance de ${nombreAvecEspace(d)} km. Déterminer sa vitesse moyenne.`
          if (context.isHtml) {
            texteCorr = '$\\def\\arraystretch{2.5}\\begin{array}{|l|c|c|}\n'
          } else {
            texteCorr = '$\\begin{array}{|l|c|c|}\n'
          }
          texteCorr += '\\hline\n'
          texteCorr += `\\text{Distance (en km)} & ${texNombre(d)} & v\\\\ \n`
          texteCorr += '\\hline\n'
          texteCorr += `\\text{Temps (en min)} & ${t} & 60 \\\\ \n`
          texteCorr += '\\hline\n'
          texteCorr += '\\end{array}$'
          texteCorr += '<br><br>'
          texteCorr += `$v=\\dfrac{${texNombre(d)}\\times 60}{${t}}=${v}$ \n`
          texteCorr += '<br><br>'
          texteCorr += `Sa vitesse moyenne est de ${v} km/h.`
          setReponse(this, i, v)
          break
        case 'temps':
          texte = `Si ${prenom} roule à ${v} km/h. Combien de temps lui faudra-t-il  pour aller ${destination} qui est à une distance de ${nombreAvecEspace(d)} km ?`
          if (this.interactif && context.isHtml) texte += '<br><em>Donner le nombre de minutes.</em>'
          if (context.isHtml) {
            texteCorr = '$\\def\\arraystretch{2.5}\\begin{array}{|l|c|c|}\n'
          } else {
            texteCorr = '$\\begin{array}{|l|c|c|}\n'
          }
          texteCorr += '\\hline\n'
          texteCorr += `\\text{Distance (en km)} & ${texNombre(d)} & ${v}\\\\ \n`
          texteCorr += '\\hline\n'
          texteCorr += '\\text{Temps (en min)} & t & 60 \\\\ \n'
          texteCorr += '\\hline\n'
          texteCorr += '\\end{array}$'
          texteCorr += '<br><br>'
          texteCorr += `$t=\\dfrac{${texNombre(d)}\\times 60}{${v}}=${t}$ \n`
          texteCorr += '<br><br>'
          texteCorr += `${pronomgenre.charAt(0).toUpperCase() + pronomgenre.slice(1)} mettra ${minToHour(t)} pour aller ${destination}.`
          setReponse(this, i, t)
          break
        case 'distance':
          texte = `${prenom} roule à ${v} km/h de moyenne pendant ${minToHour(t)}. Calculer la distance parcourue.`
          if (context.isHtml) {
            texteCorr = '$\\def\\arraystretch{2.5}\\begin{array}{|l|c|c|}\n'
          } else {
            texteCorr = '$\\begin{array}{|l|c|c|}\n'
          }
          texteCorr += '\\hline\n'
          texteCorr += `\\text{Distance (en km)} & d & ${v}\\\\ \n`
          texteCorr += '\\hline\n'
          texteCorr += `\\text{Temps (en min)} & ${t} & 60 \\\\ \n`
          texteCorr += '\\hline\n'
          texteCorr += '\\end{array}$'
          texteCorr += '<br><br>'
          texteCorr += `$d=\\dfrac{${texNombre(t)}\\times ${v}}{60}=${texNombre(d)}$ \n`
          texteCorr += '<br><br>'
          texteCorr += `${pronomgenre.charAt(0).toUpperCase() + pronomgenre.slice(1)} a donc parcouru ${stringNombre(d)} km.`
          setReponse(this, i, d)
          break
      }
      texte += ajouteChampTexteMathLive(this, i)
      if (this.listeQuestions.indexOf(texte) === -1) {
        // 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 = ['Niveau de difficulté', 3]
}