Engendrer une feuille d’exercices aléatoires avec Python en \(\LaTeX\)

Engendrer une feuille d’exercices aléatoires avec Python en \(\LaTeX\)

Combien de fois ai-je voulu générer automatiquement des exercices similaires (par exemple, de développement) ? Vous ne le savez pas, mais moi, je le sais : beaucoup trop !

Encore aujourd’hui, j’ai voulu générer une série de multiplications pour faire réviser ses tables une de mes élèves.

Comme je me suis mis à Python il n’y a pas longtemps, et comme dans la foulée je me suis aussi mis à PythonTeX, j’ai forcément pensé à tout ça pour faire ma feuille d’exercices (plutôt que d’inventer et de taper plus de 90 opérations).

Nous allons voir comment.

Du côté de Python

Dans un premier temps, il faut un code Python qui fonctionne. Je lande donc IDLE (la console Python) et tape le code suivant :

import random

for n in range(10):
    a = random.randint(2,9)
    b = random.randint(2,9)
    c = a*b
    if (n%3 == 0):
        print('... x ',b,' = ',c)
    else:
        if (n%3 == 1):
            print(a,' x ... = ',c)
        else:
            print(a,' x ',b,' = ...')

Ce code me sert juste à valider la syntaxe : tout va bien ! Cela me sort 10 opérations à trous comme l’illustre la copie d’écran suivante :

Maintenant, il faut que je passe aux choses sérieuse : créer la feuille d’exercices \(\LaTeX\).

Du côté de \(\LaTeX\)

J’utilise le code suivant :

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{multicol}
\usepackage{pythontex}
\usepackage{nopageno}
\setlength{\parindent}{0pt}
\setlength{\columnseprule}{0.4pt}
\begin{document}
\begin{multicols}{4}
\begin{pycode}
import random

for n in range(91):
    a = random.randint(2,9)
    b = random.randint(2,9)
    c = a*b
    if (n%3 == 0):
        print('$\\ldots\\times',b,' = ',c,'$\\\\[1em]')
    else:
        if (n%3 == 1):
            print('$',a,'\\times\\ldots = ',c,'$\\\\[1em]')
        else:
            print('$',a,'\\times ',b,' = \\ldots$\\\\[1em]')
\end{pycode} 
\end{multicols}           
\end{document}

Remarquez que j’ai dû ajouter des symboles “$” (pour écrire les opérations en mode mathématique en ligne) et que j’ai dû doubler les antislashs (c’est un problème récurrent quand on passe par un programme externe, comme Xcas). J’ai aussi remplacé les “x” par des vraies crois Saint-André (“\times”), ça fait plus pro !

Là, j’obtiens la feuille suivante :

Opérations aléatoires (pythontex)

Allons plus loin avec de l’algèbre

Installation de simpy

Pour faire de l’algèbre avec Python, on a besoin du module simpy. Il faut donc aller dans le terminal, et taper :

python -m pip install simpy

Le code Python

Je souhaite un code qui choisisse aléatoirement 4 nombres entiers abc et d et qui affiche l’opération (axb)(cxd) ainsi que son développement.

import random
from sympy import Symbol
from sympy import expand
x=Symbol('x')
for n in range(11):
    a = random.choice([1, -1]) * random.randint(2, 9)
    b = random.choice([1, -1]) * random.randint(2, 9)
    c = random.choice([1, -1]) * random.randint(2, 9)
    d = random.choice([1, -1]) * random.randint(2, 9)
    e = (a*x+b)*(c*x+d)       
    print(expr,'=',expand(e))

Le code \(\LaTeX\)

\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{pythontex}
\usepackage{nopageno}
\usepackage{xstring}
\setlength{\parindent}{0pt}
\begin{document}
\begin{pycode}
import random
from sympy import Symbol
from sympy import expand
x=Symbol('x')
print('\\begin{align*}')
for n in range(10):
    a = random.choice([1, -1]) * random.randint(2, 9)
    b = random.choice([1, -1]) * random.randint(2, 9)
    c = random.choice([1, -1]) * random.randint(2, 9)
    d = random.choice([1, -1]) * random.randint(2, 9)
    e = (a*x+b)*(c*x+d)       
    print('\\StrSubstitute{',e,'}{*}{}',' & = \\StrSubstitute{',expand(e),'}{**}{^}[\\result]\\StrSubstitute{\\result}{*}{}\\\\')
print('\\end{align*}')
\end{pycode}        
\end{document}

Cela donne :

Pour passer du code Python au code \(\LaTeX\), il m’a fallu utiliser une petite astuce pour remplacer les étoiles (affichées par Python). J’ai donc fait appel au package xstring.

Par défaut, Python affiche : “(-4*x+4)*(5*x+9)=-20*x**2-16*x+36”; il faut donc :

  • remplacer d’abord les “**” par des “^”, d’où la commande : \StrSubstitute{<ma chaîne>}{**}{^}[\result]. Cette commande définit la macro \result comme étant la chaîne dans laquelle on a fait le remplacement.
  • remplacer les “*” par rien dans \result : \StrSubstitute{\result}{*}{}. On obtient alors le résultat final souhaité.

 

Stéphane Pasquet
Stéphane Pasquet

Auteur de livres parascolaires en mathématiques

2 réflexions au sujet de « Engendrer une feuille d’exercices aléatoires avec Python en \(\LaTeX\) »

RiadhPublié le  11:43 - Sep 13, 2018

Merci !

Mais il y a déjà le logiciel pyromaths qui fait déjà ça très bien.
Vous pourrez peut-être l’enrichir avec vos exercices (et votre maîtrise de latex + python) ?

    Stéphane Pasquet

    Stéphane PasquetPublié le  8:08 - Sep 14, 2018

    En effet, Pyromath existe, mais l’objectif de cet article, comme beaucoup qui parlent de LaTeX ou Python, est de voir comment programmer, car Pyromath, c’est bien, mais ça ne fait pas tout. Donc si on veut faire quelque chose que Pyromath ne fait pas, si on ne comprend pas le fonctionnement des choses, on ne peut rien faire de plus.
    Ici, je parle de choses rudimentaires pour faire passer certaines notions, mais c’est pour mieux comprendre le lien entre LaTeX et Python dans le cas où l’on souhaite programmer en Python pour afficher les résultats en LaTeX. Avec Pyromath, on n’a pas le choix sur le style des exercices. Et je ne suis pas un mouton, donc je déteste qu’on me dise comment je dois construire mes exercices 🙂 Je préfère donc comprendre les choses pour faire exactement ce que je veux. Je suis donc contre le principe de Pyromath (pour moi uniquement), même si je reconnais son utilité dans certains cas pour certain.e.s enseignant.e.s. Par exemple, voyez-vous sur Pyromath la feuille où il y a des opérations ? Moi, j’avais besoin de ça, et pas d’autre chose. Donc ici, Pyromath ne me servait à rien.

Laissez votre message