-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrational_tangle_calculator.py
More file actions
182 lines (137 loc) · 8.53 KB
/
Copy pathrational_tangle_calculator.py
File metadata and controls
182 lines (137 loc) · 8.53 KB
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
import streamlit as st
# Funciones para realizar las conversiones
from convertir_a_fraccion_continua import convertir_a_fraccion_continua
from convertir_a_tangle import convertir_a_tangle
from calcular_numero_racional_desde_tangle import calcular_numero_racional_como_par
from imprimir_fraccion_continua import imprimir_fraccion_continua_markdown
from actualizar_tangle import actualizar_tangle
from deshacer_ultimo_movimiento import deshacer_ultimo_movimiento
from calcular_inverso import calcular_inverso
import re
from PIL import Image
import requests
from io import BytesIO
image_url = "https://i.ibb.co/JzxGZx1/john-horton-conway-cce2e129-4f44-42cf-b3e8-bd390287f9e-resize-750-removebg-preview.png"
def es_entrada_valida(tangle_input):
# Patrón de expresión regular para validar la entrada
patron = r'^([RT](\^\d+)?)+$'
return bool(re.match(patron, tangle_input))
sidebar_text = """
### Acerca de la Aplicación
Esta aplicación interactiva ofrece una herramienta para explorar el fascinante mundo de los enredos racionales de Conway.
**Funcionalidades:**
- **Conversión de Números Racionales a Enredos:** Introduce un número racional y observa su correspondiente enredo.
- **Conversión de Enredos a Números Racionales:** Explora cómo una secuencia de movimientos de rotación y torsión se traduce de nuevo a un número racional, revelando la relación entre estos dos mundos.
- **Análisis Interactivo de Tangles:** Manipula enredos en tiempo real para ver cómo afectan al número racional resultante, permitiendo un aprendizaje profundo y una experimentación intuitiva.
**¡Explora, aprende y diviértete!**
"""
def main():
st.title('🤖 Calculadora de Enredos Racionales de Conway 🤖')
st.markdown("Autor: [José Delgado](https://github.com/hypergalois/rationalTangles)")
st.markdown("""
<style>
div.stButton > button:first-child {background-color: #4fa8f6; color: white;}
</style>""", unsafe_allow_html=True)
st.sidebar.title('Bienvenido')
# Hacer una solicitud para obtener el contenido de la imagen
response = requests.get(image_url)
image = Image.open(BytesIO(response.content))
# Mostrar la imagen en la barra lateral
st.sidebar.image(image, caption='John Conway', use_column_width=True)
st.sidebar.markdown(sidebar_text)
st.header('1. Conversión de Número Racional a Enredo')
with st.expander("Enredo Racional"):
st.write("Un enredo racional es cualquier enredo que puede ser obtenido mediante las operaciones de Torsión y Rotación. A cada enredo le asociamos un número racional que lo describe únicamente y viceversa.")
with st.form(key='mi_formulario'):
col_num, col_den = st.columns(2)
with col_num:
numerador = st.text_input('Ingrese el numerador:', '18', key='numerador')
with col_den:
denominador = st.text_input('Ingrese el denominador:', '11', key='denominador')
submit_button = st.form_submit_button(label='Convertir a Enredo')
if submit_button:
try:
numerador = int(numerador) if numerador else 0
denominador = int(denominador) if denominador else 1
if denominador == 0:
st.error("El denominador no puede ser cero.")
else:
fraccion_continua = convertir_a_fraccion_continua(numerador, denominador)
tangle = convertir_a_tangle(fraccion_continua)
st.latex(f'\\frac{{{numerador}}}{{{denominador}}} \sim {tangle}')
st.latex(f'{imprimir_fraccion_continua_markdown(fraccion_continua)}')
except ValueError:
st.error("Por favor, ingrese solo números enteros.")
st.header('2. Conversión de Enredo a Número Racional')
with st.form(key='form_tangle_racional'):
tangle_input = st.text_input('Ingrese una secuencia de enredo (ejemplo: "RTTRT"):', 'T^3RT^2RT^2RT')
submit_button = st.form_submit_button(label='Convertir a Número Racional')
if submit_button:
if es_entrada_valida(tangle_input):
numerador, denominador = calcular_numero_racional_como_par(tangle_input)
fraccion_continua = convertir_a_fraccion_continua(numerador, denominador)
st.latex(f'{tangle_input} \sim \\frac{{{numerador}}}{{{denominador}}}')
st.latex(f'{imprimir_fraccion_continua_markdown(fraccion_continua)}')
else:
st.error("Entrada inválida. Por favor, ingrese una secuencia válida con 'R', 'T', '^' y números naturales.")
st.header('3. Construcción y Análisis de Enredos')
if 'tangle' not in st.session_state:
st.session_state.tangle = ""
st.session_state.tangle_number = (0, 1)
st.session_state.historial_movimientos = []
st.session_state.historial_tangles = [st.session_state.tangle]
st.session_state.historial_numeros = [st.session_state.tangle_number]
st.session_state.fraccion_continua = []
st.session_state.historial_fracciones = [st.session_state.fraccion_continua]
col1, col2, col3, col4 = st.columns(4)
with col1:
if st.button("Rotación (R)"):
st.session_state.tangle = actualizar_tangle(st.session_state.tangle, 'R')
st.session_state.tangle_number = calcular_numero_racional_como_par(st.session_state.tangle)
st.session_state.fraccion_continua = convertir_a_fraccion_continua(st.session_state.tangle_number[0], st.session_state.tangle_number[1])
st.session_state.historial_movimientos.append('R')
st.session_state.historial_tangles.append(st.session_state.tangle)
st.session_state.historial_numeros.append(st.session_state.tangle_number)
st.session_state.historial_fracciones.append(st.session_state.fraccion_continua)
with col2:
if st.button("Torsión (T)"):
st.session_state.tangle = actualizar_tangle(st.session_state.tangle, 'T')
st.session_state.tangle_number = calcular_numero_racional_como_par(st.session_state.tangle)
st.session_state.fraccion_continua = convertir_a_fraccion_continua(st.session_state.tangle_number[0], st.session_state.tangle_number[1])
st.session_state.historial_movimientos.append('T')
st.session_state.historial_tangles.append(st.session_state.tangle)
st.session_state.historial_numeros.append(st.session_state.tangle_number)
st.session_state.historial_fracciones.append(st.session_state.fraccion_continua)
with col3:
if st.button("Deshacer"):
if len(st.session_state.historial_movimientos) > 0:
tangle_anterior, par_numerico_anterior, fraccion_anterior, historial_movimientos_anterior = deshacer_ultimo_movimiento(st.session_state.historial_tangles, st.session_state.historial_numeros, st.session_state.historial_fracciones, st.session_state.historial_movimientos)
st.session_state.tangle = tangle_anterior
st.session_state.tangle_number = par_numerico_anterior
st.session_state.historial_movimientos = historial_movimientos_anterior
st.session_state.fraccion_continua = fraccion_anterior
else:
st.error("No hay movimientos para deshacer.")
with col4:
if st.button("Reiniciar"):
st.session_state.tangle = ""
st.session_state.tangle_number = (0, 1)
st.session_state.historial_movimientos = []
st.session_state.historial_tangles = [st.session_state.tangle]
st.session_state.historial_numeros = [st.session_state.tangle_number]
st.session_state.fraccion_continua = []
st.session_state.historial_fracciones = [st.session_state.fraccion_continua]
st.markdown("#### Numero Enredo")
if st.session_state.tangle_number != (0, 1):
st.latex(f"\\frac{{{st.session_state.tangle_number[0]}}}{{{st.session_state.tangle_number[1]}}}")
st.markdown("#### Palabra Enredo")
if st.session_state.tangle != "":
st.latex(f"{st.session_state.tangle}")
st.markdown("#### Fracción Continua")
if st.session_state.fraccion_continua != []:
st.latex(f"{imprimir_fraccion_continua_markdown(st.session_state.fraccion_continua)}")
st.markdown("#### Enredo Inverso")
if st.session_state.fraccion_continua != []:
st.latex(f"{calcular_inverso(st.session_state.tangle_number[0], st.session_state.tangle_number[1])}")
if __name__ == '__main__':
main()