回答編集履歴

30

fix code

2022/10/18 04:12

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/17 22:34

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -28,9 +28,9 @@
28
28
  cnt += 1
29
29
  elif ch == ')':
30
30
  cnt -= 1
31
- if ch == ',' and not cnt: # comma index: i
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
- a = {"add": "+", "sub": "-", "mul": "\\times"}
51
+ pm = {"add": "+", "sub": "-"}
52
- if op in a.keys():
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]} {a[op]} {ex[1]}"
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 rec(S): # recursion function
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, rec(ex))
70
+ return latexify(op, dfs(ex, op), parent_op)
66
71
  if arity == 2:
67
- return latexify(op, list(map(rec, split_comma(ex))))
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(rec(string).replace("+ -", "- ").replace("- -", "+ "))
78
+ print(translate(string))
71
- print(rec("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
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

2022/10/17 14:36

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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(name):
35
+ def getArity(op):
36
- if name in ["sin","cos","tan","log","exp","sqrt"]:
36
+ if op in ["sin","cos","tan","log","exp","sqrt"]:
37
37
  return 1
38
- if name in ["add","sub","mul","div"]: # 四則演算記号
38
+ if op in ["add","sub","mul","div"]: # 四則演算記号
39
39
  return 2
40
- assert False, f"not defined operator '{name}'"
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 '{ex}'"
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

2022/10/17 14:21

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -56,19 +56,19 @@
56
56
 
57
57
  assert False, f"not defined latexify operator '{ex}'"
58
58
 
59
- def dfs(S):
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, dfs(ex))
65
+ return latexify(op, rec(ex))
66
66
  if arity == 2:
67
- return latexify(op, list(map(dfs, split_comma(ex))))
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(dfs(string).replace("+ -", "- ").replace("- -", "+ "))
70
+ print(rec(string).replace("+ -", "- ").replace("- -", "+ "))
71
- print(dfs("div(cos(mul(0.5,0.1)),cos(add(1,x)))"))
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

2022/10/17 14:16

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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, -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)}

25

fix context

2022/10/17 14:11

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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
- また,`latexify`括弧に付けた`\left`と`\right`ですが,これは式のサイズ括弧サイズを合わせるようなオプションす.付けなくても動きますが見づらいと思い追加しておきしたまた,掛け算は`\times`でなく`\cdot`でも良と思います.ベクトルの場合に外積と内積で意味が異なりますので覚えておくと良いでしょう.
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

2022/10/17 13:51

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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
- ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/5fc4f39a-56ed-48d9-8bd2-bb224e467bcb.png)
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

2022/10/17 13:20

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  基本方針は,文字列が`operator(expression)`という形式であることを利用して,演算子`operator`と括弧の中身`expression`を抜き出して,関数再帰により`expression`をまた`operator(expression)`の形式として評価する.といった具合です.括弧がなかった場合,値のみなので再帰終了になります.
6
6
 
7
- 具体的には,括弧の始点と終点の抜き出しを関数`bracket(x)`で行い,`arity`によってコンマ区切りの有無の判定を利用した再帰になっています.`arity=2`であればコンマ区切りされている`operator(expression1,expression2)`状態なので,コンマの位置を関数`outer_comma(x)`にて特定後,コンマで分割されたそれぞれの`expression`を再帰により評価します.
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 outer_comma(x): # expressionを分割しているコンマを探索
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, [dfs(ex[:sep]), dfs(ex[sep + 1:])])
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

2022/10/17 13:13

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -9,7 +9,7 @@
9
9
  そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
10
10
 
