\documentclass[a4paper]{article}
\usepackage[left=1cm,right=1cm,top=1cm, bottom=1cm, headsep=2mm]{geometry}
\usepackage[utf8]{inputenc}    
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage{fp}
\usepackage[francais,bloc]{automultiplechoice}    
\usepackage{multicol}
\usepackage{fancyhdr,amssymb,amsmath}
\usepackage{fontawesome}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{tcolorbox} 
\usepackage{pifont}
\usepackage{csvsimple}
\usepackage{listings} % Indispensable pour \lstinputlisting

% Configuration pour le code Python
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}

\lstdefinestyle{pythonstyle}{
    backgroundcolor=\color{backcolour},   
    commentstyle=\color{codegreen},
    keywordstyle=\color{magenta},
    numberstyle=\tiny\color{codegray},
    stringstyle=\color{codepurple},
    basicstyle=\footnotesize\ttfamily,
    breakatwhitespace=false,         
    breaklines=true,                 
    captionpos=b,                    
    keepspaces=true,                 
    numbers=left,                    
    numbersep=5pt,                  
    showspaces=false,                
    showstringspaces=false,
    showtabs=false,                  
    tabsize=2
}
\lstset{style=pythonstyle} % Applique le style globalement

\geometry{hmargin=2cm,headheight=2cm,headsep=.3cm,footskip=1cm,top=2.3cm,bottom=2cm}
\usepackage{mathtools}

%%%%commande création sujet
\newcommand{\sujet}{%
%
\exemplaire{1}{%

%%% debut de l'en-tête des copies :  

\vspace{1cm}

\begin{tcolorbox}[
	colframe=black!25,
	colback=white!10,
	coltitle=gray!20!black,  
	fonttitle=\bfseries,
	adjusted title=\textbf{
    \large \bf
    \champnom{\nom{} - \classe{}}
    }\hfill\Large\textbf{}]
	\begin{center}

  \includegraphics[width=1cm]{logo.png} 
  \hspace{1cm}
  \bf\Large DS - Notions fondamentales de Python
  \vspace{1mm}

	\end{center}

\begin{flushleft}\em
Les questions faisant apparaître le symbole \multiSymbole{} 
peuvent présenter une ou plusieurs bonnes réponses. Les autres ont 
une unique bonne réponse. 
\\Pour les questions type QCM, une mauvaise 
réponse peut retirer des points. L'absence de réponse vaut 0 point.
\\Noircir les cases correctement \textbf{au stylo noir} comme ceci : \ding{110}.

\end{flushleft}

\end{tcolorbox}
\vspace{3mm}
%%% fin de l'en-tête

\AMCassociation{\nom}

\formulaire

%% Composition des QCM
\cleargroup{tout}

\melangegroupe{partie1}\copygroup{partie1}{tout}
\melangegroupe{partie2}\copygroup{partie2}{tout}
\melangegroupe{partie3}\copygroup{partie3}{tout}

\restituegroupe{tout}

%\AMCcleardoublepage    

}%exemplaire
}%sujet


\begin{document}

\AMCinterIrep=0.75ex

