import Exercice from '../Exercice.js'
import { listeQuestionsToContenu, combinaisonListes, contraindreValeur, compteOccurences, rangeMinMax, randint, texNombre } from '../../modules/outils.js'
import Decimal from 'decimal.js'
import { fraction } from '../../modules/fractions.js'
import { context } from '../../modules/context.js'
import { ajouteChampTexteMathLive } from '../../modules/interactif/questionMathLive.js'
import { setReponse } from '../../modules/gestionInteractif.js'
export const titre = 'Convertir des grandeurs composées'
export const interactifReady = true
export const interactifType = 'mathLive'
export const dateDePublication = '23/05/2022'
/**
* @author Guillaume Valmont
* Référence 4P16
*/
export const uuid = '63cdb'
export const ref = '4P16'
export default class NomExercice extends Exercice {
constructor () {
super()
this.besoinFormulaireTexte = ['Choix des problèmes', 'Nombres séparés par des tirets\n1 : m/h\n2 : m³/h\n3 : L/h\n4 : L/m²\n5 : m²/h\n6 : Wh\n7 : VA\n8 : Mélange']
this.sup = '8'
this.titre = titre
}
nouvelleVersion (numeroExercice) {
this.listeQuestions = []
this.listeCorrections = []
this.autoCorrection = []
let listeDesProblemes = [1, 2, 3, 4, 5, 6, 7] // Paramétrage par défaut
const valMaxParametre = 8
if (this.sup) { // Si une liste est saisie
if (this.sup.toString().indexOf('-') === -1) { // S'il n'y a pas de tiret ...
listeDesProblemes = [contraindreValeur(1, valMaxParametre, parseInt(this.sup), 1)] // ... on crée un tableau avec une seule valeur
} else {
listeDesProblemes = this.sup.split('-')// Sinon on créé un tableau à partir des valeurs séparées par des -
for (let i = 0; i < listeDesProblemes.length; i++) { // on parcourt notre tableau de strings : ['1', '1', '2'] ...
listeDesProblemes[i] = contraindreValeur(1, valMaxParametre, parseInt(listeDesProblemes[i]), 1) // ... pour en faire un tableau d'entiers : [1, 1, 2]
}
}
}
// Attention ! Si la valeur max du paramètre n'est pas une option de type "mélange", supprimer la ligne ci-dessous !
if (compteOccurences(listeDesProblemes, valMaxParametre) > 0) listeDesProblemes = rangeMinMax(1, valMaxParametre - 1) // Si l'utilisateur a choisi l'option "mélange", on fait une liste avec un de chaque
listeDesProblemes = combinaisonListes(listeDesProblemes, this.nbQuestions)
const unitesLongueur = [
{
unite: 'mm',
coef: 1
},
{
unite: 'cm',
coef: 10 ** 1
},
{
unite: 'dm',
coef: 10 ** 2
},
{
unite: 'm',
coef: 10 ** 3
},
{
unite: 'dam',
coef: 10 ** 4
},
{
unite: 'hm',
coef: 10 ** 5
},
{
unite: 'km',
coef: 10 ** 6
}
]
const unitesSurface = [
{
unite: 'mm²',
coef: 1
},
{
unite: 'cm²',
coef: 10 ** 2
},
{
unite: 'dm²',
coef: 10 ** 4
},
{
unite: 'm²',
coef: 10 ** 6
},
{
unite: 'dam²',
coef: 10 ** 8
},
{
unite: 'hm²',
coef: 10 ** 10
},
{
unite: 'km²',
coef: 10 ** 12
}
]
const unitesVolume = [
{
unite: 'mm³',
coef: 1
},
{
unite: 'cm³',
coef: 10 ** 3
},
{
unite: 'dm³',
coef: 10 ** 6
},
{
unite: 'm³',
coef: 10 ** 9
}
]
const unitesContenance = [
{
unite: 'mL',
coef: 1
},
{
unite: 'cL',
coef: 10 ** 1
},
{
unite: 'dL',
coef: 10 ** 2
},
{
unite: 'L',
coef: 10 ** 3
}
]
const unitesTemps = [
{
unite: 's',
coef: 1
},
{
unite: 'min',
coef: 60
},
{
unite: 'h',
coef: 3600
}
]
const unitesPuissance = [
{
unite: 'mW',
coef: 1
},
{
unite: 'W',
coef: 10 ** 3
},
{
unite: 'kW',
coef: 10 ** 6
}
]
const unitesTension = [
{
unite: 'mV',
coef: 1
},
{
unite: 'V',
coef: 10 ** 3
},
{
unite: 'kV',
coef: 10 ** 6
}
]
const unitesIntensite = [
{
unite: 'mA',
coef: 1
},
{
unite: 'A',
coef: 10 ** 3
}
]
let unite1Depart, unite2Depart, unite1Arrivee, unite2Arrivee, valeurDepart, valeurArrivee
function fixeUnites (unite1, unite2) {
const index1Depart = randint(0, unite1.length - 1)
const index2Depart = randint(0, unite2.length - 1)
const index1Arrivee = randint(0, unite1.length - 1, [index1Depart])
const index2Arrivee = randint(0, unite2.length - 1, [index2Depart])
unite1Depart = unite1[index1Depart]
unite2Depart = unite2[index2Depart]
unite1Arrivee = unite1[index1Arrivee]
unite2Arrivee = unite2[index2Arrivee]
}
for (let i = 0, texte, texteCorr, typeDeComposition, operateur, cfrac, times, cpt = 0; i < this.nbQuestions && cpt < 50;) {
valeurDepart = randint(1, 80) * 9 // Comme ça même si on doit diviser par 3600 le résultat restera décimal
typeDeComposition = 'quotient'
if (listeDesProblemes[i] === 1) { // Vitesse
fixeUnites(unitesLongueur, unitesTemps)
} else if (listeDesProblemes[i] === 2) { // Débit (m³)
fixeUnites(unitesVolume, unitesTemps)
} else if (listeDesProblemes[i] === 3) { // Débit (L)
fixeUnites(unitesContenance, unitesTemps)
} else if (listeDesProblemes[i] === 4) { // L/m²
fixeUnites(unitesContenance, unitesSurface)
} else if (listeDesProblemes[i] === 5) { // m²/h
fixeUnites(unitesSurface, unitesTemps)
} else if (listeDesProblemes[i] === 6) { // Wh
typeDeComposition = 'produit'
fixeUnites(unitesPuissance, unitesTemps)
} else if (listeDesProblemes[i] === 7) { // VA
typeDeComposition = 'produit'
fixeUnites(unitesTension, unitesIntensite)
} else {
window.notify('listeDesProblemes[i] a une valeur inattendue.\nPeut-être que valMaxParametre est incorrect ?')
}
const coef1 = new Decimal(unite1Depart.coef).div(unite1Arrivee.coef)
const coef2 = new Decimal(unite2Depart.coef).div(unite2Arrivee.coef)
valeurArrivee = new Decimal(valeurDepart).times(coef1)
if (typeDeComposition === 'quotient') {
operateur = '/'
cfrac = ' \\cfrac '
times = ''
valeurArrivee = valeurArrivee.div(coef2)
} else {
operateur = '.'
cfrac = ''
times = ' \\times '
valeurArrivee = valeurArrivee.times(coef2)
}
texte = `Convertir $${valeurDepart}$ ${unite1Depart.unite}${operateur}${unite2Depart.unite} en ${unite1Arrivee.unite}${operateur}${unite2Arrivee.unite}.`
texteCorr = `$${valeurDepart}\\text{ ${unite1Depart.unite}${operateur}${unite2Depart.unite}}
= ${cfrac}{${valeurDepart}\\text{ ${unite1Depart.unite}}}${times}{1 \\text{ ${unite2Depart.unite}}}
= ${cfrac}{${valeurDepart} \\times ${fraction(unite1Depart.coef, unite1Arrivee.coef).texFractionSimplifiee} \\text{ ${unite1Arrivee.unite}}}
${times}{${fraction(unite2Depart.coef, unite2Arrivee.coef).texFractionSimplifiee} \\text{ ${unite2Arrivee.unite}}}
= ${texNombre(valeurArrivee)}\\text{ ${unite1Arrivee.unite}${operateur}${unite2Arrivee.unite}}$`
if (this.interactif && context.isHtml) {
setReponse(this, i, valeurArrivee)
texte += `<br> $${valeurDepart}$ ${unite1Depart.unite}${operateur}${unite2Depart.unite} = `
texte += ajouteChampTexteMathLive(this, i, 'inline', { tailleExtensible: true })
texte += ` ${unite1Arrivee.unite}${operateur}${unite2Arrivee.unite}`
}
if (this.questionJamaisPosee(i, texte)) {
this.listeQuestions.push(texte)
this.listeCorrections.push(texteCorr)
i++
}
cpt++
}
listeQuestionsToContenu(this)
}
}