1+ #change num
2+ from chinese_num_transform import chinese_in_string_transform
3+ #re
4+ import re
5+ #numpy
6+ import numpy as np
7+
8+ def equation (self ):
9+ self .line_speaker ('請講一下是甚麼題目讓你連一元一次方程式都不會解的?' )
10+ self .line_speaker ('先講一下題目有幾個變數?' )
11+ # ex: 兩個 -> 2
12+ var_num = int (chinese_in_string_transform (self .listener ())[:- 1 ])
13+ self .line_speaker ('有{}個變數,請說{}個方程式。' .format (var_num ,var_num ))
14+ # AX=B
15+ A = np .array ([[0 ]* var_num for _ in range (var_num )])
16+ B = np .array ([[0 ] for _ in range (var_num )])
17+ X = np .array ([[None ] for _ in range (var_num )])
18+ for i in range (var_num ):
19+ math_line = self .listener ()
20+ math_line = re .sub (r'[負副富]+' ,'-' ,math_line )
21+ math_line = re .sub (r'等於' ,'=' ,math_line )
22+ math_line = re .sub (r'(?<=\D)(?=[xyz])|^(?=[xyz])' ,'1' ,math_line )
23+ math_line = chinese_in_string_transform (math_line )
24+ if var_num >= 1 :
25+ finda = re .findall (r'([\+\-\d]+)x' ,math_line )
26+ A [i ][0 ] = int (finda [0 ]) if len (finda )>= 1 else 0
27+ if var_num >= 2 :
28+ finda = re .findall (r'x?([\+\-\d]+)y' ,math_line )
29+ A [i ][1 ] = int (finda [0 ]) if len (finda )>= 1 else 0
30+ if var_num >= 3 :
31+ finda = re .findall (r'x?y?([\+\-\d]+)z' ,math_line )
32+ A [i ][2 ] = int (finda [0 ]) if len (finda )>= 1 else 0
33+ findx = re .findall (r'=(.*)' ,math_line )
34+ B [i ][0 ] = int (findx [0 ]) if len (findx )>= 1 else 0
35+ have_ans = True
36+ try :
37+ X = np .linalg .inv (A ).dot (B )
38+ except :
39+ have_ans = False
40+ if have_ans :
41+ if var_num == 1 :
42+ self .line_speaker ('X等於{}' .format (X [0 ][0 ]))
43+ elif var_num == 2 :
44+ self .line_speaker ('X等於{}\n Y等於{}' .format (X [0 ][0 ],X [1 ][0 ]))
45+ else :
46+ self .line_speaker ('X等於{}\n Y等於{}Z等於{}' .format (X [0 ][0 ],X [1 ][0 ],X [2 ][0 ]))
47+ else :
48+ self .line_speaker ('此題無解^_^' )
0 commit comments