File size: 8,747 Bytes
dd69d15
 
 
 
17cf05a
dd69d15
c04fdac
 
 
 
 
0843819
dd69d15
 
5facbbe
dd69d15
 
 
 
1930bfd
dd69d15
 
5facbbe
dd69d15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11c6ce7
 
 
38897c3
 
1930bfd
dd69d15
 
 
11c6ce7
dd69d15
 
 
 
 
 
 
 
11c6ce7
 
 
dd69d15
11c6ce7
dd69d15
1930bfd
38897c3
1930bfd
dd69d15
 
 
11c6ce7
dd69d15
 
38897c3
11c6ce7
f05565e
 
11c6ce7
 
d8f5365
 
 
 
11c6ce7
1930bfd
d8f5365
 
 
 
11c6ce7
2a34526
d8f5365
 
 
 
38897c3
5facbbe
11c6ce7
38897c3
11c6ce7
 
38897c3
11c6ce7
 
38897c3
5facbbe
11c6ce7
38897c3
 
 
26f7970
dd69d15
 
 
 
38897c3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd69d15
1930bfd
38897c3
1930bfd
38897c3
 
dd69d15
38897c3
 
 
dd69d15
 
 
38897c3
dd69d15
38897c3
 
dd69d15
1930bfd
 
38897c3
d8f5365
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
import streamlit as st
import os
import random
import numpy as np
import google.generativeai as genai

# Configuración de la API KEY
gemini_api_key = os.getenv("GEMINI_API_KEY")
if gemini_api_key is None:
    raise ValueError("La variable de entorno GEMINI_API_KEY no está configurada.")
genai.configure(api_key=gemini_api_key)
model = genai.GenerativeModel('gemini-1.5-flash-latest')

def chat_with_model(user_input):
    """Envía una pregunta al modelo de IA y obtiene una respuesta."""
    try:
        response = model.generate_content(user_input)
        return response.text
    except Exception as e:
        return f"Error al generar contenido: {e}"

def tiene_solucion_unica(matriz_coeficientes, matriz_resultados):
    """Determina si un sistema de ecuaciones tiene solución única."""
    try:
        np.linalg.solve(matriz_coeficientes, matriz_resultados)
        return True
    except np.linalg.LinAlgError:
        return False

def generar_ecuacion_y_respuestas():
    """Genera una ecuación lineal con una solución y tres respuestas incorrectas."""
    a = random.randint(1, 10)
    b = random.randint(-10, 10)
    c = random.randint(-10, 10)
    x = (c - b) / a
    respuestas_incorrectas = set()
    while len(respuestas_incorrectas) < 3:
        respuesta_erronea = x + random.choice([-2, -1, 1, 2]) * random.random()
        respuestas_incorrectas.add(round(respuesta_erronea, 2))
    respuestas = list(respuestas_incorrectas) + [round(x, 2)]
    random.shuffle(respuestas)
    ecuacion = f"{a}x + ({b}) = {c}" if b < 0 else f"{a}x + {b} = {c}"
    return ecuacion, respuestas, round(x, 2)

def generar_sistema_ecuaciones_2x2_y_respuestas():
    """Genera un sistema de ecuaciones lineales 2x2 con solución única y tres respuestas incorrectas."""
    while True:
        a, b, e = random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
        c, d, f = random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
        if tiene_solucion_unica(np.array([[a, b], [c, d]]), np.array([e, f])):
            break
    matriz_coeficientes = np.array([[a, b], [c, d]])
    matriz_resultados = np.array([e, f])
    soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
    respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
                               round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
                              for _ in range(3)}
    respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2))
    respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
    random.shuffle(respuestas)
    sistema = f"{a}x + {b}y = {e}\n\n\n{c}x + {d}y = {f}"
    return sistema, respuestas, respuestas_correctas

def generar_sistema_ecuaciones_3x3_y_respuestas():
    """Genera un sistema de ecuaciones lineales 3x3 con solución única y tres respuestas incorrectas."""
    while True:
        a, b, c, e = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
        d, f, g, h = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
        i, j, k, l = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
        matriz_coeficientes = np.array([[a, b, c], [d, f, g], [i, j, k]])
        matriz_resultados = np.array([e, h, l])
        if tiene_solucion_unica(matriz_coeficientes, matriz_resultados):
            break
    soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
    respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
                               round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
                               round(soluciones[2] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
                              for _ in range(3)}
    respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2), round(soluciones[2], 2))
    respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
    random.shuffle(respuestas)
    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}"
    return sistema, respuestas, respuestas_correctas

