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