\element{partie1}{
    \center\textbf{\Large\bf{Partie 1 : Connaissances générales (10 points)}}
	\vspace{3mm}

    \begin{question}{p1-q1}\bareme{b=1,m=0}
        Quel est le type de la valeur \texttt{42.0} en Python ?
        \begin{reponseshoriz}
            \mauvaise{int}
            \bonne{float}
            \mauvaise{str}
            \mauvaise{bool}
        \end{reponseshoriz}
    \end{question}

    \begin{question}{p1-q2}\bareme{b=6,m=-0.5}
        Lequel de ces noms de variable est invalide en Python ?
        \begin{reponseshoriz}
            \mauvaise{age\_utilisateur}
            \mauvaise{Valeur\_secrete}
            \bonne{1er\_joueur}
            \mauvaise{scoreMax}
        \end{reponseshoriz}
    \end{question}
    
    \begin{question}{p1-q3}\bareme{b=1,m=0}
        Que vaudra l'expression \texttt{17 \% 5} ?
        \begin{reponseshoriz}
            \mauvaise{3.4}
            \bonne{2}
            \mauvaise{3}
            \mauvaise{1}
        \end{reponseshoriz}
    \end{question}

    \begin{question}{p1-q4}\bareme{b=1,m=0}
        Par quel symbole une instruction \texttt{if}, \texttt{for} ou \texttt{while} doit-elle se terminer ?
        \begin{reponseshoriz}
            \mauvaise{;}
            \bonne{:}
            \mauvaise{end}
            \mauvaise{()}
        \end{reponseshoriz}
    \end{question}

    \begin{question}{p1-q5}\bareme{b=1,m=0}
        Quelle boucle est la plus appropriée pour répéter une action un nombre de fois connu à l'avance (ex: 10 fois) ?
        \begin{reponseshoriz}
            \bonne{La boucle \texttt{for}}
            \mauvaise{La boucle \texttt{while}}
            \mauvaise{L'instruction \texttt{if}}
            \mauvaise{La boucle \texttt{repeat}}
        \end{reponseshoriz}
    \end{question}

    \begin{questionmult}{p1-q6}\bareme{formula=NBC*0.5}
        Comment tester si une variable \texttt{age} est comprise entre 18 et 65 ans (inclus) ?
        \begin{reponses}
            \bonne{\texttt{if age >= 18 and age <= 65:}}
            \mauvaise{\texttt{if age > 18 or age < 65:}}
            \bonne{\texttt{if 18 <= age <= 65:}}
            \mauvaise{\texttt{if age in [18, 65]:}}
        \end{reponses}
    \end{questionmult}
    
    \begin{question}{p1-q7}\bareme{b=1,m=0}
        Quel mot-clé est utilisé pour définir une fonction en Python ?
        \begin{reponseshoriz}
            \mauvaise{\texttt{function}}
            \mauvaise{\texttt{fun}}
            \bonne{\texttt{def}}
            \mauvaise{\texttt{define}}
        \end{reponseshoriz}
    \end{question}

    \begin{question}{p1-q8}\bareme{b=1,m=0}
        Que vaudra l'expression \texttt{17 \textbackslash\textbackslash 5} ?
        \begin{reponseshoriz}
            \mauvaise{3.4}
            \bonne{3}
            \mauvaise{2}
            \mauvaise{1}
        \end{reponseshoriz}
    \end{question}
    
 % --- QUESTION 9 MODIFIÉE ---
    \begin{question}{p1-q9}\bareme{b=1,m=0}
        À quoi sert principalement un bloc \texttt{try...except} en Python ?
        \begin{reponses}
            \bonne{À gérer une erreur potentielle pour empêcher le programme de s'arrêter.}
            \mauvaise{À répéter une action plusieurs fois.}
            \mauvaise{À prendre une décision (comme un \texttt{if}).}
            \mauvaise{À définir une nouvelle fonction.}
        \end{reponses}
    \end{question}

    % --- QUESTION 10 MODIFIÉE ---
    \begin{question}{p1-q10}\bareme{b=1,m=0}
        Que se passe-t-il si la condition d'une instruction \texttt{assert} est fausse ?
        \begin{reponses}
            \mauvaise{Le programme continue son exécution normalement.}
            \bonne{Le programme s'arrête immédiatement en levant une \texttt{AssertionError}.}
            \mauvaise{Un message d'avertissement est affiché, mais le programme continue.}
            \mauvaise{Le programme demande à l'utilisateur de corriger la valeur.}
        \end{reponses}
    \end{question}
}

\element{partie2}{

    \center{\textbf{\Large\bf{Partie 2 : Analyse de code (6 points)}}}
	\vspace{3mm}

    \begin{question}{p2-q1}\bareme{b=2,m=0}
        Considérez le code suivant :
        
        \lstinputlisting{code_p2_q1.py}
        
        Qu'affichera ce programme ?
        \begin{reponses}
            \mauvaise{10}
            \mauvaise{15}
            \bonne{20}
            \mauvaise{Rien, il y a une erreur.}
        \end{reponses}
    \end{question}

    \begin{questionmult}{p2-q2}\bareme{NBC}
        Considérez le code suivant :

        \lstinputlisting{code_p2_q2.py}

        Qu'affichera ce programme ?
        \begin{reponses}
            \bonne{6}
            \mauvaise{10}
            \mauvaise{4}
            \bonne{La somme de 0 + 1 + 2 + 3}
        \end{reponses}
    \end{questionmult}

    \begin{question}{p2-q3}\bareme{b=2,m=0}
        Considérez le code suivant :

        \lstinputlisting{code_p2_q3.py}

        Qu'affichera ce programme ?
        \begin{reponses}
            \mauvaise{5}
            \bonne{11}
            \mauvaise{10}
            \mauvaise{\texttt{calculer(5)}}
        \end{reponses}
    \end{question}
}

\element{partie3}{
    \newpage
    % ... (La partie 3 reste inchangée, elle est déjà correcte)
    \center{\textbf{\Large\bf{Partie 3 : Exercice de programmation (7 points)}}}
	\vspace{3mm}

    \begin{question}{p3-q1}
    \textbf{Consigne :} Écrivez un programme Python qui parcourt tous les nombres de 1 à 100 (inclus) et qui affiche, pour chaque nombre :
    \begin{itemize}
        \item \textbf{"FizzBuzz"} si le nombre est divisible par 3 ET par 5.
        \item \textbf{"Fizz"} si le nombre est seulement divisible par 3.
        \item \textbf{"Buzz"} si le nombre est seulement divisible par 5.
        \item Le \textbf{nombre lui-même} dans tous les autres cas.
    \end{itemize}
    \textbf{Critères d'évaluation :}
    \begin{center}
    \begin{tabular}{|l|p{10cm}|}
        \hline
        \textbf{Critère} & \textbf{Indicateurs de réussite} \\
        \hline
        Logique correcte & "Fizz" pour 3, 6, 9... "Buzz" pour 5, 10, 20... "FizzBuzz" pour 15, 30... \\
        \hline
        Outils utilisés & Une boucle \texttt{for} est utilisée. La structure \texttt{if/elif/else} est correcte. \newline 
        L'opérateur modulo (\texttt{\%}) est utilisé pour tester la divisibilité. \\
        \hline
        Qualité du code & Le code est correctement indenté et facile à lire. \\
        \hline
    \end{tabular}
    \end{center}
    
    \def\AMCotextReserved{\emph{Cases réservées au correcteur}}
    \AMCOpen{lines=18,dots=true,lineheight=0.4cm,answer= \vspace{80mm}\lstinputlisting{p3-cor.py}}{
        \wrongchoice{1}\scoring{1}
        \wrongchoice{2}\scoring{2}
        \wrongchoice{3}\scoring{3}
        \wrongchoice{4}\scoring{4}
        \wrongchoice{5}\scoring{5}
        \wrongchoice{6}\scoring{6}
        \correctchoice{7}\scoring{7}
    }
    \end{question}
}

\raggedright
\csvreader[head to column names]{liste.csv}{}{\sujet}
\end{document}