% D'après twitter : https://twitter.com/DavidKButlerUoA/status/1700612346258002030/photo/1 \setKVdefault[NCPP]{Largeur=5,Longueur=7,Unite=5mm,Rayon=1mm,Multiple=3,Couleur=black,Solution=false,Graines=false}% \defKV[NCPP]{Graine=\setKV[NCPP]{Graines}\PfCGraineAlea{#1}}% \newtoks\tokcentre% \def\updatetokscentre#1\nil{\addtotok\tokcentre{#1,}}% \NewDocumentCommand\NeComptePasPoints{o}{% \tokcentre{}% \useKVdefault[NCPP]% \setKV[NCPP]{#1}% % on crée la liste de tous les numéros des points. \def\NCPPLongueur{\useKV[NCPP]{Longueur}}% \def\NCPPLargeur{\useKV[NCPP]{Largeur}}% \xdef\PfCFooListeCentres{1}% \xintFor* ##1 in{\xintSeq{2}{\fpeval{\NCPPLargeur*\NCPPLongueur}}}\do{% \xdef\PfCFooListeCentres{\PfCFooListeCentres,##1}% }% \ChoixAlea{\fpeval{ceil(0.6*\NCPPLargeur*\NCPPLongueur)}}{\fpeval{floor(0.8*\NCPPLargeur*\NCPPLongueur)}}{\Titi}% \MelangeListe{\PfCFooListeCentres}{\Titi}% \setsepchar{,}\ignoreemptyitems% \readlist*\ListeCentres{\faa}% \ignoreemptyitems% \foreachitem\compteur\in\ListeCentres{\expandafter\updatetokscentre\compteur\nil}% \modulo{\Titi}{\useKV[NCPP]{Multiple}}% \ifboolKV[NCPP]{Solution}{% Il faut faire des paquets de \useKV[NCPP]{Multiple} points. Il existe plusieurs schémas expliquant la réponse. En voici un qui regroupe tous les points. }{% \textbf{Ne Compte pas les points !}\\ Montre que le nombre de points \ifnum\remainder=0\relax% est \else n'est pas\fi{} un multiple de \num{\useKV[NCPP]{Multiple}}. }% \begin{center} \BuildNCPP{\the\tokcentre}% \end{center} \ifboolKV[NCPP]{Solution}{% En faisant des paquets de \useKV[NCPP]{Multiple} points, on montre que le nombre de points \ifnum\remainder=0\relax% est \else n'est pas\fi{} un multiple de \num{\useKV[NCPP]{Multiple}}. }{}% }% \NewDocumentCommand\BuildNCPP{m}{% \ifluatex \mplibforcehmode \begin{mplibcode} Unite=\useKV[NCPP]{Unite}; Rayon=\useKV[NCPP]{Rayon}; Longueur=\useKV[NCPP]{Longueur}; Largeur=\useKV[NCPP]{Largeur}; Multiple=\useKV[NCPP]{Multiple}; boolean Choisi,Graines,Solution; Solution=\useKV[NCPP]{Solution}; color CouleurCercle; CouleurCercle=\useKV[NCPP]{Couleur}; TotalPoints=Longueur*Largeur; nbnoir:=0;%compte les noirs nbblanc:=0;%compte les blancs zr:=0;%pour compter les centres des points vardef Allumage(text t)= nbnoirs:=0; for p_=t: nbnoirs:=nbnoirs+1; Allume[p_]:=true; fill cercles(A[p_],Rayon) withcolor CouleurCercle; endfor; enddef; pair A[]; boolean Allume[]; for k=0 upto Largeur-1: for l=1 upto Longueur: Allume[k*Longueur+l]=false; A[k*Longueur+l]=Unite*(l,-k); endfor; endfor; Allumage(#1); if Solution: nbdeplaces:=0; zmontant=0; zdescendant=TotalPoints; for k=0 upto Largeur-1: for l=1 upto Longueur: zmontant:=zmontant+1; if zmontantzmontant) and (nbdeplaceszmontant: fill cercles(A[zmontant],Rayon) withcolor white; fill cercles(A[zdescendant],Rayon) withcolor LightSteelBlue; zdescendant:=zdescendant-1; fi; fi; fi; endfor; endfor; for k=0 upto (TotalPoints-zdescendant): if ((k+1) mod Multiple)=0: drawarrow A[zdescendant+k+1]--(A[zdescendant+k+1]+Unite*(0.5,0)); fi; endfor; for k=1 upto ((TotalPoints-zdescendant) mod Multiple): fill cercles(A[TotalPoints-k+1],Rayon) withcolor red; endfor; fi; \end{mpost} \fi }%