%%%
% OpCroisees
%%%
\def\filedateOpCroisees{2026/04/18}%
\def\fileversionOpCroisees{0.1b}%
\message{-- \filedateOpCroisees\space v\fileversionOpCroisees}%
%
\newcounter{PfCOCHor}%
\newcounter{PfCOCVer}%
\setcounter{PfCOCHor}{0}%
\setcounter{PfCOCVer}{0}%
\newlength\PfCOpCroisees%
\setKVdefault[OpCroisees]{Solution=false,Largeur=20pt,ValeurMin=2,ValeurMax=9,Consignes=false,CouleurSolution={},Graine={},Modele={}}
%
\NewDocumentCommand\OpCroisees{om}{%
  \useKVdefault[OpCroisees]%
  \setKV[OpCroisees]{#1}%
  \ifemptyKV[OpCroisees]{Graine}{}{\edef\PfCGraineOldAlea{\PfCGraineAAfficher}\PfCGraineAlea{\useKV[OpCroisees]{Graine}}}%
  \ifemptyKV[OpCroisees]{CouleurSolution}{}{\setKV[OpCroisees]{Solution}\colorlet{PfCOCCoulSol}{\useKV[OpCroisees]{CouleurSolution}}}%
  \ifx#2\bla\bla%
    \setKV[OpCroisees]{Consignes}%
    % On a un seul motif où il faut 12 nombres et 15 opérations
    \PfCChoixAleaMultiMixRep{12}{\useKV[OpCroisees]{ValeurMin}}{\useKV[OpCroisees]{ValeurMax}}{0}{\PfCListeOCNombresAv}%
    \PfCChoixAleaMulti{15}{1}{3}{\PfCListeOCTypeOperationsAv}%
    \setsepchar{,}\ignoreemptyitems%
    \readlist*\ListeOCNombre{\PfCListeOCNombresAv}%
    \readlist*\ListeOCTypeOperations{\PfCListeOCTypeOperationsAv}%
    \readlist*\ListeOperationsAv{+,-,*}%
    \xdef\PfCFooOp{}%
    \foreachitem\compteur\in\ListeOCTypeOperations{%
      \itemtomacro\ListeOCTypeOperations[\compteurcnt]\Titi%
      \xdef\PfCFooOp{\PfCFooOp,\ListeOperationsAv[\Titi]}%
    }%
    \readlist*\ListeOperations{\PfCFooOp}%
    \reademptyitems
    \ifemptyKV[OpCroisees]{Modele}{\ChoixAlea{1}{2}{\TypeModele}}{\xdef\TypeModele{\useKV[OpCroisees]{Modele}}}%
    \ifnum\fpeval{\TypeModele}=1\relax%
      \setsepchar[*]{§*,}\ignoreemptyitems%
      \readlist\ListeOCPerso{\ListeOCNombre[1],\ListeOperations[1],\ListeOCNombre[2],!,\ListeOCNombre[3],\ListeOperations[2],\ListeOCNombre[4]§%
        \ListeOperations[3],!,\ListeOperations[4],!,\ListeOperations[5],!,\ListeOperations[6]§%
        \ListeOCNombre[5],\ListeOperations[7],\ListeOCNombre[6],\ListeOperations[8],\ListeOCNombre[7],\ListeOperations[9],\ListeOCNombre[8]§%
        \ListeOperations[10],!,\ListeOperations[11],!,\ListeOperations[12],!,\ListeOperations[13]§%
        \ListeOCNombre[9],\ListeOperations[14],\ListeOCNombre[10],\ListeOperations[15],\ListeOCNombre[11],!,\ListeOCNombre[12]%
      }%
      \reademptyitems%
      \setsepchar{,}\ignoreemptyitems%
      \readlist\PfCOpListeHor{\fpeval{\ListeOCNombre[1]\ListeOperations[1]\ListeOCNombre[2]},\fpeval{\ListeOCNombre[3]\ListeOperations[2]\ListeOCNombre[4]},\fpeval{\ListeOCNombre[5]\ListeOperations[7]\ListeOCNombre[6]\ListeOperations[8]\ListeOCNombre[7]\ListeOperations[9]\ListeOCNombre[8]},\fpeval{\ListeOCNombre[9]\ListeOperations[14]\ListeOCNombre[10]\ListeOperations[15]\ListeOCNombre[11]}}%
      \readlist\PfCOpListeVer{\fpeval{\ListeOCNombre[1]\ListeOperations[3]\ListeOCNombre[5]\ListeOperations[10]\ListeOCNombre[9]},\fpeval{\ListeOCNombre[2]\ListeOperations[4]\ListeOCNombre[6]\ListeOperations[11]\ListeOCNombre[10]},\fpeval{\ListeOCNombre[3]\ListeOperations[5]\ListeOCNombre[7]\ListeOperations[12]\ListeOCNombre[11]},\fpeval{\ListeOCNombre[4]\ListeOperations[6]\ListeOCNombre[8]\ListeOperations[13]\ListeOCNombre[12]}}%
      \reademptyitems%
  \else%
    \setsepchar[*]{§*,}\ignoreemptyitems%
      \readlist\ListeOCPerso{\ListeOCNombre[1],\ListeOperations[1],\ListeOCNombre[2],!,\ListeOCNombre[3],\ListeOperations[2],\ListeOCNombre[4]§%
        \ListeOperations[3],!,\ListeOperations[4],!,\ListeOperations[5],!,\ListeOperations[6]§%
        \ListeOCNombre[5],\ListeOperations[7],\ListeOCNombre[6],\ListeOperations[8],\ListeOCNombre[7],\ListeOperations[9],\ListeOCNombre[8]§%
        \ListeOperations[10],!,\ListeOperations[11],!,\ListeOperations[12],!,\ListeOperations[13]§%
        \ListeOCNombre[9],\ListeOperations[14],\ListeOCNombre[10],!,\ListeOCNombre[11],\ListeOperations[15],\ListeOCNombre[12]%
      }%
      \reademptyitems%
      \setsepchar{,}\ignoreemptyitems%
      \readlist\PfCOpListeHor{\fpeval{\ListeOCNombre[1]\ListeOperations[1]\ListeOCNombre[2]},\fpeval{\ListeOCNombre[3]\ListeOperations[2]\ListeOCNombre[4]},\fpeval{\ListeOCNombre[5]\ListeOperations[7]\ListeOCNombre[6]\ListeOperations[8]\ListeOCNombre[7]\ListeOperations[9]\ListeOCNombre[8]},\fpeval{\ListeOCNombre[9]\ListeOperations[14]\ListeOCNombre[10]},\fpeval{\ListeOCNombre[11]\ListeOperations[15]\ListeOCNombre[12]}}%
      \readlist\PfCOpListeVer{\fpeval{\ListeOCNombre[1]\ListeOperations[3]\ListeOCNombre[5]\ListeOperations[10]\ListeOCNombre[9]},\fpeval{\ListeOCNombre[2]\ListeOperations[4]\ListeOCNombre[6]\ListeOperations[11]\ListeOCNombre[10]},\fpeval{\ListeOCNombre[3]\ListeOperations[5]\ListeOCNombre[7]\ListeOperations[12]\ListeOCNombre[11]},\fpeval{\ListeOCNombre[4]\ListeOperations[6]\ListeOCNombre[8]\ListeOperations[13]\ListeOCNombre[12]}}%
      \reademptyitems
    \fi%
  \else%
    \setsepchar[*]{§*,}\ignoreemptyitems\readlist\ListeOCPerso{#2}\reademptyitems%
  \fi%
  \setlength{\PfCOpCroisees}{\useKV[OpCroisees]{Largeur}+\tabcolsep}%
  \def\PfCOCTaille{\listlen\ListeOCPerso[1]}%
  \def\PfCOCHauteur{\ListeOCPersolen}%
  \setcounter{PfCOCHor}{0}%
  \setcounter{PfCOCVer}{0}%
  %
  \begin{center}
      \begin{NiceTabular}{c*{\PfCOCTaille}{m{\useKV[OpCroisees]{Largeur}}}}%[color-inside]%
    \Block{}{\rule{0pt}{\PfCOpCroisees}}\xintFor* ##1 in {\xintSeq{1}{\PfCOCTaille}}\do{%
      &\Block{}{\modulo{##1}{2}\ifnum\remainder=1\relax\stepcounter{PfCOCHor}\Roman{PfCOCHor}\fi}%
    }\\
    \hhline{~*{\PfCOCTaille}{-}}%
    \xintFor* ##1 in{\xintSeq{1}{\PfCOCHauteur}}\do{%
      \rule{0pt}{\PfCOpCroisees}\Block[m]{1-1}{\modulo{##1}{2}\ifnum\remainder=1\relax\stepcounter{PfCOCVer}\Alph{PfCOCVer}\fi}%
      \xintFor* ##2 in{\xintSeq{1}{\PfCOCTaille}}\do{%
        &%
        \itemtomacro\ListeOCPerso[##1,##2]\Titi
        \IfStrEq{\Titi}{!}{%
          \Block[draw,m,fill=black]{1-1}{}%
        }{%
          \Block[draw,m]{1-1}{%
            \IfDecimal{\Titi}{\num{\Titi}}{%
              \IfStrEqCase{\Titi}{%
                {+}{\ifboolKV[OpCroisees]{Solution}{$\mathcolor{PfCOCCoulSol}{+}$}{}}%
                {-}{\ifboolKV[OpCroisees]{Solution}{$\mathcolor{PfCOCCoulSol}{\_}$}{}}%
                {:}{\ifboolKV[OpCroisees]{Solution}{$\mathcolor{PfCOCCoulSol}{\div}$}{}}%
                {*}{\ifboolKV[OpCroisees]{Solution}{$\mathcolor{PfCOCCoulSol}{\times}$}{}}%
              }%
            }%
          }%
        }%
      }%
      % 
      \\%
      \hhline{~*{\PfCOCTaille}{-}}%
    }%
  \end{NiceTabular}%
  \end{center}
  \ifboolKV[OpCroisees]{Solution}{}{\ifboolKV[OpCroisees]{Consignes}{%
        Compléter la grille ci-dessus à l'aide des opérations $+$, $-$ et $\times$ afin de retrouver les résultats suivants :
        \ifnum\fpeval{\TypeModele}=1\relax  
      \begin{align*}
        A_1&:\num{\PfCOpListeHor[1]}&A_2&:\num{\PfCOpListeHor[2]}&B&:\num{\PfCOpListeHor[3]}&C&:\num{\PfCOpListeHor[4]}\\
        I&:\num{\PfCOpListeVer[1]}&II&:\num{\PfCOpListeVer[2]}&III&:\num{\PfCOpListeVer[3]}&IV&:\num{\PfCOpListeVer[4]}
      \end{align*}
    \else
\begin{align*}
        A_1&:\num{\PfCOpListeHor[1]}&A_2&:\num{\PfCOpListeHor[2]}&B&:\num{\PfCOpListeHor[3]}&C_1&:\num{\PfCOpListeHor[4]}&C_2&:\num{\PfCOpListeHor[5]}\\
        I&:\num{\PfCOpListeVer[1]}&II&:\num{\PfCOpListeVer[2]}&III&:\num{\PfCOpListeVer[3]}&IV&:\num{\PfCOpListeVer[4]}
      \end{align*}
      \fi%
    }{}%
  }%
  \ifemptyKV[OpCroisees]{Graine}{}{\PfCGraineAlea{\PfCGraineOldAlea}}%
}%