import requests
from scipy.optimize import linprog
# --- 1ïžâŁ Fonction pour rĂ©cupĂ©rer les donnĂ©es via OpenFoodFacts ---
def get_aliment_par_codebarre(barcode):
url = f"https://world.openfoodfacts.org/api/v0/product/{barcode}.json"
r = requests.get(url)
data = r.json()
if data.get("status") == 1:
product = data["product"]
nutriments = product.get("nutriments", {})
return {
"nom": product.get("product_name", "Inconnu"),
"proteines": nutriments.get("proteins_100g", 0),
"glucides": nutriments.get("carbohydrates_100g", 0),
"lipides": nutriments.get("fat_100g", 0)
}
else:
print(f"â Produit non trouvĂ© pour le code-barres {barcode}")
return None
# --- 2ïžâŁ Entrer les macros restantes ---
proteines_restantes = float(input("Proteines restantes (g) : "))
glucides_restantes = float(input("Glucides restantes (g) : "))
lipides_restantes = float(input("Lipides restantes (g) : "))
# --- 3ïžâŁ Scanner / entrer les codes-barres des aliments ---
aliments_choisis = []
for i in range(3):
barcode = input(f"Code-barres de l'aliment {i+1} : ")
aliment = get_aliment_par_codebarre(barcode)
if aliment:
aliments_choisis.append(aliment)
# --- 4ïžâŁ VĂ©rifier qu'on a au moins 2-3 aliments valides ---
if len(aliments_choisis) < 2:
print("â Il faut au moins 2 aliments valides pour calculer.")
exit()
# --- 5ïžâŁ PrĂ©parer les coefficients pour linprog ---
P = [a["proteines"]/100 for a in aliments_choisis]
G = [a["glucides"]/100 for a in aliments_choisis]
L = [a["lipides"]/100 for a in aliments_choisis]
c = [1]*len(aliments_choisis)
A_eq = [P, G, L]
b_eq = [proteines_restantes, glucides_restantes, lipides_restantes]
bounds = [(0, None)]*len(aliments_choisis)
# --- 6ïžâŁ RĂ©soudre le systĂšme ---
res = linprog(c, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method="highs")
# --- 7ïžâŁ Afficher le rĂ©sultat ---
if res.success:
print("\nâ
Quantités exactes pour couvrir tes macros restantes :")
for i, a in enumerate(aliments_choisis):
print(f"- {a['nom']} : {res.x[i]:.0f} g")
else:
print("\nâ Impossible de rĂ©soudre le calcul avec ces aliments.")