1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
defmodule Ch2 do
@spec magic_expression(num :: String.t(),
target :: integer) :: [String.t()]
def magic_expression(num,target) do
dfs([],num,0,String.length(num),0,0,target,[])
end
defp dfs(ans, num, i, len, acc, pre, target, exp) do
if i == len do
if acc == target do
[exp |> Enum.reverse() |> Enum.join() | ans]
else
ans
end
else
i..(len - 1)
|> Enum.reduce_while(ans, fn j, ans ->
if j > i && String.at(num, i) == "0" do
{:halt, ans}
else
e = String.slice(num, i..j)
n = String.to_integer(e)
if i == 0 do
{:cont, dfs(ans, num, j + 1, len, n, n, target, [e | exp])}
else
{:cont,
ans
|> dfs(num, j + 1, len, acc + n, n, target, [e, "+" | exp])
|> dfs(num, j + 1, len, acc - n, -n, target, [e, "-" | exp])
|> dfs(num, j + 1, len, acc - pre + pre * n, pre * n, target, [e, "*" | exp])}
end
end
end)
end
end
end
|