OzoneAsai commited on
Commit
b8e59d0
·
1 Parent(s): 9ebdb04

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +149 -38
app.py CHANGED
@@ -1,51 +1,162 @@
 
1
  import streamlit as st
2
- import datetime
3
- import hashlib
4
- import csv
5
 
6
- # Function to hash the IP address
7
- def hash_ip(ip_address):
8
- return hashlib.sha256(ip_address.encode()).hexdigest()[:10]
9
 
10
- # Function to save messages to CSV file
11
- def save_to_csv(messages):
12
- with open("messages.csv", mode="w", newline="", encoding="utf-8") as file:
13
- writer = csv.writer(file)
14
- writer.writerow(["Timestamp", "Name", "Message"])
15
 
16
- for msg in messages:
17
- writer.writerow([msg["timestamp"], msg["name"], msg["message"]])
 
 
 
 
 
 
 
 
18
 
19
- # Function to display messages with decoded line breaks
20
- def display_messages(messages):
21
- for msg in messages:
22
- decoded_message = msg["message"].replace("\¥n", "\n") # Fix: Replace "\¥n" with "\n"
23
- st.chat_message(f"{msg['timestamp']} - {msg['name']}: {decoded_message}")
24
 
25
- # Main Streamlit app
26
- def main():
27
- st.title("Simple IRC using Streamlit")
28
 
29
- # Initialize messages list
30
- messages = []
31
 
32
- # Chat input for sending messages
33
- user_input = st.chat_input("Your message", key="input")
34
 
35
- # Process the submitted message
36
- if user_input:
37
- # Hash the IP address as the user's name
38
- user_name = hash_ip("user_ip_address") # Replace "user_ip_address" with the actual IP address
39
 
40
- # Save the message with timestamp
41
- timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
42
- messages.append({"name": user_name, "message": user_input, "timestamp": timestamp})
43
 
44
- # Save messages to CSV
45
- save_to_csv(messages)
46
 
47
- # Display updated messages with decoded line breaks
48
- display_messages(messages)
 
 
 
 
49
 
50
- if __name__ == "__main__":
51
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 必要なライブラリをインポート
2
  import streamlit as st
3
+ from sympy import symbols, expand, factor, Eq, solve, diff, N, simplify, factorial, parse_expr
4
+ import math
5
+ from scipy.optimize import fsolve
6
 
7
+ # Streamlitアプリのタイトルを設定
8
+ st.title("数学関数アプリ")
 
9
 
 
 
 
 
 
10
 
11
+ # サイドバーに説明を追加
12
+ st.sidebar.header("機能説明")
13
+ st.sidebar.markdown("- 因数分解(Sympy)")
14
+ st.sidebar.markdown("- 展開(Sympy)")
15
+ st.sidebar.markdown("- 方程式(Sympy)")
16
+ st.sidebar.markdown("- 連立方程式(Sympy)")
17
+ st.sidebar.markdown("- nPm, nCm")
18
+ st.sidebar.markdown("- 多項式への代入計算")
19
+ st.sidebar.markdown("- ふたつの関数の交点の計算")
20
+ st.sidebar.markdown("- 三平方の定理(空欄補充)")
21
 
22
+ # Symbolの定義
23
+ #user_defined_symbol= symbols("x")
24
+ #user_defined_symbol = st.sidebar.text_input("Symbolを定義してください(カンマ区切り):")
 
 
25
 
26
+ # カンマ区切りで複数のSymbolを作成
27
+ #user_defined_symbols = symbols(user_defined_symbol.replace(" ", "").split(","))
 
28
 
 
 
29
 
 
 
30
 
 
 
 
 
31
 
32
+ # メインのコンテンツを作成
33
+ selected_function = st.sidebar.selectbox("機能を選択", ["因数分解", "展開", "方程式", "連立方程式", "nPm", "nCm", "多項式への代入計算", "関数の交点", "三平方の定理"])
 
34
 
 
 
35
 
36
+ # 因数分解
37
+ if selected_function == "因数分解":
38
+ expression = st.text_input("因数分解する式を入力してください:")
39
+ if expression:
40
+ x = symbols('x')
41
+ factored_expression = factor(expression)
42
 