def manejar_respuesta(problema, respuesta_elegida, respuesta_correcta, nivel):
    """Evalúa la respuesta del usuario, proporcionando retroalimentación y una explicación."""
    tolerancia = 1e-9
    correcto = False
    if nivel == 2:  # Sistema 3x3
        correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
        if correcto:
            explicacion = chat_with_model(f"Explica el sistema de ecuaciones lineales 3x3 '{problema}' y por qué la respuesta {respuesta_elegida} es correcta.")
        else:
            explicacion = chat_with_model(f"Explica el sistema de ecuaciones lineales 3x3 '{problema}' y por qué la respuesta {respuesta_elegida} es incorrecta.")
    elif nivel == 1:  # Sistema 2x2
        correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
        if correcto:
            explicacion = chat_with_model(f"Explica el sistema de ecuaciones lineales 2x2 '{problema}' y por qué la respuesta {respuesta_elegida} es correcta.")
        else:
            explicacion = chat_with_model(f"Explica el sistema de ecuaciones lineales 2x2 '{problema}' y por qué la respuesta {respuesta_elegida} es incorrecta.")
    else:  # Ecuación lineal
        correcto = abs(respuesta_elegida - respuesta_correcta) < tolerancia
        if correcto:
            explicacion = chat_with_model(f"Explica la ecuación lineal '{problema}' y por qué la respuesta {respuesta_elegida} es correcta.")
        else:
            explicacion = chat_with_model(f"Explica la ecuación lineal '{problema}' y por qué la respuesta {respuesta_elegida} es incorrecta.")

    if correcto:
        resultado = "¡Correcto! +1 punto."
        if st.session_state.aciertos >= 5 and nivel == 0:
            nivel = 1
            st.success("¡Felicitaciones, has pasado al nivel Intermedio: Sistemas de ecuaciones lineales 2x2!")
        elif st.session_state.aciertos >= 10 and nivel == 1:
            nivel = 2
            st.success("¡Felicitaciones, has pasado al nivel Difícil: Sistemas de ecuaciones lineales 3x3!")
        st.session_state.aciertos += 1
    else:
        resultado = "Incorrecto, sigue practicando."
        st.session_state.errores += 1

    return resultado + f" Escogiste la respuesta: {respuesta_elegida}. La respuesta correcta es: {respuesta_correcta}.\n{explicacion}", nivel

# Interfaz de usuario y lógica de la aplicación
st.title("Desafío de Matemáticas")
st.markdown("Intenta resolver el problema y selecciona tu respuesta.")

if 'aciertos' not in st.session_state:
    st.session_state.aciertos = 0
if 'errores' not in st.session_state:
    st.session_state.errores = 0
if 'nivel' not in st.session_state:
    st.session_state.nivel = 0

if 'nuevo_problema' not in st.session_state or st.session_state.nuevo_problema:
    st.session_state.nuevo_problema = False
    if st.session_state.nivel == 2:
        problema_actual, respuestas, respuesta_correcta = generar_sistema_ecuaciones_3x3_y_respuestas()
    elif st.session_state.nivel == 1:
        problema_actual, respuestas, respuesta_correcta = generar_sistema_ecuaciones_2x2_y_respuestas()
    else:
        problema_actual, respuestas, respuesta_correcta = generar_ecuacion_y_respuestas()
    st.session_state.problema = problema_actual
    st.session_state.respuestas = respuestas
    st.session_state.respuesta_correcta = respuesta_correcta

niveles = ["Principiante", "Intermedio", "Difícil"]
nivel_actual = niveles[st.session_state.nivel]
st.sidebar.markdown(f"Nivel: {nivel_actual}")
st.sidebar.write(f"Aciertos: {st.session_state.aciertos}")
st.sidebar.write(f"Errores: {st.session_state.errores}")

st.write(st.session_state.problema)
opciones = [f"{r[0]}, {r[1]}" if isinstance(r, tuple) else str(r) for r in st.session_state.respuestas]
seleccion = st.radio("Elige tu respuesta", opciones, key="opciones")
respuesta_elegida = tuple(map(float, seleccion.split(', '))) if "," in seleccion else float(seleccion)

if st.button("Enviar"):
    resultado, nuevo_nivel = manejar_respuesta(st.session_state.problema, respuesta_elegida, st.session_state.respuesta_correcta, st.session_state.nivel)
    st.write(resultado)
    st.session_state.nivel = nuevo_nivel
    st.session_state.nuevo_problema = True

boton_nuevo_problema = st.button("Generar Nuevo Problema")
if boton_nuevo_problema:
    st.session_state.nuevo_problema = True
    st.experimental_rerun()