%%% % Cible 4 opérations %%% \def\filedateCibleQOp{2025/05/26}% \def\fileversionCibleQOp{0.1a}% \message{-- \filedateCibleQOp\space v\fileversionCibleQOp}% \setKVdefault[CibleQO]{Couleur={},Rayon=2cm,ValeurMin=4,ValeurMax=10,Solution=false,DivE=false,Style="<->",Graine={},Cible={},Operations={}}% \ExplSyntaxOn \NewDocumentCommand\PfCCQODiviseurs{m}{% % #1 nombre donné % La liste \RetiensDiviseurs stocke les diviseurs % La liste \RetiensNonDiviseurs stocke les non diviseurs inférieurs à 10. \clist_clear:N \l_tmpa_clist \clist_clear:N \l_tmpb_clist \seq_clear:N \l_tmpa_seq \seq_clear:N \l_tmpb_seq \int_step_inline:nnn {2} {\fpeval{ceil(#1/2)}} {% \int_compare:nNnTF {\int_mod:nn {#1} {##1}} = {0} {% \seq_put_right:Ne \l_tmpa_seq {##1} } {\int_compare:nNnT {##1} < {10} {\seq_put_right:Ne \l_tmpb_seq {##1}}} }% \clist_set_from_seq:NN \l_tmpa_clist \l_tmpa_seq \clist_set_from_seq:NN \l_tmpb_clist \l_tmpb_seq \edef\RetiensDiviseurs{\clist_use:N \l_tmpa_clist} \edef\RetiensNonDiviseurs{\clist_use:N \l_tmpb_clist} } \ExplSyntaxOff \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"}}%% % \NewDocumentCommand\CibleQuatreOperations{o}{% \useKVdefault[CibleQO]% \setKV[CibleQO]{#1}% \ifemptyKV[CibleQO]{Graine}{}{\PfCGraineAlea{\useKV[CibleQO]{Graine}}}% \toklistecibleA{}% \toklistecibleab{}% \toklisteciblestyle{}% \expandafter\UpdatetoksCibleStyle\useKV[CibleQO]{Style}\nil% % Le style vaut :\the\toklisteciblestyle \ifemptyKV[CibleQO]{Couleur}{\colorlet{CouleurCibleQO}{Crimson}}{\setKV[CibleQO]{Solution}\colorlet{CouleurCibleQO}{\useKV[CibleQO]{Couleur}}}% % On définit le nombre cible aléatoirement ou fixement. \ifemptyKV[CibleQO]{Cible}{% \ChoixAlea{\useKV[CibleQO]{ValeurMin}}{\useKV[CibleQO]{ValeurMax}}{\PfCCiblePremierFacteur}% \ChoixAlea{\useKV[CibleQO]{ValeurMin}}{\useKV[CibleQO]{ValeurMax}}{\PfCCibleDeuxiemeFacteur}% \edef\PfCCibleQO{\fpeval{\PfCCiblePremierFacteur*\PfCCibleDeuxiemeFacteur}}% }{% \edef\PfCCibleQO{\useKV[CibleQO]{Cible}}% }% % On définit les opérations : deux additions, deux soustractions, deux "divisions" inversées, deux "divisions" avec éventuellement une division euclidienne. \PfCCQODiviseurs{\PfCCibleQO}% \setsepchar{,}\ignoreemptyitems% \readlist*\PfCRetiensDiviseurs{\RetiensDiviseurs}% \reademptyitems% \ifemptyKV[CibleQO]{Operations}{% %% Il y a \PfCRetiensDiviseurslen{} diviseurs. \ifnum\PfCRetiensDiviseurslen=1\relax% \setKV[CibleQO]{DivE}% \fi% \ifboolKV[CibleQO]{DivE}{% \edef\PfCCQOListeOperations{+,+,-,-,*,*,/,d}% }{% \edef\PfCCQOListeOperations{+,+,-,-,*,*,/,/}% }% \edef\PfCCQOListeAddition{2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}% \edef\PfCCQOListeMultiplication{2,3,4,5,6,7,8,9,10}% \edef\PfCFooNombres{}% \MelangeListe{\PfCCQOListeAddition}{4}% \edef\PfCFooNombres{\PfCFooNombres,\faa}% \MelangeListe{\PfCCQOListeMultiplication}{2}% \edef\PfCFooNombres{\PfCFooNombres,\faa}% \ifnum\PfCRetiensDiviseurslen=1\relax%carré parfait \edef\PfCFooNombres{\PfCFooNombres,\RetiensDiviseurs}% \MelangeListe{\RetiensNonDiviseurs}{1}% \edef\PfCFooNombres{\PfCFooNombres,\faa}% \else% \MelangeListe{\RetiensDiviseurs}{2}% \edef\PfCFooNombres{\PfCFooNombres,\faa}% \fi% % % Les nombres choisis sont \PfCFooNombres\\ \MelangeListe{1,2,3,4,5,6,7,8}{8}% \setsepchar{,}\ignoreemptyitems% \readlist*\PfCOrdreOperations{\faa}% \readlist*\PfCListeCibleNombres{\PfCFooNombres}% \readlist*\PfCListeCibleOperations{\PfCCQOListeOperations}% \reademptyitems% % On détermine les solutions \edef\PfCListeSolution{\fpeval{\PfCCibleQO-\PfCListeCibleNombres[1]},% \fpeval{\PfCCibleQO-\PfCListeCibleNombres[2]},% \fpeval{\PfCCibleQO+\PfCListeCibleNombres[3]},% \fpeval{\PfCCibleQO+\PfCListeCibleNombres[4]},% \fpeval{\PfCCibleQO*\PfCListeCibleNombres[5]},% \fpeval{\PfCCibleQO*\PfCListeCibleNombres[6]},% \fpeval{\PfCCibleQO/\PfCListeCibleNombres[7]}% }% \ifboolKV[CibleQO]{DivE}{% \edef\PfCListeSolution{\PfCListeSolution,\fpeval{floor(\PfCCibleQO/\PfCListeCibleNombres[8])}}% }{% \edef\PfCListeSolution{\PfCListeSolution,\fpeval{\PfCCibleQO/\PfCListeCibleNombres[8]}}% }% \setsepchar{,}\ignoreemptyitems% \readlist*\PfCListeCibleSolutions{\PfCListeSolution}% \reademptyitems% \edef\PfCFooRetiensTout{}% \edef\PfCFooRetiensToutAvecSol{}% \xintFor* ##1 in{\xintSeq{1}{8}}\do{% \edef\PfCCibleRang{\PfCOrdreOperations[##1]}% \edef\PfCCibleRang{\PfCCibleRang}% \StrCompare{\PfCListeCibleOperations[\PfCCibleRang]}{*}[\PfCTestEtoile]% \StrCompare{\PfCListeCibleOperations[\PfCCibleRang]}{/}[\PfCTestSlash]% \StrCompare{\PfCListeCibleOperations[\PfCCibleRang]}{d}[\PfCTestDE]% \xintifboolexpr{\PfCTestDE==0}{% \quotient{\PfCCibleQO}{\PfCListeCibleNombres[8]}% \modulo{\PfCCibleQO}{\PfCListeCibleNombres[8]}% \edef\PfCFooRetiensTout{\PfCFooRetiensTout,$\pointilles[5mm]\PfCSymbolTimes\num{\PfCListeCibleNombres[8]}\ifnum\remainder>0\relax+\num{\the\remainder}\fi$}% \edef\PfCFooRetiensToutAvecSol{\PfCFooRetiensToutAvecSol,$\mathcolor{CouleurCibleQO}{\num{\the\intquotient}}\PfCSymbolTimes\num{\PfCListeCibleNombres[8]}\ifnum\remainder>0\relax+\num{\the\remainder}\fi$}% }{% \edef\PfCFooRetiensTout{\PfCFooRetiensTout,$\pointilles[5mm]\xintifboolexpr{\PfCTestEtoile==0}{\PfCSymbolDiv}{\xintifboolexpr{\PfCTestSlash==0}{\PfCSymbolTimes}{\PfCListeCibleOperations[\PfCCibleRang]}}\num{\PfCListeCibleNombres[\PfCCibleRang]}$}% \edef\PfCFooRetiensToutAvecSol{\PfCFooRetiensToutAvecSol,$\mathcolor{CouleurCibleQO}{\num{\PfCListeCibleSolutions[\PfCCibleRang]}}\xintifboolexpr{\PfCTestEtoile==0}{\PfCSymbolDiv}{\xintifboolexpr{\PfCTestSlash==0}{\PfCSymbolTimes}{\PfCListeCibleOperations[\PfCCibleRang]}}\num{\PfCListeCibleNombres[\PfCCibleRang]}$}% }% }% }{% Les opérations sont données par l'utilisateur \edef\PfCOperationsListees{\useKV[CibleQO]{Operations}}% % ListeOperations : \PfCOperationsListees\par \setsepchar{,}\ignoreemptyitems% \readlist*\PfCListeOperationsTestees{\PfCOperationsListees}% \reademptyitems% \ifnum\PfCListeOperationsTesteeslen<13\relax% \ifnum\PfCListeOperationsTesteeslen>9\relax\setKV[CibleQO]{Rayon=3cm}\fi% \StrCount{\PfCOperationsListees}{+}[\PfCNbAdd]% %Il y a \num{\PfCNbAdd}~additions\par \StrCount{\PfCOperationsListees}{-}[\PfCNbSous]% \StrCount{\PfCOperationsListees}{*}[\PfCNbMul]% \StrCount{\PfCOperationsListees}{/}[\PfCNbDiv]% \edef\PfCOperationsRetenues{}% \edef\PfCNombresRetenus{}% \edef\PfCSolutionsRetenues{}% \ifnum\PfCNbAdd>0\relax% \xintFor* ##1 in{\xintSeq{1}{\PfCNbAdd}}\do{% \edef\PfCOperationsRetenues{\PfCOperationsRetenues,+}% }% \PfCChoixAleaMultiMix{\PfCNbAdd}{1}{\fpeval{\PfCCibleQO-1}}{0}{\NbAddAv}% \edef\PfCNombresRetenus{\PfCNombresRetenus,\NbAddAv}% \fi% \ifnum\PfCNbSous>0\relax% \xintFor* ##1 in{\xintSeq{1}{\PfCNbSous}}\do{% \edef\PfCOperationsRetenues{\PfCOperationsRetenues,-}% }% \PfCChoixAleaMultiMix{\PfCNbSous}{1}{\fpeval{\PfCCibleQO-1}}{0}{\NbSousAv}% \edef\PfCNombresRetenus{\PfCNombresRetenus,\NbSousAv}% \fi% \ifnum\PfCNbMul>0\relax% \xintFor* ##1 in{\xintSeq{1}{\PfCNbMul}}\do{% \edef\PfCOperationsRetenues{\PfCOperationsRetenues,*}% }% \PfCChoixAleaMultiMix{\PfCNbMul}{2}{13}{0}{\NbMulAv}% \edef\PfCNombresRetenus{\PfCNombresRetenus,\NbMulAv}% \fi% \ifnum\PfCNbDiv>0\relax% \xintFor* ##1 in{\xintSeq{1}{\PfCNbMul}}\do{% \edef\PfCOperationsRetenues{\PfCOperationsRetenues,/}% }% \PfCChoixAleaMultiMix{\PfCNbMul}{2}{13}{0}{\NbDivAv}% \edef\PfCNombresRetenus{\PfCNombresRetenus,\NbDivAv}% \fi% \setsepchar{,}\ignoreemptyitems% \readlist*\ListeOperationsRetenuesVraiment{\PfCOperationsRetenues}% \readlist*\ListeNombresRetenusVraiment{\PfCNombresRetenus}% \reademptyitems% \edef\PfCFooRetiensTout{}% \edef\PfCFooRetiensToutAvecSol{}% \foreachitem\comptenum\in\ListeOperationsRetenuesVraiment{% \IfStrEqCase{\comptenum}{% {+}{% \edef\PfCFooRetiensTout{\PfCFooRetiensTout,$\pointilles[5mm]+\ListeNombresRetenusVraiment[\comptenumcnt]$}% \edef\PfCFooRetiensToutAvecSol{\PfCFooRetiensToutAvecSol,$\mathcolor{CouleurCibleQO}{\num{\fpeval{\PfCCibleQO-\ListeNombresRetenusVraiment[\comptenumcnt]}}}+\ListeNombresRetenusVraiment[\comptenumcnt]$}% }% {-}{% \edef\PfCFooRetiensTout{\PfCFooRetiensTout,$\pointilles[5mm]-\ListeNombresRetenusVraiment[\comptenumcnt]$}% \edef\PfCFooRetiensToutAvecSol{\PfCFooRetiensToutAvecSol,$\mathcolor{CouleurCibleQO}{\num{\fpeval{\PfCCibleQO+\ListeNombresRetenusVraiment[\comptenumcnt]}}}-\ListeNombresRetenusVraiment[\comptenumcnt]$}% }% {*}{% \edef\PfCFooRetiensTout{\PfCFooRetiensTout,$\pointilles[5mm]\PfCSymbolDiv\ListeNombresRetenusVraiment[\comptenumcnt]$}% \edef\PfCFooRetiensToutAvecSol{\PfCFooRetiensToutAvecSol,$\mathcolor{CouleurCibleQO}{\num{\fpeval{\PfCCibleQO*\ListeNombresRetenusVraiment[\comptenumcnt]}}}\PfCSymbolDiv\ListeNombresRetenusVraiment[\comptenumcnt]$}% }% {/}{% \quotient{\PfCCibleQO}{\ListeNombresRetenusVraiment[\comptenumcnt]}% \modulo{\PfCCibleQO}{\ListeNombresRetenusVraiment[\comptenumcnt]}% \ifnum\remainder=0\relax\edef\PfCFooRetiensTout{\PfCFooRetiensTout,$\pointilles[5mm]\times\ListeNombresRetenusVraiment[\comptenumcnt]$}\else\edef\PfCFooRetiensTout{\PfCFooRetiensTout,$\pointilles[5mm]\PfCSymbolTimes\ListeNombresRetenusVraiment[\comptenumcnt]+\the\remainder$}\fi% \ifnum\remainder=0\relax\edef\PfCFooRetiensToutAvecSol{\PfCFooRetiensToutAvecSol,$\mathcolor{CouleurCibleQO}{\num{\the\intquotient}}\times\ListeNombresRetenusVraiment[\comptenumcnt]$}\else\edef\PfCFooRetiensToutAvecSol{\PfCFooRetiensToutAvecSol,$\mathcolor{CouleurCibleQO}{\num{\the\intquotient}}\PfCSymbolTimes\ListeNombresRetenusVraiment[\comptenumcnt]+\the\remainder$}\fi% }% }% }% \fi% \MelangeListe{\PfCFooRetiensTout}{\PfCListeOperationsTesteeslen}% \edef\PfCFooRetiensTout{\faa}% \MelangeListe{\PfCFooRetiensToutAvecSol}{\PfCListeOperationsTesteeslen}% \edef\PfCFooRetiensToutAvecSol{\faa}% }% \setsepchar{,}\ignoreemptyitems% \readlist*\PfCCibleQOListeEnonce{\PfCFooRetiensTout}% \readlist*\PfCCibleQOListeSolution{\PfCFooRetiensToutAvecSol}% \reademptyitems% \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; }% \NewDocumentCommand\BuildCibleQuatreOperations{mmmm}{% \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 nbop-1: if (k*(360/nbop) mod 180)=0: A[k]=1.2[O,pointarc(cc,k*(360/nbop))]; else: A[k]=1.1[O,pointarc(cc,k*(360/nbop))]; fi; Fleche:=((0,0)--(center Op[k] shifted A[k])) cutbefore cercles(O,0.45*Rayon) cutafter cercles(O,0.90*Rayon); 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]-center Op[k]); endfor; \end{mplibcode}% }%