43
+ # シンボルの代入
44
+ #for symbol in user_defined_symbols:
45
+ # factored_expression = factor(expression)
46
+
47
+ st.success(f"因数分解結果: {factored_expression}")
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+ # 展開(Sympy)
60
+ elif selected_function == "展開":
61
+ expression = st.text_input("展開する式を入力してください:")
62
+ if expression:
63
+ result = expand(expression)
64
+ st.success(f"展開結果: {result}")
65
+
66
+ # 方程式(Sympy)
67
+ # 方程式(Sympy)
68
+ # 方程式(Sympy)
69
+ elif selected_function == "方程式":
70
+ equation = st.text_input("解きたい方程式を入力してください:")
71
+ if equation:
72
+ x = symbols('x', real=True)
73
+ solution = solve(equation, x)
74
+ st.success(f"方程式の解: {solution}")
75
+
76
+
77
+ # 連立方程式(Sympy)
78
+ elif selected_function == "連立方程式":
79
+ eq1 = st.text_input("1つ目の方程式を入力してください:")
80
+ eq2 = st.text_input("2つ目の方程式を入力してください:")
81
+ if eq1 and eq2:
82
+ x, y = symbols('x y', real=True)
83
+ solution = solve([Eq(eval(eq1), 0), Eq(eval(eq2), 0)], (x, y))
84
+ st.success(f"連立方程式の解: {solution}")
85
+
86
+ # nPm
87
+ elif selected_function == "nPm":
88
+ n = st.number_input("nを入力してください:", min_value=0, step=1)
89
+ m = st.number_input("mを入力してください:", min_value=0, step=1)
90
+ if n >= m:
91
+ result = factorial(n) / factorial(n - m)
92
+ st.success(f"{n}P{m}の結果: {result}")
93
+
94
+ # nCm
95
+ elif selected_function == "nCm":
96
+ n = st.number_input("nを入力してください:", min_value=0, step=1)
97
+ m = st.number_input("mを入力してください:", min_value=0, step=1)
98
+ if n >= m:
99
+ result = math.comb(n, m)
100
+ st.success(f"{n}C{m}の結果: {result}")
101
+
102
+ # 多項式への代入計算
103
+ elif selected_function == "多項式への代入計算":
104
+ poly_expression = st.text_input("多項式を入力してください:")
105
+ value_to_substitute = st.number_input("代入する値を入力してください:")
106
+ if poly_expression:
107
+ x = symbols('x', real=True)
108
+ poly = simplify(poly_expression)
109
+ result = poly.subs(x, value_to_substitute)
110
+ st.success(f"代入計算の結果: {result}")
111
+
112
+ # ふたつの関数の交点の計算
113
+ elif selected_function == "関数の交点":
114
+ func1_expression = st.text_input("1つ目の関数を入力してください:")
115
+ func2_expression = st.text_input("2つ目の関数を入力してください:")
116
+ if func1_expression and func2_expression:
117
+ x = symbols('x', real=True)
118
+ func1 = simplify(parse_expr(func1_expression))
119
+ func2 = simplify(parse_expr(func2_expression))
120
+
121
+ # 関数を数値的に解くためのラムダ関数
122
+ equation_system = lambda x: [func1.subs('x', x[0]) - func2.subs('x', x[0]),
123
+ func1.subs('x', x[1]) - func2.subs('x', x[1])]
124
+
125
+ # 初期値の設定
126
+ initial_guess = [0, 0]
127
+
128
+ # fsolveを使用して交点を求める
129
+ intersection_points = fsolve(equation_system, initial_guess)
130
+
131
+ st.success(f"関数の交点の座標: {tuple(intersection_points)}")
132
+
133
+
134
+ # 三平方の定理(空欄補充)
135
+ elif selected_function == "三平方の定理":
136
+ case = st.radio("三平方の定理のケースを選択してください:", ["Case1", "Case2", "Case3"])
137
+
138
+ if case == "Case1":
139
+ a = st.number_input("aの値を入力してください:")
140
+ b = st.number_input("bの値を入力してください:")
141
+ c_squared = a**2 + b**2
142
+ st.success(f"三平方の定理の結果: a^2 + b^2 = c^2, c^2 = {c_squared}")
143
+
144
+ elif case == "Case2":
145
+ a = st.number_input("aの値を入力してください:")
146
+ c = st.number_input("cの値を入力してください:")
147
+ b_squared = c**2 - a**2
148
+ if b_squared >= 0:
149
+ b = b_squared**0.5
150
+ st.success(f"三平方の定理の結果: a^2 + b^2 = c^2, b^2 = {b_squared}, b = {b}")
151
+ else:
152
+ st.error("無効な値です。b^2は負になりません。")
153
+
154
+ elif case == "Case3":
155
+ b = st.number_input("bの値を入力してください:")
156
+ c = st.number_input("cの値を入力してください:")
157
+ a_squared = c**2 - b**2
158
+ if a_squared >= 0:
159
+ a = a_squared**0.5
160
+ st.success(f"三平方の定理の結果: a^2 + b^2 = c^2, a^2 = {a_squared}, a = {a}")
161
+ else:
162
+ st.error("無効な値です。a^2は負になりません。")