回答編集履歴
30
fix code
test
CHANGED
@@ -50,7 +50,7 @@
|
|
50
50
|
return f"\\{op}\\left({ex}\\right)"
|
51
51
|
pm = {"add": "+", "sub": "-"}
|
52
52
|
if op in pm.keys():
|
53
|
-
if parent_op == "mul": # requirement priority bracket
|
53
|
+
if parent_op == "mul" or parent_op == "sub": # requirement priority bracket
|
54
54
|
return f"\\left({ex[0]} {pm[op]} {ex[1]}\\right)"
|
55
55
|
else:
|
56
56
|
return f"{ex[0]} {pm[op]} {ex[1]}"
|
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
また,`latexify`時に括弧に付けた`\left`と`\right`ですが,これは式のサイズに括弧のサイズを合わせるようなオプションです.付けなくても動きますが見づらいと思い,追加しておきました.さらに,関数表記において三角関数や対数関数,指数関数などは斜体ではなく立体で書く必要があるので`\sin`のようにしました.TeXに用意されている初等関数は大抵`\`をつけるだけで立体になります(そのぐらい立体にするのが当たり前です).
|
88
88
|
|
89
|
-
また,掛け算は`\times`でなく`\cdot`でも良いと思います.ベクトルの場合に外積と内積で意味が異なりますので覚えておくと良いでしょう.さらに掛け算に,積より優先順位の低い演算である和と差が並んだ場合を考慮して,`parent_op`が`mul`であった場合の和と差には括弧を付与するようにしています(今回は存在しませんが念の為).
|
89
|
+
また,掛け算は`\times`でなく`\cdot`でも良いと思います.ベクトルの場合に外積と内積で意味が異なりますので覚えておくと良いでしょう.さらに掛け算に,積より優先順位の低い演算である和と差が並んだ場合や`sub(x,sub(y,z))`を考慮して,`parent_op`が`mul`or`sub`であった場合の和と差には括弧を付与するようにしています(今回は存在しませんが念の為).
|
90
90
|
|
91
91
|
もうちょっと`parent_op`に対する制御を書けば`add(x,-1)`のようなケースも`sub(x,1)`であるかのように対応できますが,わかりづらくなると思うので`replace()`で対応しています.
|
92
92
|
|
29
fix context and mul priority
test
CHANGED
@@ -28,9 +28,9 @@
|
|
28
28
|
cnt += 1
|
29
29
|
elif ch == ')':
|
30
30
|
cnt -= 1
|
31
|
-
if ch == ',' and not cnt:
|
31
|
+
if ch == ',' and not cnt:
|
32
|
-
return x[:i], x[i + 1:]
|
32
|
+
return x[:i], x[i + 1:] # expression1, expression2
|
33
|
-
assert False, f"not found outer comma, incorrect bracket or comma style"
|
33
|
+
assert False, f"not found outer comma, incorrect bracket or comma style on '{x}'"
|
34
34
|
|
35
35
|
def getArity(op):
|
36
36
|
if op in ["sin","cos","tan","log","exp","sqrt"]:
|
@@ -39,7 +39,7 @@
|
|
39
39
|
return 2
|
40
40
|
assert False, f"not defined operator '{op}'"
|
41
41
|
|
42
|
-
def latexify(op, ex):
|
42
|
+
def latexify(op, ex, parent_op):
|
43
43
|
if op == None:
|
44
44
|
if ex == "pi":
|
45
45
|
return "\\pi"
|
@@ -48,27 +48,35 @@
|
|
48
48
|
return "\\sqrt{" + ex + "}"
|
49
49
|
if getArity(op) == 1:
|
50
50
|
return f"\\{op}\\left({ex}\\right)"
|
51
|
-
|
51
|
+
pm = {"add": "+", "sub": "-"}
|
52
|
-
if op in
|
52
|
+
if op in pm.keys():
|
53
|
+
if parent_op == "mul": # requirement priority bracket
|
54
|
+
return f"\\left({ex[0]} {pm[op]} {ex[1]}\\right)"
|
55
|
+
else:
|
53
|
-
return f"{ex[0]} {
|
56
|
+
return f"{ex[0]} {pm[op]} {ex[1]}"
|
57
|
+
if op == "mul":
|
58
|
+
return f"{ex[0]} \\times {ex[1]}"
|
54
59
|
if op == "div":
|
55
60
|
return "\\frac{" + ex[0] + "}{" + ex[1] + "}"
|
56
61
|
|
57
62
|
assert False, f"not defined latexify operator '{op}'"
|
58
63
|
|
59
|
-
def re
|
64
|
+
def dfs(S, parent_op = None): # recursion function
|
60
|
-
if not S.count('('): # only value
|
65
|
+
if not S.count('('): # only value
|
61
|
-
return latexify(None, S)
|
66
|
+
return latexify(None, S, parent_op)
|
62
|
-
op, ex = split_op_ex(S)
|
67
|
+
op, ex = split_op_ex(S) # operator(expression) -> operator, expression
|
63
68
|
arity = getArity(op)
|
64
69
|
if arity == 1:
|
65
|
-
return latexify(op,
|
70
|
+
return latexify(op, dfs(ex, op), parent_op)
|
66
71
|
if arity == 2:
|
67
|
-
return latexify(op, list(map(
|
72
|
+
return latexify(op, list(map(lambda x: dfs(x, op), split_comma(ex))), parent_op)
|
73
|
+
|
74
|
+
def translate(S):
|
75
|
+
return dfs(S).replace("+ -", "- ").replace("- -", "+ ")
|
68
76
|
|
69
77
|
string = "div(cos(mul(0.5,0.1)),cos(add(cos(add(sin(e),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))),mul(div(div(div(0.1,div(div(e,x),div(0.1,e))),div(div(e,add(x,-1)),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),x),div(0.1,div(div(e,x),div(0.1,e))))),div(div(0.1,div(div(e,x),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))))))"
|
70
|
-
print(re
|
78
|
+
print(translate(string))
|
71
|
-
print(re
|
79
|
+
print(translate("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
72
80
|
```
|
73
81
|
`add(x,-1)`のときに`x + -1`になるので,`.replace("+ -", "- ")`しています.今回入力に`sub(x,-1)`は無いですが今後のため`.replace("- -", "+ ")`を付加しています.
|
74
82
|
```shell:標準出力
|
@@ -76,8 +84,10 @@
|
|
76
84
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
77
85
|
```
|
78
86
|
|
79
|
-
また,`latexify`時に括弧に付けた`\left`と`\right`ですが,これは式のサイズに括弧のサイズを合わせるようなオプションです.付けなくても動きますが見づらいと思い,追加しておきました.さらに,関数表記において三角関数や対数関数,指数関数などは斜体ではなく立体で書く必要があるので`\sin`のようにしました.TeXに用意されている初等関数は大抵`\`をつけるだけで立体になります.
|
87
|
+
また,`latexify`時に括弧に付けた`\left`と`\right`ですが,これは式のサイズに括弧のサイズを合わせるようなオプションです.付けなくても動きますが見づらいと思い,追加しておきました.さらに,関数表記において三角関数や対数関数,指数関数などは斜体ではなく立体で書く必要があるので`\sin`のようにしました.TeXに用意されている初等関数は大抵`\`をつけるだけで立体になります(そのぐらい立体にするのが当たり前です).
|
80
88
|
|
81
|
-
また,掛け算は`\times`でなく`\cdot`でも良いと思います.ベクトルの場合に外積と内積で意味が異なりますので覚えておくと良いでしょう.
|
89
|
+
また,掛け算は`\times`でなく`\cdot`でも良いと思います.ベクトルの場合に外積と内積で意味が異なりますので覚えておくと良いでしょう.さらに掛け算に,積より優先順位の低い演算である和と差が並んだ場合を考慮して,`parent_op`が`mul`であった場合の和と差には括弧を付与するようにしています(今回は存在しませんが念の為).
|
90
|
+
|
91
|
+
もうちょっと`parent_op`に対する制御を書けば`add(x,-1)`のようなケースも`sub(x,1)`であるかのように対応できますが,わかりづらくなると思うので`replace()`で対応しています.
|
82
92
|
|
83
93
|
![latexit](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/5fc4f39a-56ed-48d9-8bd2-bb224e467bcb.png)
|
28
fix code context
test
CHANGED
@@ -32,12 +32,12 @@
|
|
32
32
|
return x[:i], x[i + 1:]
|
33
33
|
assert False, f"not found outer comma, incorrect bracket or comma style"
|
34
34
|
|
35
|
-
def getArity(
|
35
|
+
def getArity(op):
|
36
|
-
if
|
36
|
+
if op in ["sin","cos","tan","log","exp","sqrt"]:
|
37
37
|
return 1
|
38
|
-
if
|
38
|
+
if op in ["add","sub","mul","div"]: # 四則演算記号
|
39
39
|
return 2
|
40
|
-
assert False, f"not defined operator '{
|
40
|
+
assert False, f"not defined operator '{op}'"
|
41
41
|
|
42
42
|
def latexify(op, ex):
|
43
43
|
if op == None:
|
@@ -54,7 +54,7 @@
|
|
54
54
|
if op == "div":
|
55
55
|
return "\\frac{" + ex[0] + "}{" + ex[1] + "}"
|
56
56
|
|
57
|
-
assert False, f"not defined latexify operator '{
|
57
|
+
assert False, f"not defined latexify operator '{op}'"
|
58
58
|
|
59
59
|
def rec(S): # recursion function
|
60
60
|
if not S.count('('): # only value
|
27
rename dfs to rec
test
CHANGED
@@ -56,19 +56,19 @@
|
|
56
56
|
|
57
57
|
assert False, f"not defined latexify operator '{ex}'"
|
58
58
|
|
59
|
-
def
|
59
|
+
def rec(S): # recursion function
|
60
60
|
if not S.count('('): # only value
|
61
61
|
return latexify(None, S)
|
62
62
|
op, ex = split_op_ex(S)
|
63
63
|
arity = getArity(op)
|
64
64
|
if arity == 1:
|
65
|
-
return latexify(op,
|
65
|
+
return latexify(op, rec(ex))
|
66
66
|
if arity == 2:
|
67
|
-
return latexify(op, list(map(
|
67
|
+
return latexify(op, list(map(rec, split_comma(ex))))
|
68
68
|
|
69
69
|
string = "div(cos(mul(0.5,0.1)),cos(add(cos(add(sin(e),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))),mul(div(div(div(0.1,div(div(e,x),div(0.1,e))),div(div(e,add(x,-1)),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),x),div(0.1,div(div(e,x),div(0.1,e))))),div(div(0.1,div(div(e,x),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))))))"
|
70
|
-
print(
|
70
|
+
print(rec(string).replace("+ -", "- ").replace("- -", "+ "))
|
71
|
-
print(
|
71
|
+
print(rec("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
72
72
|
```
|
73
73
|
`add(x,-1)`のときに`x + -1`になるので,`.replace("+ -", "- ")`しています.今回入力に`sub(x,-1)`は無いですが今後のため`.replace("- -", "+ ")`を付加しています.
|
74
74
|
```shell:標準出力
|
26
delete space
test
CHANGED
@@ -70,7 +70,7 @@
|
|
70
70
|
print(dfs(string).replace("+ -", "- ").replace("- -", "+ "))
|
71
71
|
print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
72
72
|
```
|
73
|
-
`add(x,-1)`のときに`x + -1`になるので,`.replace("+ -", "- ")`しています.今回入力に`sub(x,
|
73
|
+
`add(x,-1)`のときに`x + -1`になるので,`.replace("+ -", "- ")`しています.今回入力に`sub(x,-1)`は無いですが今後のため`.replace("- -", "+ ")`を付加しています.
|
74
74
|
```shell:標準出力
|
75
75
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}\right) + \frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x - 1}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}} \times \frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}}\right)}
|
76
76
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
25
fix context
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
具体的には,演算子`operator`と括弧の中身`expression`の抜き出しを`split_op_ex(x)`で行い,`arity`によってコンマ区切りの有無の判定を利用した再帰になっています.`arity = 2`であればコンマ区切りされている`operator(expression1,expression2)`状態なので,コンマの位置を関数`split_comma(x)`にて特定&分割,それぞれの`expression`を再帰により評価します.
|
8
8
|
|
9
|
-
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
9
|
+
再帰関数自体8行しかなく,そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
10
10
|
|
11
11
|
```Python
|
12
12
|
def split_op_ex(x): # operator(expression)の形式のときoperatorとexpressionを返す
|
@@ -70,10 +70,14 @@
|
|
70
70
|
print(dfs(string).replace("+ -", "- ").replace("- -", "+ "))
|
71
71
|
print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
72
72
|
```
|
73
|
-
|
73
|
+
`add(x,-1)`のときに`x + -1`になるので,`.replace("+ -", "- ")`しています.今回入力に`sub(x, -1)`は無いですが今後のため`.replace("- -", "+ ")`を付加しています.
|
74
74
|
```shell:標準出力
|
75
75
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}\right) + \frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x - 1}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}} \times \frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}}\right)}
|
76
76
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
77
77
|
```
|
78
78
|
|
79
|
+
また,`latexify`時に括弧に付けた`\left`と`\right`ですが,これは式のサイズに括弧のサイズを合わせるようなオプションです.付けなくても動きますが見づらいと思い,追加しておきました.さらに,関数表記において三角関数や対数関数,指数関数などは斜体ではなく立体で書く必要があるので`\sin`のようにしました.TeXに用意されている初等関数は大抵`\`をつけるだけで立体になります.
|
80
|
+
|
81
|
+
また,掛け算は`\times`でなく`\cdot`でも良いと思います.ベクトルの場合に外積と内積で意味が異なりますので覚えておくと良いでしょう.
|
82
|
+
|
79
83
|
![latexit](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/5fc4f39a-56ed-48d9-8bd2-bb224e467bcb.png)
|
24
add stdout
test
CHANGED
@@ -71,4 +71,9 @@
|
|
71
71
|
print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
72
72
|
```
|
73
73
|
また,`latexify`時に括弧に付けた`\left`と`\right`ですが,これは式のサイズに括弧のサイズを合わせるようなオプションです.付けなくても動きますが見づらいと思い,追加しておきました.また,掛け算は`\times`でなく`\cdot`でも良いと思います.ベクトルの場合に外積と内積で意味が異なりますので覚えておくと良いでしょう.
|
74
|
-
|
74
|
+
```shell:標準出力
|
75
|
+
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}\right) + \frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x - 1}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}} \times \frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}}\right)}
|
76
|
+
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
77
|
+
```
|
78
|
+
|
79
|
+
![latexit](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/5fc4f39a-56ed-48d9-8bd2-bb224e467bcb.png)
|
23
fix code
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
基本方針は,文字列が`operator(expression)`という形式であることを利用して,演算子`operator`と括弧の中身`expression`を抜き出して,関数再帰により`expression`をまた`operator(expression)`の形式として評価する.といった具合です.括弧がなかった場合,値のみなので再帰終了になります.
|
6
6
|
|
7
|
-
具体的には,括弧の
|
7
|
+
具体的には,演算子`operator`と括弧の中身`expression`の抜き出しを`split_op_ex(x)`で行い,`arity`によってコンマ区切りの有無の判定を利用した再帰になっています.`arity = 2`であればコンマ区切りされている`operator(expression1,expression2)`状態なので,コンマの位置を関数`split_comma(x)`にて特定&分割,それぞれの`expression`を再帰により評価します.
|
8
8
|
|
9
9
|
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
10
10
|
|
@@ -18,18 +18,18 @@
|
|
18
18
|
elif ch == ')':
|
19
19
|
cnt -= 1
|
20
20
|
if not cnt:
|
21
|
-
return x[:start], x[start + 1: start + i + 1]
|
21
|
+
return x[:start], x[start + 1: start + i + 1] # operator, expression
|
22
22
|
assert False, f"not found ')', incorrect bracket error on '{x}'"
|
23
23
|
|
24
|
-
def
|
24
|
+
def split_comma(x): # expressionを分割しているコンマを探索&分割
|
25
25
|
cnt = 0
|
26
26
|
for i, ch in enumerate(x):
|
27
27
|
if ch == '(':
|
28
28
|
cnt += 1
|
29
29
|
elif ch == ')':
|
30
30
|
cnt -= 1
|
31
|
-
if ch == ',' and not cnt:
|
31
|
+
if ch == ',' and not cnt: # comma index: i
|
32
|
-
return i
|
32
|
+
return x[:i], x[i + 1:]
|
33
33
|
assert False, f"not found outer comma, incorrect bracket or comma style"
|
34
34
|
|
35
35
|
def getArity(name):
|
@@ -64,17 +64,11 @@
|
|
64
64
|
if arity == 1:
|
65
65
|
return latexify(op, dfs(ex))
|
66
66
|
if arity == 2:
|
67
|
-
sep = outer_comma(ex)
|
68
|
-
return latexify(op,
|
67
|
+
return latexify(op, list(map(dfs, split_comma(ex))))
|
69
68
|
|
70
69
|
string = "div(cos(mul(0.5,0.1)),cos(add(cos(add(sin(e),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))),mul(div(div(div(0.1,div(div(e,x),div(0.1,e))),div(div(e,add(x,-1)),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),x),div(0.1,div(div(e,x),div(0.1,e))))),div(div(0.1,div(div(e,x),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))))))"
|
71
70
|
print(dfs(string).replace("+ -", "- ").replace("- -", "+ "))
|
72
71
|
print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
73
72
|
```
|
74
|
-
一応最後に,`add(x,-1)`のとき`x + -1`になるので,`.replace("+ -", "- ")`しています.今回は`sub(x,-1)`のケースがなかったので`.replace("- -", "+ ")`は不要ですが今後のために追加しておきました.
|
75
|
-
```shell:標準出力
|
76
|
-
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}\right) + \frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x - 1}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}} \times \frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}}\right)}
|
77
|
-
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
78
|
-
```
|
79
73
|
また,`latexify`時に括弧に付けた`\left`と`\right`ですが,これは式のサイズに括弧のサイズを合わせるようなオプションです.付けなくても動きますが見づらいと思い,追加しておきました.また,掛け算は`\times`でなく`\cdot`でも良いと思います.ベクトルの場合に外積と内積で意味が異なりますので覚えておくと良いでしょう.
|
80
74
|
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/5fc4f39a-56ed-48d9-8bd2-bb224e467bcb.png)
|
22
replace eq to ex
test
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
10
10
|
|
11
11
|
```Python
|
12
|
-
def split_op_e
|
12
|
+
def split_op_ex(x): # operator(expression)の形式のときoperatorとexpressionを返す
|
13
13
|
start, cnt = x.find('('), 1
|
14
14
|
assert start != -1, f"not found '(', maybe '{x}' is single value"
|
15
15
|
for i, ch in enumerate(x[start + 1:]):
|
@@ -39,33 +39,33 @@
|
|
39
39
|
return 2
|
40
40
|
assert False, f"not defined operator '{name}'"
|
41
41
|
|
42
|
-
def latexify(op, e
|
42
|
+
def latexify(op, ex):
|
43
43
|
if op == None:
|
44
|
-
if e
|
44
|
+
if ex == "pi":
|
45
45
|
return "\\pi"
|
46
|
-
return e
|
46
|
+
return ex
|
47
47
|
if op == "sqrt":
|
48
|
-
return "\\sqrt{" + e
|
48
|
+
return "\\sqrt{" + ex + "}"
|
49
49
|
if getArity(op) == 1:
|
50
|
-
return f"\\{op}\\left({e
|
50
|
+
return f"\\{op}\\left({ex}\\right)"
|
51
51
|
a = {"add": "+", "sub": "-", "mul": "\\times"}
|
52
52
|
if op in a.keys():
|
53
|
-
return f"{e
|
53
|
+
return f"{ex[0]} {a[op]} {ex[1]}"
|
54
54
|
if op == "div":
|
55
|
-
return "\\frac{" + e
|
55
|
+
return "\\frac{" + ex[0] + "}{" + ex[1] + "}"
|
56
56
|
|
57
|
-
assert False, f"not defined latexify operator '{e
|
57
|
+
assert False, f"not defined latexify operator '{ex}'"
|
58
58
|
|
59
59
|
def dfs(S):
|
60
60
|
if not S.count('('): # only value
|
61
61
|
return latexify(None, S)
|
62
|
-
op, e
|
62
|
+
op, ex = split_op_ex(S)
|
63
63
|
arity = getArity(op)
|
64
64
|
if arity == 1:
|
65
|
-
return latexify(op, dfs(e
|
65
|
+
return latexify(op, dfs(ex))
|
66
66
|
if arity == 2:
|
67
|
-
sep = outer_comma(e
|
67
|
+
sep = outer_comma(ex)
|
68
|
-
return latexify(op, [dfs(e
|
68
|
+
return latexify(op, [dfs(ex[:sep]), dfs(ex[sep + 1:])])
|
69
69
|
|
70
70
|
string = "div(cos(mul(0.5,0.1)),cos(add(cos(add(sin(e),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))),mul(div(div(div(0.1,div(div(e,x),div(0.1,e))),div(div(e,add(x,-1)),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),x),div(0.1,div(div(e,x),div(0.1,e))))),div(div(0.1,div(div(e,x),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))))))"
|
71
71
|
print(dfs(string).replace("+ -", "- ").replace("- -", "+ "))
|
21
update code
test
CHANGED
@@ -9,16 +9,17 @@
|
|
9
9
|
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
10
10
|
|
11
11
|
```Python
|
12
|
-
def
|
12
|
+
def split_op_eq(x): # operator(expression)の形式のときoperatorとexpressionを返す
|
13
13
|
start, cnt = x.find('('), 1
|
14
|
+
assert start != -1, f"not found '(', maybe '{x}' is single value"
|
14
15
|
for i, ch in enumerate(x[start + 1:]):
|
15
16
|
if ch == '(':
|
16
17
|
cnt += 1
|
17
18
|
elif ch == ')':
|
18
19
|
cnt -= 1
|
19
20
|
if not cnt:
|
20
|
-
return start + 1
|
21
|
+
return x[:start], x[start + 1: start + i + 1]
|
21
|
-
assert False, f"not found ')', incorrect bracket error"
|
22
|
+
assert False, f"not found ')', incorrect bracket error on '{x}'"
|
22
23
|
|
23
24
|
def outer_comma(x): # expressionを分割しているコンマを探索
|
24
25
|
cnt = 0
|
@@ -34,7 +35,7 @@
|
|
34
35
|
def getArity(name):
|
35
36
|
if name in ["sin","cos","tan","log","exp","sqrt"]:
|
36
37
|
return 1
|
37
|
-
|
38
|
+
if name in ["add","sub","mul","div"]: # 四則演算記号
|
38
39
|
return 2
|
39
40
|
assert False, f"not defined operator '{name}'"
|
40
41
|
|
@@ -52,17 +53,17 @@
|
|
52
53
|
return f"{eq[0]} {a[op]} {eq[1]}"
|
53
54
|
if op == "div":
|
54
55
|
return "\\frac{" + eq[0] + "}{" + eq[1] + "}"
|
56
|
+
|
55
|
-
assert False, f"not defined latexify operator '{
|
57
|
+
assert False, f"not defined latexify operator '{eq}'"
|
56
58
|
|
57
|
-
def dfs(S):
|
59
|
+
def dfs(S):
|
58
60
|
if not S.count('('): # only value
|
59
61
|
return latexify(None, S)
|
60
|
-
|
62
|
+
op, eq = split_op_eq(S)
|
61
|
-
op, eq = S[:start - 1], S[start:end]
|
62
63
|
arity = getArity(op)
|
63
64
|
if arity == 1:
|
64
65
|
return latexify(op, dfs(eq))
|
65
|
-
|
66
|
+
if arity == 2:
|
66
67
|
sep = outer_comma(eq)
|
67
68
|
return latexify(op, [dfs(eq[:sep]), dfs(eq[sep + 1:])])
|
68
69
|
|
20
bug fix
test
CHANGED
@@ -67,7 +67,7 @@
|
|
67
67
|
return latexify(op, [dfs(eq[:sep]), dfs(eq[sep + 1:])])
|
68
68
|
|
69
69
|
string = "div(cos(mul(0.5,0.1)),cos(add(cos(add(sin(e),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))),mul(div(div(div(0.1,div(div(e,x),div(0.1,e))),div(div(e,add(x,-1)),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),x),div(0.1,div(div(e,x),div(0.1,e))))),div(div(0.1,div(div(e,x),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))))))"
|
70
|
-
print(dfs(string).replace("+ -", "- ")
|
70
|
+
print(dfs(string).replace("+ -", "- ").replace("- -", "+ "))
|
71
71
|
print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
72
72
|
```
|
73
73
|
一応最後に,`add(x,-1)`のとき`x + -1`になるので,`.replace("+ -", "- ")`しています.今回は`sub(x,-1)`のケースがなかったので`.replace("- -", "+ ")`は不要ですが今後のために追加しておきました.
|
19
fixed code
test
CHANGED
@@ -75,5 +75,5 @@
|
|
75
75
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}\right) + \frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x - 1}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}} \times \frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}}\right)}
|
76
76
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
77
77
|
```
|
78
|
-
また,`latexify`時に括弧に付けた`\left`と`\right`ですが,これは式のサイズに括弧のサイズを合わせるようなオプションです.付けなくても動きますが見づらいと思い,追加しておきました.
|
78
|
+
また,`latexify`時に括弧に付けた`\left`と`\right`ですが,これは式のサイズに括弧のサイズを合わせるようなオプションです.付けなくても動きますが見づらいと思い,追加しておきました.また,掛け算は`\times`でなく`\cdot`でも良いと思います.ベクトルの場合に外積と内積で意味が異なりますので覚えておくと良いでしょう.
|
79
79
|
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/5fc4f39a-56ed-48d9-8bd2-bb224e467bcb.png)
|
18
fix code and context
test
CHANGED
@@ -58,22 +58,22 @@
|
|
58
58
|
if not S.count('('): # only value
|
59
59
|
return latexify(None, S)
|
60
60
|
start, end = bracket(S)
|
61
|
-
op, eq = S[:start - 1], S[start:
|
61
|
+
op, eq = S[:start - 1], S[start:end]
|
62
62
|
arity = getArity(op)
|
63
63
|
if arity == 1:
|
64
64
|
return latexify(op, dfs(eq))
|
65
65
|
elif arity == 2:
|
66
66
|
sep = outer_comma(eq)
|
67
|
-
return latexify(op, [dfs(eq[:sep]), dfs(eq[sep+1:])])
|
67
|
+
return latexify(op, [dfs(eq[:sep]), dfs(eq[sep + 1:])])
|
68
68
|
|
69
69
|
string = "div(cos(mul(0.5,0.1)),cos(add(cos(add(sin(e),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))),mul(div(div(div(0.1,div(div(e,x),div(0.1,e))),div(div(e,add(x,-1)),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),x),div(0.1,div(div(e,x),div(0.1,e))))),div(div(0.1,div(div(e,x),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))))))"
|
70
|
-
print(dfs(string).replace("+ -", "- "))
|
70
|
+
print(dfs(string).replace("+ -", "- ")).replace("- -", "+ "))
|
71
71
|
print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
72
72
|
```
|
73
|
-
一応最後に,`add(x,-1)`のとき`x + -1`になるので,`.replace("+ -", "- ")`しています.今回は`sub(x,-1)`のケースがなかったので`.replace("- -", "+ ")`
|
73
|
+
一応最後に,`add(x,-1)`のとき`x + -1`になるので,`.replace("+ -", "- ")`しています.今回は`sub(x,-1)`のケースがなかったので`.replace("- -", "+ ")`は不要ですが今後のために追加しておきました.
|
74
74
|
```shell:標準出力
|
75
75
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}\right) + \frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x - 1}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}} \times \frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}}\right)}
|
76
76
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
77
77
|
```
|
78
|
-
|
78
|
+
また,`latexify`時に括弧に付けた`\left`と`\right`ですが,これは式のサイズに括弧のサイズを合わせるようなオプションです.付けなくても動きますが見づらいと思い,追加しておきました.
|
79
79
|
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/5fc4f39a-56ed-48d9-8bd2-bb224e467bcb.png)
|
17
fixed typo
test
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
return 1
|
37
37
|
elif name in ["add","sub","mul","div"]: # 四則演算記号
|
38
38
|
return 2
|
39
|
-
assert False, f"not defined opertor '{name}'"
|
39
|
+
assert False, f"not defined operator '{name}'"
|
40
40
|
|
41
41
|
def latexify(op, eq):
|
42
42
|
if op == None:
|
@@ -52,7 +52,7 @@
|
|
52
52
|
return f"{eq[0]} {a[op]} {eq[1]}"
|
53
53
|
if op == "div":
|
54
54
|
return "\\frac{" + eq[0] + "}{" + eq[1] + "}"
|
55
|
-
assert False, f"not defined latexify opertor '{op}'"
|
55
|
+
assert False, f"not defined latexify operator '{op}'"
|
56
56
|
|
57
57
|
def dfs(S): # メイン処理
|
58
58
|
if not S.count('('): # only value
|
16
update prefix
test
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
パッと見た感じ,`array.insert()`周りがおかしいと感じますが,
|
1
|
+
パッと見た感じ,`array.insert()`周りがおかしいと感じますが,私には難解なのでデバッグの回答は他の人に譲ります.
|
2
|
+
|
3
|
+
とりあえず再帰で書き直してみました.
|
2
4
|
|
3
5
|
基本方針は,文字列が`operator(expression)`という形式であることを利用して,演算子`operator`と括弧の中身`expression`を抜き出して,関数再帰により`expression`をまた`operator(expression)`の形式として評価する.といった具合です.括弧がなかった場合,値のみなので再帰終了になります.
|
4
6
|
|
15
append explains
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
基本方針は,文字列が`operator(expression)`という形式であることを利用して,演算子`operator`と括弧の中身`expression`を抜き出して,関数再帰により`expression`をまた`operator(expression)`の形式として評価する.といった具合です.括弧がなかった場合,値のみなので再帰終了になります.
|
4
4
|
|
5
|
-
具体的には,括弧の始点と終点の抜き出しを関数`bracket(x)`で行い,`arity`によってコンマ区切りの有無の判定を利用した再帰になっています.`arity=2`であればコンマ区切りされている`operator(expression1,expression2)`状態なので,
|
5
|
+
具体的には,括弧の始点と終点の抜き出しを関数`bracket(x)`で行い,`arity`によってコンマ区切りの有無の判定を利用した再帰になっています.`arity=2`であればコンマ区切りされている`operator(expression1,expression2)`状態なので,コンマの位置を関数`outer_comma(x)`にて特定後,コンマで分割されたそれぞれの`expression`を再帰により評価します.
|
6
6
|
|
7
7
|
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
8
8
|
|
@@ -68,7 +68,7 @@
|
|
68
68
|
print(dfs(string).replace("+ -", "- "))
|
69
69
|
print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
70
70
|
```
|
71
|
-
|
71
|
+
一応最後に,`add(x,-1)`のとき`x + -1`になるので,`.replace("+ -", "- ")`しています.今回は`sub(x,-1)`のケースがなかったので`.replace("- -", "+ ")`を追加で書くか迷いましたが簡単のため省略しました.
|
72
72
|
```shell:標準出力
|
73
73
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}\right) + \frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x - 1}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}} \times \frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}}\right)}
|
74
74
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
14
append prefix
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
デバッグも大変なので再帰で書き直してみました.
|
1
|
+
パッと見た感じ,`array.insert()`周りがおかしいと感じますが,複雑怪奇極まってデバッグも大変なのでとりあえず再帰で書き直してみました.
|
2
2
|
|
3
3
|
基本方針は,文字列が`operator(expression)`という形式であることを利用して,演算子`operator`と括弧の中身`expression`を抜き出して,関数再帰により`expression`をまた`operator(expression)`の形式として評価する.といった具合です.括弧がなかった場合,値のみなので再帰終了になります.
|
4
4
|
|
13
fix context
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
基本方針は,文字列が`operator(expression)`という形式であることを利用して,演算子`operator`と括弧の中身`expression`を抜き出して,関数再帰により`expression`をまた`operator(expression)`の形式として評価する.といった具合です.括弧がなかった場合,値のみなので再帰終了になります.
|
4
4
|
|
5
|
-
具体的には,括弧の始点と終点の抜き出しを関数`bracket(x)`で行い,`arity`によってコンマ区切り
|
5
|
+
具体的には,括弧の始点と終点の抜き出しを関数`bracket(x)`で行い,`arity`によってコンマ区切りの有無の判定を利用した再帰になっています.`arity=2`であればコンマ区切りされている`operator(expression1,expression2)`状態なので,`expression`のコンマの位置を関数`outer_comma(x)`にて特定後,コンマで分割されたそれぞれの`expression`を再帰により評価します.
|
6
6
|
|
7
7
|
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
8
8
|
|
@@ -52,7 +52,7 @@
|
|
52
52
|
return "\\frac{" + eq[0] + "}{" + eq[1] + "}"
|
53
53
|
assert False, f"not defined latexify opertor '{op}'"
|
54
54
|
|
55
|
-
def dfs(S):
|
55
|
+
def dfs(S): # メイン処理
|
56
56
|
if not S.count('('): # only value
|
57
57
|
return latexify(None, S)
|
58
58
|
start, end = bracket(S)
|
12
fix bug
test
CHANGED
@@ -34,7 +34,7 @@
|
|
34
34
|
return 1
|
35
35
|
elif name in ["add","sub","mul","div"]: # 四則演算記号
|
36
36
|
return 2
|
37
|
-
assert False, f"not defined opertor {name}"
|
37
|
+
assert False, f"not defined opertor '{name}'"
|
38
38
|
|
39
39
|
def latexify(op, eq):
|
40
40
|
if op == None:
|
@@ -50,7 +50,7 @@
|
|
50
50
|
return f"{eq[0]} {a[op]} {eq[1]}"
|
51
51
|
if op == "div":
|
52
52
|
return "\\frac{" + eq[0] + "}{" + eq[1] + "}"
|
53
|
-
assert False, f"not defined latexify opertor {
|
53
|
+
assert False, f"not defined latexify opertor '{op}'"
|
54
54
|
|
55
55
|
def dfs(S):
|
56
56
|
if not S.count('('): # only value
|
11
update code, raise error by assert False
test
CHANGED
@@ -16,8 +16,7 @@
|
|
16
16
|
cnt -= 1
|
17
17
|
if not cnt:
|
18
18
|
return start + 1, start + i + 1 # start, end
|
19
|
-
|
19
|
+
assert False, f"not found ')', incorrect bracket error"
|
20
|
-
exit()
|
21
20
|
|
22
21
|
def outer_comma(x): # expressionを分割しているコンマを探索
|
23
22
|
cnt = 0
|
@@ -28,16 +27,14 @@
|
|
28
27
|
cnt -= 1
|
29
28
|
if ch == ',' and not cnt:
|
30
29
|
return i
|
31
|
-
|
30
|
+
assert False, f"not found outer comma, incorrect bracket or comma style"
|
32
|
-
exit()
|
33
31
|
|
34
32
|
def getArity(name):
|
35
33
|
if name in ["sin","cos","tan","log","exp","sqrt"]:
|
36
34
|
return 1
|
37
35
|
elif name in ["add","sub","mul","div"]: # 四則演算記号
|
38
36
|
return 2
|
39
|
-
|
37
|
+
assert False, f"not defined opertor {name}"
|
40
|
-
exit()
|
41
38
|
|
42
39
|
def latexify(op, eq):
|
43
40
|
if op == None:
|
@@ -53,8 +50,7 @@
|
|
53
50
|
return f"{eq[0]} {a[op]} {eq[1]}"
|
54
51
|
if op == "div":
|
55
52
|
return "\\frac{" + eq[0] + "}{" + eq[1] + "}"
|
56
|
-
|
53
|
+
assert False, f"not defined latexify opertor {name}"
|
57
|
-
exit()
|
58
54
|
|
59
55
|
def dfs(S):
|
60
56
|
if not S.count('('): # only value
|
10
update code
test
CHANGED
@@ -8,16 +8,16 @@
|
|
8
8
|
|
9
9
|
```Python
|
10
10
|
def bracket(x): # 括弧の中身の始点startと終点endを探索
|
11
|
-
start,
|
11
|
+
start, cnt = x.find('('), 1
|
12
12
|
for i, ch in enumerate(x[start + 1:]):
|
13
13
|
if ch == '(':
|
14
14
|
cnt += 1
|
15
15
|
elif ch == ')':
|
16
16
|
cnt -= 1
|
17
17
|
if not cnt:
|
18
|
-
end = start + i + 1
|
19
|
-
break
|
20
|
-
return start + 1, end
|
18
|
+
return start + 1, start + i + 1 # start, end
|
19
|
+
print(f"not found ')', incorrect bracket error")
|
20
|
+
exit()
|
21
21
|
|
22
22
|
def outer_comma(x): # expressionを分割しているコンマを探索
|
23
23
|
cnt = 0
|
@@ -28,7 +28,7 @@
|
|
28
28
|
cnt -= 1
|
29
29
|
if ch == ',' and not cnt:
|
30
30
|
return i
|
31
|
-
print(f"not found outer comma,
|
31
|
+
print(f"not found outer comma, incorrect bracket or comma style")
|
32
32
|
exit()
|
33
33
|
|
34
34
|
def getArity(name):
|
9
fix code
test
CHANGED
@@ -7,12 +7,12 @@
|
|
7
7
|
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
8
8
|
|
9
9
|
```Python
|
10
|
-
def bracket(x): # 括弧の始点と終点を探索
|
10
|
+
def bracket(x): # 括弧の中身の始点startと終点endを探索
|
11
|
-
start, end, cnt = x.find(
|
11
|
+
start, end, cnt = x.find('('), -1, 1
|
12
|
-
for i,
|
12
|
+
for i, ch in enumerate(x[start + 1:]):
|
13
|
-
if
|
13
|
+
if ch == '(':
|
14
14
|
cnt += 1
|
15
|
-
elif
|
15
|
+
elif ch == ')':
|
16
16
|
cnt -= 1
|
17
17
|
if not cnt:
|
18
18
|
end = start + i + 1
|
@@ -20,13 +20,13 @@
|
|
20
20
|
return start + 1, end
|
21
21
|
|
22
22
|
def outer_comma(x): # expressionを分割しているコンマを探索
|
23
|
-
|
23
|
+
cnt = 0
|
24
24
|
for i, ch in enumerate(x):
|
25
25
|
if ch == '(':
|
26
|
-
|
26
|
+
cnt += 1
|
27
27
|
elif ch == ')':
|
28
|
-
|
28
|
+
cnt -= 1
|
29
|
-
if ch == ',' and not
|
29
|
+
if ch == ',' and not cnt:
|
30
30
|
return i
|
31
31
|
print(f"not found outer comma, maybe this {x} is incorrect")
|
32
32
|
exit()
|
8
update to simplify code
test
CHANGED
@@ -7,12 +7,8 @@
|
|
7
7
|
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
8
8
|
|
9
9
|
```Python
|
10
|
-
def bracket(x):
|
10
|
+
def bracket(x): # 括弧の始点と終点を探索
|
11
|
-
start, end, cnt =
|
11
|
+
start, end, cnt = x.find("("), -1, 1
|
12
|
-
for i, _x in enumerate(x):
|
13
|
-
if _x == '(':
|
14
|
-
start = i
|
15
|
-
break
|
16
12
|
for i, _x in enumerate(x[start + 1:]):
|
17
13
|
if _x == '(':
|
18
14
|
cnt += 1
|
@@ -23,8 +19,8 @@
|
|
23
19
|
break
|
24
20
|
return start + 1, end
|
25
21
|
|
26
|
-
def outer_comma(x): #
|
22
|
+
def outer_comma(x): # expressionを分割しているコンマを探索
|
27
|
-
stack = list()
|
23
|
+
stack, ret = list(), list()
|
28
24
|
for i, ch in enumerate(x):
|
29
25
|
if ch == '(':
|
30
26
|
stack.append(i)
|
@@ -40,15 +36,14 @@
|
|
40
36
|
return 1
|
41
37
|
elif name in ["add","sub","mul","div"]: # 四則演算記号
|
42
38
|
return 2
|
43
|
-
print("bug : not defined oper
|
39
|
+
print("bug : not defined opertor", name)
|
44
40
|
exit()
|
45
|
-
|
46
|
-
def latexify_value(eq):
|
47
|
-
if eq == "pi":
|
48
|
-
return f"\\pi"
|
49
|
-
return eq
|
50
41
|
|
51
42
|
def latexify(op, eq):
|
43
|
+
if op == None:
|
44
|
+
if eq == "pi":
|
45
|
+
return "\\pi"
|
46
|
+
return eq
|
52
47
|
if op == "sqrt":
|
53
48
|
return "\\sqrt{" + eq + "}"
|
54
49
|
if getArity(op) == 1:
|
@@ -63,7 +58,7 @@
|
|
63
58
|
|
64
59
|
def dfs(S):
|
65
60
|
if not S.count('('): # only value
|
66
|
-
return latexify
|
61
|
+
return latexify(None, S)
|
67
62
|
start, end = bracket(S)
|
68
63
|
op, eq = S[:start - 1], S[start: end]
|
69
64
|
arity = getArity(op)
|
7
fix context
test
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
デバッグも大変なので再帰で書き直してみました.
|
2
2
|
|
3
|
-
基本方針は,文字列が`operator(expression)`という形式であることを利用して,演算子`operator`と括弧の中身`expression`を抜き出して,関数再帰により`expression`をまた`operator(expression)`の形式として評価する.といった具合です.
|
3
|
+
基本方針は,文字列が`operator(expression)`という形式であることを利用して,演算子`operator`と括弧の中身`expression`を抜き出して,関数再帰により`expression`をまた`operator(expression)`の形式として評価する.といった具合です.括弧がなかった場合,値のみなので再帰終了になります.
|
4
4
|
|
5
|
-
括弧の始点と終点の抜き出しを関数`bracket(x)`で行い,arityによってコンマ区切りされているか否か別れることを利用した再帰になっています.`arity=2`であればコンマ区切りされているので,`expression`のコンマの位置を関数`outer_comma(x)`にて特定&分割を
|
5
|
+
具体的には,括弧の始点と終点の抜き出しを関数`bracket(x)`で行い,`arity`によってコンマ区切りされているか否か別れることを利用した再帰になっています.`arity=2`であればコンマ区切りされているので,`expression`のコンマの位置を関数`outer_comma(x)`にて特定&分割し,分割された`expression`を2つそれぞれ再帰により評価します.
|
6
6
|
|
7
7
|
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
8
8
|
|
@@ -40,7 +40,7 @@
|
|
40
40
|
return 1
|
41
41
|
elif name in ["add","sub","mul","div"]: # 四則演算記号
|
42
42
|
return 2
|
43
|
-
print("bug : not defined opertor", name)
|
43
|
+
print("bug : not defined operator", name)
|
44
44
|
exit()
|
45
45
|
|
46
46
|
def latexify_value(eq):
|
6
fix sqrt brackets
test
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
return 1
|
41
41
|
elif name in ["add","sub","mul","div"]: # 四則演算記号
|
42
42
|
return 2
|
43
|
-
print("bug : not define ", name)
|
43
|
+
print("bug : not defined opertor", name)
|
44
44
|
exit()
|
45
45
|
|
46
46
|
def latexify_value(eq):
|
@@ -49,6 +49,8 @@
|
|
49
49
|
return eq
|
50
50
|
|
51
51
|
def latexify(op, eq):
|
52
|
+
if op == "sqrt":
|
53
|
+
return "\\sqrt{" + eq + "}"
|
52
54
|
if getArity(op) == 1:
|
53
55
|
return f"\\{op}\\left({eq}\\right)"
|
54
56
|
a = {"add": "+", "sub": "-", "mul": "\\times"}
|
5
append explain
test
CHANGED
@@ -1,4 +1,11 @@
|
|
1
1
|
デバッグも大変なので再帰で書き直してみました.
|
2
|
+
|
3
|
+
基本方針は,文字列が`operator(expression)`という形式であることを利用して,演算子`operator`と括弧の中身`expression`を抜き出して,関数再帰により`expression`をまた`operator(expression)`の形式として評価する.といった具合です.
|
4
|
+
|
5
|
+
括弧の始点と終点の抜き出しを関数`bracket(x)`で行い,arityによってコンマ区切りされているか否か別れることを利用した再帰になっています.`arity=2`であればコンマ区切りされているので,`expression`のコンマの位置を関数`outer_comma(x)`にて特定&分割を行って,再帰により評価します.
|
6
|
+
|
7
|
+
そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
|
8
|
+
|
2
9
|
```Python
|
3
10
|
def bracket(x):
|
4
11
|
start, end, cnt = -1, -1, 1
|
4
fix dfs first vehabior
test
CHANGED
@@ -53,9 +53,9 @@
|
|
53
53
|
exit()
|
54
54
|
|
55
55
|
def dfs(S):
|
56
|
+
if not S.count('('): # only value
|
57
|
+
return latexify_value(S)
|
56
58
|
start, end = bracket(S)
|
57
|
-
if not S.count('('):
|
58
|
-
return latexify_value(S)
|
59
59
|
op, eq = S[:start - 1], S[start: end]
|
60
60
|
arity = getArity(op)
|
61
61
|
if arity == 1:
|
3
fix pm replace method
test
CHANGED
@@ -65,12 +65,12 @@
|
|
65
65
|
return latexify(op, [dfs(eq[:sep]), dfs(eq[sep+1:])])
|
66
66
|
|
67
67
|
string = "div(cos(mul(0.5,0.1)),cos(add(cos(add(sin(e),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))),mul(div(div(div(0.1,div(div(e,x),div(0.1,e))),div(div(e,add(x,-1)),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),x),div(0.1,div(div(e,x),div(0.1,e))))),div(div(0.1,div(div(e,x),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))))))"
|
68
|
-
print(dfs(string).replace("+ -", "
|
68
|
+
print(dfs(string).replace("+ -", "- "))
|
69
69
|
print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
70
70
|
```
|
71
71
|
|
72
72
|
```shell:標準出力
|
73
|
-
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x
|
73
|
+
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}\right) + \frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x - 1}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}} \times \frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}}\right)}
|
74
74
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
75
75
|
```
|
76
76
|
|
2
fix code
test
CHANGED
@@ -25,7 +25,7 @@
|
|
25
25
|
stack.pop()
|
26
26
|
if ch == ',' and not len(stack):
|
27
27
|
return i
|
28
|
-
print("not found outer comma, maybe this {x} is n
|
28
|
+
print(f"not found outer comma, maybe this {x} is incorrect")
|
29
29
|
exit()
|
30
30
|
|
31
31
|
def getArity(name):
|
1
fix add minus to minus
test
CHANGED
@@ -65,13 +65,13 @@
|
|
65
65
|
return latexify(op, [dfs(eq[:sep]), dfs(eq[sep+1:])])
|
66
66
|
|
67
67
|
string = "div(cos(mul(0.5,0.1)),cos(add(cos(add(sin(e),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))),mul(div(div(div(0.1,div(div(e,x),div(0.1,e))),div(div(e,add(x,-1)),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),x),div(0.1,div(div(e,x),div(0.1,e))))),div(div(0.1,div(div(e,x),div(0.1,e))),div(div(div(div(e,x),div(0.1,e)),log(add(x,-1))),div(0.1,div(div(e,x),div(0.1,e)))))))))"
|
68
|
-
print(dfs(string))
|
68
|
+
print(dfs(string).replace("+ -", " - "))
|
69
69
|
print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
|
70
70
|
```
|
71
71
|
|
72
72
|
```shell:標準出力
|
73
|
-
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x
|
73
|
+
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(\cos\left(\sin\left(e\right) + \frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}\right) + \frac{\frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{e}{x - 1}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{x}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}} \times \frac{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}{\frac{\frac{\frac{\frac{e}{x}}{\frac{0.1}{e}}}{\log\left(x - 1\right)}}{\frac{0.1}{\frac{\frac{e}{x}}{\frac{0.1}{e}}}}}\right)}
|
74
74
|
\frac{\cos\left(0.5 \times 0.1\right)}{\cos\left(1 + x\right)}
|
75
75
|
```
|
76
76
|
|
77
|
-
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/
|
77
|
+
![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/5fc4f39a-56ed-48d9-8bd2-bb224e467bcb.png)
|