exercices/PE/PEA11-1.js

import Exercice from '../Exercice.js'
import { context } from '../../modules/context.js'
import { listeQuestionsToContenu, randint, choice, combinaisonListes, valeurBase, texNombre, nombreAvecEspace, miseEnEvidence } from '../../modules/outils.js'
export const titre = 'Passer de la base 12 ou 16 à la base 10 et inversement'

/**
* Passer d'une écriture en base 10 à l'écriture dans une autre base ou inversement
* référence PEA11-1
* * Convertir en base 10
* * Convertir vers une base entre 2 et 7
* * Trouver le plus grand nombre à 3 ou 4 chiffres d'une base ainsi que son successeur et le convertir en base 10 ou le plus petit et son prédecesseur
*
* @author Rémi Angot
*/
export const uuid = 'a24a6'
export const ref = 'PEA11-1'
export default function PasserDeLaBase12Ou16ALaBase10 () {
  'use strict'
  Exercice.call(this) // Héritage de la classe Exercice()
  this.titre = titre
  this.consigne = ''
  this.nbQuestions = 3
  this.nbCols = 1
  this.nbColsCorr = 1
  this.spacing = 1
  context.isHtml ? this.spacingCorr = 2 : this.spacingCorr = 1

  this.nouvelleVersion = function () {
    this.listeQuestions = [] // Liste de questions
    this.listeCorrections = [] // Liste de questions corrigées
    const typesDeQuestionsDisponibles = ['vers_base_10', 'vers_base_n_3_chiffres']
    if (this.nbQuestions === 3) {
      typesDeQuestionsDisponibles.push(choice(['vers_base_n_4_chiffres', 'plus_grand_4_chiffres', 'plus_petit_4_chiffres', 'plus_petit_3_chiffres']))
    }

    const listeTypeDeQuestions = combinaisonListes(typesDeQuestionsDisponibles, this.nbQuestions) // Tous les types de questions sont posées mais l'ordre diffère à chaque "cycle"
    const b = choice([12, 16])
    if (b === 12) {
      this.introduction = 'Les symboles que l\'on utilise en base 12 sont les dix chiffres habituels, la lettre A pour désigner 10 unités et la lettre B pour désigner 11 unités.'
    } else {
      this.introduction = 'Les symboles que l\'on utilise en base 16 sont les dix chiffres habituels, la lettre A pour désigner 10 unités, B pour 11 unités, C pour 12 unités, D pour 13 unités, '
      this.introduction += 'E pour 14 unités et F pour 15 unités.'
    }
    for (let i = 0, texte, texteCorr, n, m, chiffre1, chiffre2, chiffre3, chiffre4, cpt = 0; i < this.nbQuestions && cpt < 50;) {
      switch (listeTypeDeQuestions[i]) {
        case 'vers_base_10':
          if (b === 12) {
            n = choice([choice(['A', 'B']) + randint(0, 9), randint(1, 9) + choice(['A', 'B']), choice(['A', 'B']) + choice(['A', 'B'])])
            m = choice(['A', 'B', randint(1, 9)]) + choice(['A', 'B', randint(0, 9)]) + choice(['A', 'B', randint(0, 9)]) + choice(['A', 'B', randint(0, 9)])
          }
          if (b === 16) {
            n = choice(['A', 'B', 'C', 'D', 'E', 'F', randint(1, 9).toString()]) + choice(['A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
            m = choice(['A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']) + choice(['A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']) + choice(['A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
          }
          texte = `Les nombre $(${n})_{${b}}$ et $(${m})_{${b}}$ sont écrits en base ${b}. Donner leur écriture en base 10.`
          texteCorr = `$(${n})_{${b}}=${valeurBase(n.toString()[0])}\\times${b}+${valeurBase(n.toString()[1])}=${texNombre(parseInt(n, b))}$`
          if (b === 12) { // m est un nombre à 4 chiffres
            texteCorr += `<br>$(${m})_{${b}}=${valeurBase(m.toString()[0])}\\times${b}^3+${valeurBase(m.toString()[1])}\\times${b}^2+${valeurBase(m.toString()[2])}\\times${b}+${valeurBase(m.toString()[3])}=${texNombre(parseInt(m, b))}$`
          } else { // m est un nombre à 3 chiffres
            texteCorr += `<br>$(${m})_{${b}}=${valeurBase(m.toString()[0])}\\times${b}^2+${valeurBase(m.toString()[1])}\\times${b}+${valeurBase(m.toString()[2])}=${texNombre(parseInt(m, b))}$`
          }
          break
        case 'vers_base_n_3_chiffres':
          if (b === 12) {
            chiffre1 = choice(['A', 'B', randint(1, 9).toString()])
            chiffre2 = choice(['A', 'B', randint(0, 9).toString()])
            chiffre3 = choice(['A', 'B', randint(1, 9).toString()])
          } else {
            chiffre1 = choice(['A', 'B', 'C', 'D', 'E', 'F', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
            chiffre2 = choice(['A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
            chiffre3 = choice(['A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
          }
          n = valeurBase(chiffre1) * b ** 2 + valeurBase(chiffre2) * b + valeurBase(chiffre3)
          texte = `Écrire en base ${b} le nombre ${nombreAvecEspace(n)}.`
          texteCorr = `$${texNombre(n)}=${b}\\times${Math.floor(n / b)}+${miseEnEvidence(n % b)}$`
          texteCorr += `<br>$${Math.floor(n / b)}=${b}\\times${miseEnEvidence(valeurBase(chiffre1))}+${miseEnEvidence(valeurBase(chiffre2))}$`
          texteCorr += `<br> Finalement $${texNombre(n)}=(${chiffre1}${chiffre2}${chiffre3})_{${b}}$`
          break
        case 'vers_base_n_4_chiffres':
          if (b === 12) {
            chiffre1 = choice(['A', 'B', randint(1, 9).toString()])
            chiffre2 = choice(['A', 'B', randint(0, 9).toString()])
            chiffre3 = choice(['A', 'B', randint(1, 9).toString()])
            chiffre4 = choice(['A', 'B', randint(1, 9).toString()])
          } else {
            chiffre1 = choice(['A', 'B', 'C', 'D', 'E', 'F', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
            chiffre2 = choice(['A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
            chiffre3 = choice(['A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
            chiffre4 = choice(['A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
          }
          n = valeurBase(chiffre1) * b ** 3 + valeurBase(chiffre2) * b ** 2 + valeurBase(chiffre3) * b + valeurBase(chiffre4)
          texte = `Écrire en base ${b} le nombre ${nombreAvecEspace(n)}.`
          texteCorr = `$${texNombre(n)}=${b}\\times${Math.floor(n / b)}+${miseEnEvidence(n % b)}$`
          texteCorr += `<br>$${texNombre(Math.floor(n / b))}=${b}\\times${Math.floor(Math.floor(n / b) / b)}+${miseEnEvidence(Math.floor(n / b) % b)}$`
          texteCorr += `<br>$${texNombre(Math.floor(Math.floor(n / b) / b))}=${b}\\times${miseEnEvidence(valeurBase(chiffre1))}+${miseEnEvidence(valeurBase(chiffre2))}$`
          texteCorr += `<br> Finalement $${texNombre(n)}=(${chiffre1}${chiffre2}${chiffre3}${chiffre4})_{${b}}$`
          break
        case 'plus_grand_4_chiffres':
          texte = `Quel est le plus grand nombre à 4 chiffres que l'on peut écrire en base ${b}.`
          texte += `<br>Comment s'écrit son successeur immédiat en base ${b} ? En déduire l'écriture en base 10 de ces 2 nombres.`
          if (b === 12) {
            texteCorr = `En base ${b} le plus grand chiffre est $B$`
            texteCorr += ` donc le plus grand nombre à 4 chiffres est $(BBBB)_{${b}}$ et son successeur immédiat est $(10000)_{${b}}$.`
            texteCorr += `<br> $(10000)_{${b}}=1\\times${b}^4=${texNombre(b ** 4)}$ donc $(BBBB)_{${b}}=${b ** 4}-1=${texNombre(b ** 4 - 1)}$.`
          } else {
            texteCorr = `En base ${b} le plus grand chiffre est $F$`
            texteCorr += ` donc le plus grand nombre à 4 chiffres est $(FFFF)_{${b}}$ et son successeur immédiat est $(10000)_{${b}}$.`
            texteCorr += `<br> $(10000)_{${b}}=1\\times${b}^4=${texNombre(b ** 4)}$ donc $(FFFF)_{${b}}=${b ** 4}-1=${texNombre(b ** 4 - 1)}$.`
          }
          break
        case 'plus_grand_3_chiffres':
          texte = `Quel est le plus grand nombre à 3 chiffres que l'on peut écrire en base ${b}.`
          texte += `<br>Comment s'écrit son successeur immédiat en base ${b} ? En déduire l'écriture en base 10 de ces 2 nombres.`
          if (b === 12) {
            texteCorr = `En base ${b} le plus grand chiffre est $B$`
            texteCorr += ` donc le plus grand nombre à 3 chiffres est $(BBB)_{${b}}$ et son successeur immédiat est $(1000)_{${b}}$.`
            texteCorr += `<br> $(1000)_{${b}}=1\\times${b}^3=${texNombre(b ** 3)}$ donc $(BBB)_{${b}}=${b ** 3}-1=${texNombre(b ** 3 - 1)}$.`
          } else {
            texteCorr = `En base ${b} le plus grand chiffre est $F$`
            texteCorr += ` donc le plus grand nombre à 3 chiffres est $(FFF)_{${b}}$ et son successeur immédiat est $(1000)_{${b}}$.`
            texteCorr += `<br> $(1000)_{${b}}=1\\times${b}^3=${texNombre(b ** 3)}$ donc $(FFF)_{${b}}=${b ** 3}-1=${texNombre(b ** 3 - 1)}$.`
          }
          break
        case 'plus_petit_4_chiffres':
          texte = `Quel est le plus petit nombre à 4 chiffres que l'on peut écrire en base ${b}.`
          texte += `<br>Comment s'écrit son prédécesseur immédiat en base ${b} ? En déduire l'écriture en base 10 de ces 2 nombres.`
          if (b === 12) {
            texteCorr = `En base ${b} le plus petit chiffre est $0$ et le plus grand chiffre est $B$`
            texteCorr += ` donc le plus petit nombre à 4 chiffres est $(1000)_{${b}}$ et son prédécesseur immédiat est $(BBB)_{${b}}$.`
            texteCorr += `<br> $(1000)_{${b}}=1\\times${b}^3=${texNombre(b ** 3)}$ donc $(BBB)_{${b}}=${b ** 3}-1=${texNombre(b ** 3 - 1)}$.`
          } else {
            texteCorr = `En base ${b} le plus petit chiffre est $0$ et le plus grand chiffre est $F$`
            texteCorr += ` donc le plus petit nombre à 4 chiffres est $(1000)_{${b}}$ et son prédécesseur immédiat est $(FFF)_{${b}}$.`
            texteCorr += `<br> $(1000)_{${b}}=1\\times${b}^3=${texNombre(b ** 3)}$ donc $(FFF)_{${b}}=${b ** 3}-1=${texNombre(b ** 3 - 1)}$.`
          }
          break
        case 'plus_petit_3_chiffres':
          texte = `Quel est le plus petit nombre à 3 chiffres que l'on peut écrire en base ${b}.`
          texte += `<br>Comment s'écrit son prédécesseur immédiat en base ${b} ? En déduire l'écriture en base 10 de ces 2 nombres.`
          if (b === 12) {
            texteCorr = `En base ${b} le plus petit chiffre est $0$ et le plus grand chiffre est $B$`
            texteCorr += ` donc le plus petit nombre à 3 chiffres est $(100)_{${b}}$ et son prédécesseur immédiat est $(BB)_{${b}}$.`
            texteCorr += `<br> $(100)_{${b}}=1\\times${b}^2=${texNombre(b ** 2)}$ donc $(BB)_{${b}}=${b ** 2}-1=${texNombre(b ** 2 - 1)}$.`
          } else {
            texteCorr = `En base ${b} le plus petit chiffre est $0$ et le plus grand chiffre est $F$`
            texteCorr += ` donc le plus petit nombre à 3 chiffres est $(100)_{${b}}$ et son prédécesseur immédiat est $(FF)_{${b}}$.`
            texteCorr += `<br> $(100)_{${b}}=1\\times${b}^2=${texNombre(b ** 2)}$ donc $(FF)_{${b}}=${b ** 2}-1=${texNombre(b ** 2 - 1)}$.`
          }
          break
      }
      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++
    }
    listeQuestionsToContenu(this)
  }
}