11
11
  ```Python
12
- def split_op_eq(x): # operator(expression)の形式のときoperatorとexpressionを返す
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, eq):
42
+ def latexify(op, ex):
43
43
  if op == None:
44
- if eq == "pi":
44
+ if ex == "pi":
45
45
  return "\\pi"
46
- return eq
46
+ return ex
47
47
  if op == "sqrt":
48
- return "\\sqrt{" + eq + "}"
48
+ return "\\sqrt{" + ex + "}"
49
49
  if getArity(op) == 1:
50
- return f"\\{op}\\left({eq}\\right)"
50
+ return f"\\{op}\\left({ex}\\right)"
51
51
  a = {"add": "+", "sub": "-", "mul": "\\times"}
52
52
  if op in a.keys():
53
- return f"{eq[0]} {a[op]} {eq[1]}"
53
+ return f"{ex[0]} {a[op]} {ex[1]}"
54
54
  if op == "div":
55
- return "\\frac{" + eq[0] + "}{" + eq[1] + "}"
55
+ return "\\frac{" + ex[0] + "}{" + ex[1] + "}"
56
56
 
57
- assert False, f"not defined latexify operator '{eq}'"
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, eq = split_op_eq(S)
62
+ op, ex = split_op_ex(S)
63
63
  arity = getArity(op)
64
64
  if arity == 1:
65
- return latexify(op, dfs(eq))
65
+ return latexify(op, dfs(ex))
66
66
  if arity == 2:
67
- sep = outer_comma(eq)
67
+ sep = outer_comma(ex)
68
- return latexify(op, [dfs(eq[:sep]), dfs(eq[sep + 1:])])
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

2022/10/17 13:11

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -9,16 +9,17 @@
9
9
  そんなに変なことをしているつもりはないのですが,わからないことあれば教えてください.
10
10
 
11
11
  ```Python
12
- def bracket(x): # 括弧中身始点start終点end探索
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, start + i + 1 # start, end
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
- elif name in ["add","sub","mul","div"]: # 四則演算記号
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 '{op}'"
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
- start, end = bracket(S)
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
- elif arity == 2:
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

2022/10/17 12:56

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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("+ -", "- ")).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

2022/10/17 12:54

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/17 12:50

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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: end]
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

2022/10/17 12:30

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/17 12:28

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/17 12:25

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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)`状態なので,`expression`のコンマの位置を関数`outer_comma(x)`にて特定後,コンマで分割されたそれぞれの`expression`を再帰により評価します.
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

2022/10/17 12:11

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/17 11:50

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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`であればコンマ区切りされているので,`expression`のコンマの位置を関数`outer_comma(x)`にて特定&分割し,分割された`expression`を2つそれぞれ再帰により評価します.
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

2022/10/17 11:40

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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 {name}"
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

2022/10/17 11:40

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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
- print(f"not found ')', incorrect bracket error")
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
- print(f"not found outer comma, incorrect bracket or comma style")
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
- print("bug : not defined opertor", name)
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
- print("bug : not define latexify", op)
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

2022/10/17 11:26

投稿

ps_aux_grep
ps_aux_grep

スコア1579

test CHANGED
@@ -8,16 +8,16 @@
8
8
 
9
9
  ```Python
10
10
  def bracket(x): # 括弧の中身の始点startと終点endを探索
11
- start, end, cnt = x.find('('), -1, 1
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, maybe this {x} is incorrect")
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

2022/10/17 11:23

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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("("), -1, 1
11
+ start, end, cnt = x.find('('), -1, 1
12
- for i, _x in enumerate(x[start + 1:]):
12
+ for i, ch in enumerate(x[start + 1:]):
13
- if _x == '(':
13
+ if ch == '(':
14
14
  cnt += 1
15
- elif _x == ')':
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
- stack, ret = list(), list()
23
+ cnt = 0
24
24
  for i, ch in enumerate(x):
25
25
  if ch == '(':
26
- stack.append(i)
26
+ cnt += 1
27
27
  elif ch == ')':
28
- stack.pop()
28
+ cnt -= 1
29
- if ch == ',' and not len(stack):
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

2022/10/17 11:15

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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 = -1, -1, 1
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): # 1つかなのが確定なのでスカラー返す
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 operator", name)
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_value(S)
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

2022/10/17 11:11

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/17 10:55

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/17 10:50

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/17 10:35

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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

2022/10/17 10:32

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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 - 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)}
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

2022/10/17 10:31

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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 not correct")
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

2022/10/17 10:29

投稿

ps_aux_grep
ps_aux_grep

スコア1579

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 + -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)}
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/89ffc537-4171-4e43-a247-bc39b9ac062f.png)
77
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-10-17/5fc4f39a-56ed-48d9-8bd2-bb224e467bcb.png)