diff options
Diffstat (limited to 'macros/latex/contrib/profcollege/latex/PfCCibleQOp.tex')
-rw-r--r-- | macros/latex/contrib/profcollege/latex/PfCCibleQOp.tex | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/macros/latex/contrib/profcollege/latex/PfCCibleQOp.tex b/macros/latex/contrib/profcollege/latex/PfCCibleQOp.tex new file mode 100644 index 0000000000..cb5191d25a --- /dev/null +++ b/macros/latex/contrib/profcollege/latex/PfCCibleQOp.tex @@ -0,0 +1,270 @@ +\newcount\anpcqo\newcount\bnpcqo\newcount\cnpcqo% + +\NewDocumentCommand\PfCCQODiviseurs{m}{%#1 : le nombre entier \`a tester + \xdef\RetiensDiviseurs{}% + \xdef\RetiensNonDiviseurs{}% + \anpcqo=#1% + \bnpcqo=2% + \cnpcqo=1% + \whiledo{\bnpcqo<\anpcqo}{% + \modulo{\the\anpcqo}{\the\bnpcqo}{}% + \ifnum\remainder=0\relax + \ifnum\cnpcqo=1 + \xdef\RetiensDiviseurs{\the\bnpcqo}% + \else% + \xdef\RetiensDiviseurs{\RetiensDiviseurs,\the\bnpcqo}% + \fi% + \cnpcqo=\numexpr\cnpcqo+1% + \else + \ifnum\bnpcqo<10 + \xdef\RetiensNonDiviseurs{\RetiensNonDiviseurs,\the\bnpcqo}% + \fi + \fi% + \bnpcqo=\numexpr\bnpcqo+1% + }% +}% + +\newtoks\toklistecibleA% +\newtoks\toklistecibleab% +\newtoks\toklisteciblestyle% + +\def\UpdatetoksCibleQO#1\nil{\addtotok\toklistecibleA{"#1",}}% +\def\UpdatetoksCibleQOO#1\nil{\addtotok\toklistecibleab{"#1",}} +\def\UpdatetoksCibleStyle#1\nil{\addtotok\toklisteciblestyle{"#1"}}%% + +\setKVdefault[CibleQO]{Couleur=Crimson,Rayon=2cm,ValeurMin=4,ValeurMax=10,Graines=false,Solution=false,Cibles=false,DivE=false,Style="<->"}% +\defKV[CibleQO]{Graine=\setKV[CibleQO]{Graines}\PfCGraineAlea{#1}}% +\defKV[CibleQO]{Cible=\setKV[CibleQO]{Cibles}}% +\NewDocumentCommand\CibleQuatreOperations{o}{% + \useKVdefault[CibleQO]% + \setKV[CibleQO]{#1}% + \toklistecibleA{}% + \toklistecibleab{}% + \toklisteciblestyle{}% + \expandafter\UpdatetoksCibleStyle\useKV[CibleQO]{Style}\nil + %Le style vaut :\the\toklisteciblestyle + \colorlet{CouleurCibleQO}{\useKV[CibleQO]{Couleur}}% + % On définit le nombre cible aléatoirement ou fixement. + \ifboolKV[CibleQO]{Cibles}{% + \xdef\PfCCibleQO{\useKV[CibleQO]{Cible}}% + }{% + \ChoixAlea{\useKV[CibleQO]{ValeurMin}}{\useKV[CibleQO]{ValeurMax}}{\PfCCiblePremierFacteur}% + \ChoixAlea{\useKV[CibleQO]{ValeurMin}}{\useKV[CibleQO]{ValeurMax}}{\PfCCibleDeuxiemeFacteur}% + \xdef\PfCCibleQO{\fpeval{\PfCCiblePremierFacteur*\PfCCibleDeuxiemeFacteur}}% + }% + % On définit les opérations : deux additions, deux soustractions, deux "divisions" inversées, deux "divisions" avec éventuellement une division euclidienne. + \PfCCQODiviseurs{\PfCCibleQO}% + \setsepchar{,}% + \readlist*\PfCRetiensDiviseurs{\RetiensDiviseurs}% + \ifnum\PfCRetiensDiviseurslen=1\relax% + \setKV[CibleQO]{DivE}% + \fi + \ifboolKV[CibleQO]{DivE}{% + \xdef\PfCCQOListeOperations{+,+,-,-,*,*,/,d}% + }{% + \xdef\PfCCQOListeOperations{+,+,-,-,*,*,/,/}% + }% + \xdef\PfCCQOListeAdditionUn{2,3,4,5,6,7,8,9}% + \xdef\PfCCQOListeAdditionDeux{10,11,12,13,14,15,16,17,18,19}% + \xdef\PfCCQOListeMultiplication{2,3,5,9,10}% + \xdef\PfCFooQO{\useKV[CibleQO]{ListeOperations}}% + \xdef\PfCFooNombres{}% + \MelangeListe{\PfCCQOListeAdditionUn}{1}% + \xdef\PfCFooNombres{\PfCFooNombres \faa}% + \MelangeListe{\PfCCQOListeAdditionDeux}{1}% + \xdef\PfCFooNombres{\PfCFooNombres \faa}% + \MelangeListe{\PfCCQOListeAdditionUn}{1}% + \xdef\PfCFooNombres{\PfCFooNombres \faa}% + \MelangeListe{\PfCCQOListeAdditionDeux}{1}% + \xdef\PfCFooNombres{\PfCFooNombres \faa}% + \MelangeListe{\PfCCQOListeMultiplication}{2}% + \xdef\PfCFooNombres{\PfCFooNombres \faa}% + \ifnum\PfCRetiensDiviseurslen=1\relax%carré parfait + \xdef\PfCFooNombres{\PfCFooNombres \RetiensDiviseurs,\PfCCibleQO}% + \else% + \ifnum\PfCRetiensDiviseurslen=2\relax% + \xdef\PfCFooNombres{\PfCFooNombres \RetiensDiviseurs}% + \else% + \MelangeListe{\RetiensDiviseurs}{2}% + \xdef\PfCFooNombres{\PfCFooNombres \faa}% + \fi% + \fi% + \MelangeListe{\RetiensNonDiviseurs}{1}% + \ifnum\PfCRetiensDiviseurslen=1\relax% + \xdef\PfCFooNombres{\PfCFooNombres,\faa}% + \else% + \xdef\PfCFooNombres{\PfCFooNombres \faa}% + \fi% + %Les nombres choisis sont \PfCFooNombres\\ + \setsepchar{,}\ignoreemptyitems% + \MelangeListe{1,2,3,4,5,6,7,8}{8}% + \readlist*\PfCOrdreOperations{\faa}% + \readlist*\PfCListeCibleNombres{\PfCFooNombres}% + \readlist*\PfCListeCibleOperations{\PfCCQOListeOperations}% + % On détermine les solutions + \xdef\PfCListeSolution{\fpeval{\PfCCibleQO-\PfCListeCibleNombres[1]}}% + \xdef\PfCListeSolution{\PfCListeSolution,\fpeval{\PfCCibleQO-\PfCListeCibleNombres[2]}}% + \xdef\PfCListeSolution{\PfCListeSolution,\fpeval{\PfCCibleQO+\PfCListeCibleNombres[3]}}% + \xdef\PfCListeSolution{\PfCListeSolution,\fpeval{\PfCCibleQO+\PfCListeCibleNombres[4]}}% + \xdef\PfCListeSolution{\PfCListeSolution,\fpeval{\PfCCibleQO*\PfCListeCibleNombres[5]}}% + \xdef\PfCListeSolution{\PfCListeSolution,\fpeval{\PfCCibleQO*\PfCListeCibleNombres[6]}}% + \xdef\PfCListeSolution{\PfCListeSolution,\fpeval{\PfCCibleQO/\PfCListeCibleNombres[7]}}% + \ifboolKV[CibleQO]{DivE}{% + \xdef\PfCListeSolution{\PfCListeSolution,\fpeval{floor(\PfCCibleQO/\PfCListeCibleNombres[9])}}% + \xdef\PfCListeSolution{\PfCListeSolution,\fpeval{\PfCCibleQO-\PfCListeCibleNombres[9]*floor(\PfCCibleQO/\PfCListeCibleNombres[9])}}% + }{% + \xdef\PfCListeSolution{\PfCListeSolution,\fpeval{\PfCCibleQO/\PfCListeCibleNombres[8]}}% + }% + \readlist*\PfCListeCibleSolutions{\PfCListeSolution}% + \xdef\PfCFooRetiensTout{}% + \xdef\PfCFooRetiensToutAvecSol{}% + \xintFor* ##1 in{\xintSeq{1}{8}}\do{% + \xdef\PfCCibleRang{\PfCOrdreOperations[##1]}% + \xdef\PfCCibleRang{\PfCCibleRang}% + \StrCompare{\PfCListeCibleOperations[\PfCCibleRang]}{*}[\PfCTestEtoile]% + \StrCompare{\PfCListeCibleOperations[\PfCCibleRang]}{/}[\PfCTestSlash]% + \StrCompare{\PfCListeCibleOperations[\PfCCibleRang]}{d}[\PfCTestDE]% + \xintifboolexpr{\PfCTestDE==0}{% + \xdef\PfCFooRetiensTout{\PfCFooRetiensTout,$\pointilles[5mm]\times\num{\PfCListeCibleNombres[9]}+\num{\PfCListeCibleSolutions[9]}$}% + \xdef\PfCFooRetiensToutAvecSol{\PfCFooRetiensToutAvecSol,$\mathcolor{CouleurCibleQO}{\num{\PfCListeCibleSolutions[8]}}\times\num{\PfCListeCibleNombres[9]}+\num{\PfCListeCibleSolutions[9]}$}% + }{% + \xdef\PfCFooRetiensTout{\PfCFooRetiensTout,$\pointilles[5mm]\xintifboolexpr{\PfCTestEtoile==0}{\div}{\xintifboolexpr{\PfCTestSlash==0}{\times}{\PfCListeCibleOperations[\PfCCibleRang]}}\num{\PfCListeCibleNombres[\PfCCibleRang]}$}% + \xdef\PfCFooRetiensToutAvecSol{\PfCFooRetiensToutAvecSol,$\mathcolor{CouleurCibleQO}{\num{\PfCListeCibleSolutions[\PfCCibleRang]}}\xintifboolexpr{\PfCTestEtoile==0}{\div}{\xintifboolexpr{\PfCTestSlash==0}{\times}{\PfCListeCibleOperations[\PfCCibleRang]}}\num{\PfCListeCibleNombres[\PfCCibleRang]}$}% + }% + }% + \setsepchar{,}\ignoreemptyitems% + \readlist*\PfCCibleQOListeEnonce{\PfCFooRetiensTout}% + \readlist*\PfCCibleQOListeSolution{\PfCFooRetiensToutAvecSol}% + \foreachitem\compteur\in\PfCCibleQOListeEnonce{\expandafter\UpdatetoksCibleQO\compteur\nil}% + \foreachitem\compteur\in\PfCCibleQOListeSolution{\expandafter\UpdatetoksCibleQOO\compteur\nil}% + \BuildCibleQuatreOperations{\PfCCibleQO}{\the\toklistecibleA}{\the\toklistecibleab}{\useKV[CibleQO]{Style}}% +}% + +\def\BuildCibleQOCode{% + vardef LectureOperations(text t)= + nbop:=0; + for p_=t: + Op[nbop]=image( + label(TEX(p_),(0,0)); + ); + nbop:=nbop+1; + endfor; + enddef; + % + vardef LectureOperationsPDF(text t)= + nbop:=0; + for p_=t: + Op[nbop]=image( + label(LATEX(p_),(0,0)); + ); + nbop:=nbop+1; + endfor; + enddef; + % + vardef MelangeListe= + for k=0 upto 7: + x[k]=k; + endfor; + nbtest=7; + for k=0 upto 7: + ll:=floor(uniformdeviate(8-k)); + y[k]=x[ll]; + nb:=0; + for l=0 upto (7-k): + if l<>ll: + x[nb]:=x[l]; + nb:=nb+1; + fi; + endfor; + endfor; + enddef; +}% + +\NewDocumentCommand\BuildCibleQuatreOperations{mmmm}{% + \ifluatex + \mplibforcehmode + \begin{mplibcode} + \BuildCibleQOCode + string Style; + Style=#4; + + Cible=#1; + + picture Op[]; + + Rayon:=\useKV[CibleQO]{Rayon}; + boolean Solution; + Solution=\useKV[CibleQO]{Solution}; + + if Solution: + LectureOperations(#3) + else: + LectureOperations(#2) + fi; + + path cc; + pair O,A[]; + O=(0,0); + picture CIBLE; + CIBLE=image(label(TEX("\Huge\bfseries"&decimal(Cible)),O)); + draw CIBLE; + cc=cercles(O,Rayon); + path Fleche; + for k=0 upto 7: + A[k]=1.1[O,pointarc(cc,k*45)]; + Fleche:=((0,0)--(center Op[k] shifted A[k])) cutbefore cercles(O,0.45*Rayon) cutafter (polygone(llcorner Op[k],lrcorner Op[k],urcorner Op[k],ulcorner Op[k]) shifted A[k]); + if Style="<->": + drawdblarrow (point(0.75*length Fleche) of Fleche)--(point(0) of Fleche); + elseif Style="<-": + drawarrow (point(0.75*length Fleche) of Fleche)--(point(0) of Fleche); + elseif Style="->": + drawarrow (point(0) of Fleche)--(point(0.75*length Fleche) of Fleche); + elseif Style="-": + draw (point(0) of Fleche)--(point(0.75*length Fleche) of Fleche); + elseif Style="--": + label(TEX("$=$") rotated (k*45) ,point(0.5*length Fleche) of Fleche); + fi; + trace Op[k] shifted A[k]; + endfor; + \end{mplibcode} + \else + \begin{mpost}[mpsettings={\BuildCibleQOCode;Rayon:=\useKV[CibleQO]{Rayon};boolean Solution;Solution=\useKV[CibleQO]{Solution};}] + string Style; + Style=#4; + Cible=#1; + + picture Op[]; + + if Solution: + LectureOperationsPDF(#3) + else: + LectureOperationsPDF(#2) + fi; + + path cc; + pair O,A[]; + O=(0,0); + picture CIBLE; + CIBLE=image(label(LATEX("\Huge\bfseries"&decimal(Cible)),O)); + draw CIBLE; + cc=cercles(O,Rayon); + path Fleche; + for k=0 upto 7: + A[k]=1.1[O,pointarc(cc,k*45)]; + Fleche:=((0,0)--(center Op[k] shifted A[k])) cutbefore cercles(O,0.45*Rayon) cutafter (polygone(llcorner Op[k],lrcorner Op[k],urcorner Op[k],ulcorner Op[k]) shifted A[k]); + if Style="<->": + drawdblarrow (point(0.75*length Fleche) of Fleche)--(point(0) of Fleche); + elseif Style="<-": + drawarrow (point(0.75*length Fleche) of Fleche)--(point(0) of Fleche); + elseif Style="->": + drawarrow (point(0) of Fleche)--(point(0.75*length Fleche) of Fleche); + elseif Style="-": + draw (point(0) of Fleche)--(point(0.75*length Fleche) of Fleche); + elseif Style="--": + label(LATEX("$=$") rotated (k*45) ,point(0.5*length Fleche) of Fleche); + fi; + trace Op[k] shifted A[k]; + endfor; + \end{mpost} + \fi% +}% |