feat: add operation exercises generation using gen_op.py
Moved gen-op.py to app/gen_op.py and integrated it with the FastAPI application Added a new section in the UI for generating operation exercises Updated the PDF generation to work in memory and upload to S3 Bumped version to 1.0.9
This commit is contained in:
Executable
+96
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env python3
|
||||
import random
|
||||
import io
|
||||
from fpdf import FPDF
|
||||
|
||||
def generer_nombre():
|
||||
"""Génère un nombre naturel entre 1 et 9"""
|
||||
return random.randint(1, 9)
|
||||
|
||||
def evaluer_expression(expr):
|
||||
"""Évalue une expression mathématique en remplaçant × par *"""
|
||||
try:
|
||||
# Remplacer × par * pour l'évaluation
|
||||
expr_eval = expr.replace('×', '*')
|
||||
return eval(expr_eval)
|
||||
except:
|
||||
return -1 # En cas d'erreur, considérer comme négatif
|
||||
|
||||
def generer_expression():
|
||||
"""Génère une expression aléatoire respectant les contraintes"""
|
||||
# On choisit aléatoirement un type d'expression (avec ou sans parenthèses)
|
||||
# On vérifie que le résultat est positif
|
||||
expressions_positives = [
|
||||
lambda: f"({generer_nombre()} + {generer_nombre()}) × {generer_nombre()} - {generer_nombre()}",
|
||||
lambda: f"{generer_nombre()} + {generer_nombre()} × {generer_nombre()} - {generer_nombre()}",
|
||||
lambda: f"({generer_nombre()} + {generer_nombre()}) × ({generer_nombre()} + {generer_nombre()})",
|
||||
lambda: f"{generer_nombre()} + {generer_nombre()} × {generer_nombre()} - {generer_nombre()} + {generer_nombre()}",
|
||||
lambda: f"({generer_nombre()} + {generer_nombre()}) × {generer_nombre()} - {generer_nombre()} + {generer_nombre()}",
|
||||
lambda: f"{generer_nombre()} × {generer_nombre()} + {generer_nombre()} - {generer_nombre()} × {generer_nombre()}",
|
||||
lambda: f"({generer_nombre()} + {generer_nombre()}) + {generer_nombre()} × {generer_nombre()} - {generer_nombre()}",
|
||||
lambda: f"{generer_nombre()} + {generer_nombre()} × ({generer_nombre()} + {generer_nombre()}) - {generer_nombre()}",
|
||||
lambda: f"({generer_nombre()} + {generer_nombre()}) + {generer_nombre()} × {generer_nombre()} - {generer_nombre()}",
|
||||
lambda: f"{generer_nombre()} × ({generer_nombre()} + {generer_nombre()}) + {generer_nombre()} - {generer_nombre()}",
|
||||
lambda: f"{generer_nombre()} + {generer_nombre()} × {generer_nombre()} - {generer_nombre()} × {generer_nombre()} + {generer_nombre()}",
|
||||
lambda: f"({generer_nombre()} + {generer_nombre()}) × {generer_nombre()} - {generer_nombre()} + {generer_nombre()} - {generer_nombre()}",
|
||||
]
|
||||
|
||||
# Essayer jusqu'à ce qu'on obtienne une expression avec résultat positif
|
||||
while True:
|
||||
choix = random.choice(expressions_positives)
|
||||
expr = choix()
|
||||
resultat = evaluer_expression(expr)
|
||||
if resultat >= 0:
|
||||
return expr
|
||||
|
||||
def generer_feuille_exercices(n_exercices=20):
|
||||
"""Génère une feuille d'exercices en format 2 colonnes"""
|
||||
expressions = [generer_expression() for _ in range(n_exercices)]
|
||||
|
||||
# Format 2 colonnes : on affiche par paires
|
||||
output = ""
|
||||
for i in range(0, n_exercices, 2):
|
||||
expr1 = f"{i+1}. {expressions[i]}"
|
||||
expr2 = f"{i+2}. {expressions[i+1]}" if i+1 < len(expressions) else ""
|
||||
# Alignement pour deux colonnes
|
||||
output += f"{expr1:<36} {expr2}\n" + " " * 36 + " \n" * 3
|
||||
return output
|
||||
|
||||
def generer_pdf_exercices_en_memoire(n_exercices=20):
|
||||
"""Génère une feuille d'exercices au format PDF en mémoire"""
|
||||
pdf = FPDF()
|
||||
pdf.add_page()
|
||||
pdf.set_font("Helvetica", size=12)
|
||||
|
||||
# Titre
|
||||
pdf.cell(200, 10, text="Feuille d'exercices d'opérations", new_x="LMARGIN", new_y="NEXT", align='C')
|
||||
pdf.ln(10)
|
||||
|
||||
# Contenu en 2 colonnes
|
||||
expressions = [generer_expression() for _ in range(n_exercices)]
|
||||
|
||||
for i in range(0, n_exercices, 2):
|
||||
# Colonne 1
|
||||
expr1 = f"{i+1}. {expressions[i]}"
|
||||
pdf.cell(90, 10, text=expr1, border=0, align='L')
|
||||
|
||||
# Colonne 2
|
||||
if i+1 < len(expressions):
|
||||
expr2 = f"{i+2}. {expressions[i+1]}"
|
||||
pdf.cell(90, 10, text=expr2, border=0, align='L')
|
||||
pdf.ln(10)
|
||||
|
||||
# Espacement supplémentaire - ajout de deux lignes vides supplémentaires
|
||||
pdf.ln(15)
|
||||
|
||||
# Retourner les données PDF en mémoire
|
||||
return pdf.output()
|
||||
|
||||
def generer_pdf_exercices(n_exercices=20, output_file="exercices.pdf"):
|
||||
"""Génère une feuille d'exercices au format PDF"""
|
||||
pdf_data = generer_pdf_exercices_en_memoire(n_exercices)
|
||||
|
||||
# Sauvegarde du PDF
|
||||
with open(output_file, "wb") as f:
|
||||
f.write(pdf_data)
|
||||
return output_file
|
||||
Reference in New Issue
Block a user