riabayonaor commited on
Commit
dd69d15
1 Parent(s): 663ed12

Create app.py

Browse files

Inicio de la app

Files changed (1) hide show
  1. app.py +167 -0
app.py ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import os
3
+ import random
4
+ import numpy as np
5
+
6
+ # Verificación de la importación de la biblioteca de la API de Google y configuración de la API KEY
7
+ try:
8
+ import google.generativeai as genai
9
+ gemini_api_key = os.getenv("GEMINI_API_KEY")
10
+ if gemini_api_key is None:
11
+ raise ValueError("La variable de entorno GEMINI_API_KEY no está configurada.")
12
+ genai.configure(api_key=gemini_api_key)
13
+ model = genai.GenerativeModel('gemini-pro')
14
+ except ImportError:
15
+ st.error("Error al importar la biblioteca de Google. Asegúrate de que está instalada.")
16
+ st.stop()
17
+ except ValueError as e:
18
+ st.error(e)
19
+ st.stop()
20
+
21
+ def get_game_state():
22
+ """Obtiene el estado actual del juego"""
23
+ if 'aciertos' not in st.session_state:
24
+ st.session_state.aciertos = 0
25
+ if 'errores' not in st.session_state:
26
+ st.session_state.errores = 0
27
+ if 'nivel' not in st.session_state:
28
+ st.session_state.nivel = 0 # 0 = Principiante, 1 = Intermedio, 2 = Difícil
29
+ if 'nuevo_problema' not in st.session_state:
30
+ st.session_state.nuevo_problema = True
31
+ return st.session_state.aciertos, st.session_state.errores, st.session_state.nivel, st.session_state.nuevo_problema
32
+
33
+ def update_game_state(aciertos, errores, nivel, nuevo_problema):
34
+ """Actualiza el estado del juego"""
35
+ st.session_state.aciertos = aciertos
36
+ st.session_state.errores = errores
37
+ st.session_state.nivel = nivel
38
+ st.session_state.nuevo_problema = nuevo_problema
39
+
40
+ def chat_with_model(user_input):
41
+ """Envía una pregunta al modelo de IA y obtiene una respuesta."""
42
+ try:
43
+ response = model.generate_content(user_input)
44
+ return response.text
45
+ except Exception as e:
46
+ return f"Error al generar contenido: {e}"
47
+
48
+ def tiene_solucion_unica(matriz_coeficientes, matriz_resultados):
49
+ """Determina si un sistema de ecuaciones tiene solución única."""
50
+ try:
51
+ np.linalg.solve(matriz_coeficientes, matriz_resultados)
52
+ return True
53
+ except np.linalg.LinAlgError:
54
+ return False
55
+
56
+ def generar_ecuacion_y_respuestas():
57
+ """Genera una ecuación lineal con una solución y tres respuestas incorrectas."""
58
+ a = random.randint(1, 10)
59
+ b = random.randint(-10, 10)
60
+ c = random.randint(-10, 10)
61
+ x = (c - b) / a
62
+ respuestas_incorrectas = set()
63
+ while len(respuestas_incorrectas) < 3:
64
+ respuesta_erronea = x + random.choice([-2, -1, 1, 2]) * random.random()
65
+ respuestas_incorrectas.add(round(respuesta_erronea, 2))
66
+ respuestas = list(respuestas_incorrectas) + [round(x, 2)]
67
+ random.shuffle(respuestas)
68
+ ecuacion = f"{a}x + ({b}) = {c}" if b < 0 else f"{a}x + {b} = {c}"
69
+ return ecuacion, respuestas, round(x, 2)
70
+
71
+ def generar_sistema_ecuaciones_2x2_y_respuestas():
72
+ """Genera un sistema de ecuaciones lineales 2x2 con solución única y tres respuestas incorrectas."""
73
+ while True:
74
+ a, b, e = random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
75
+ c, d, f = random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
76
+ if tiene_solucion_unica(np.array([[a, b], [c, d]]), np.array([e, f])):
77
+ break
78
+ matriz_coeficientes = np.array([[a, b], [c, d]])
79
+ matriz_resultados = np.array([e, f])
80
+ soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
81
+ respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
82
+ round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
83
+ for _ in range(3)}
84
+ respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2))
85
+ respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
86
+ random.shuffle(respuestas)
87
+ sistema = f"{a}x + {b}y = {e}\n\n\n{c}x + {d}y = {f}"
88
+ return sistema, respuestas, respuestas_correctas
89
+
90
+ def generar_sistema_ecuaciones_3x3_y_respuestas():
91
+ """Genera un sistema de ecuaciones lineales 3x3 con solución única y tres respuestas incorrectas."""
92
+ while True:
93
+ a, b, c, e = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
94
+ d, f, g, h = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
95
+ i, j, k, l = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
96
+ matriz_coeficientes = np.array([[a, b, c], [d, f, g], [i, j, k]])
97
+ matriz_resultados = np.array([e, h, l])
98
+ if tiene_solucion_unica(matriz_coeficientes, matriz_resultados):
99
+ break
100
+ soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
101
+ respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
102
+ round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
103
+ round(soluciones[2] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
104
+ for _ in range(3)}
105
+ respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2), round(soluciones[2], 2))
106
+ respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
107
+ random.shuffle(respuestas)
108
+ sistema = f"{a}x + {b}y + {c}z = {e}\n\n\n{d}x + {f}y + {g}z = {h}\n\n\n{i}x + {j}y + {k}z = {l}"
109
+ return sistema, respuestas, respuestas_correctas
110
+
111
+ def manejar_respuesta(problema, respuesta_elegida, respuesta_correcta, nivel):
112
+ """Evalúa la respuesta del usuario, proporcionando retroalimentación y una explicación."""
113
+ tolerancia = 1e-9
114
+ correcto = False
115
+ if nivel == 2: # Sistema 3x3
116
+ correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
117
+ elif nivel == 1: # Sistema 2x2
118
+ correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
119
+ else: # Ecuación lineal
120
+ correcto = abs(respuesta_elegida - respuesta_correcta) < tolerancia
121
+ if correcto:
122
+ resultado = "¡Correcto! +1 punto."
123
+ aciertos, errores, _, _ = get_game_state()
124
+ if aciertos == 9:
125
+ st.success("Felicitaciones, has pasado al nivel Difícil: Sistemas de ecuaciones lineales 3x3")
126
+ update_game_state(aciertos + 1, errores, aciertos // 10, True)
127
+ else:
128
+ resultado = "Incorrecto, sigue practicando."
129
+ aciertos, errores, _, _ = get_game_state()
130
+ update_game_state(aciertos, errores + 1, aciertos // 10, True)
131
+ explicacion = chat_with_model(f"Explica el problema '{problema}' y por qué la respuesta {respuesta_elegida} es {'correcta' if correcto else 'incorrecta'}.")
132
+ return resultado + f" Escogiste la respuesta: {respuesta_elegida}. La respuesta correcta es: {respuesta_correcta}.\n{explicacion}"
133
+
134
+ # Interfaz de usuario y lógica de la aplicación
135
+ st.title("Desafío de Matemáticas")
136
+ st.markdown("Intenta resolver el problema y selecciona tu respuesta.")
137
+
138
+ aciertos, errores, nivel, nuevo_problema = get_game_state()
139
+
140
+ niveles = ["Principiante", "Intermedio", "Difícil"]
141
+ nivel_actual = niveles[nivel]
142
+ st.sidebar.markdown(f"Nivel: {nivel_actual}")
143
+ st.sidebar.write(f"Aciertos: {aciertos}")
144
+ st.sidebar.write(f"Errores: {errores}")
145
+
146
+ if nuevo_problema:
147
+ if nivel == 2:
148
+ problema_actual, respuestas, respuesta_correcta = generar_sistema_ecuaciones_3x3_y_respuestas()
149
+ elif nivel == 1:
150
+ problema_actual, respuestas, respuesta_correcta = generar_sistema_ecuaciones_2x2_y_respuestas()
151
+ else:
152
+ problema_actual, respuestas, respuesta_correcta = generar_ecuacion_y_respuestas()
153
+ update_game_state(aciertos, errores, nivel, False)
154
+
155
+ st.write(problema_actual)
156
+ opciones = [", ".join(map(str, r)) if isinstance(r, tuple) else str(r) for r in respuestas]
157
+ seleccion = st.radio("Elige tu respuesta", opciones, key="opciones")
158
+ respuesta_elegida = tuple(map(float, seleccion.split(', '))) if "," in seleccion else float(seleccion)
159
+
160
+ if st.button("Enviar"):
161
+ resultado = manejar_respuesta(problema_actual, respuesta_elegida, respuesta_correcta, nivel)
162
+ st.write(resultado)
163
+
164
+ boton_nuevo_problema = st.button("Generar Nuevo Problema")
165
+ if boton_nuevo_problema:
166
+ update_game_state(aciertos, errores, nivel, True)
167
+ st.experimental_rerun()