28b1c80b50
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
97 lines
4.2 KiB
Python
Executable File
97 lines
4.2 KiB
Python
Executable File
#!/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
|