4つの数字から整数をつくるパズルをコンピュータで処理させるためには,式に対応する文字列を,プログラム内で式として評価する必要がある。これは,JuliaドキュメントのMetaprogrammingのところに詳しいが,ここでのポイントは,Juliaでは,Juliaプログラムの中で,Juliaコードを生成したり操作したりすることができるということである。具体例としては次のような例文が示されている。
julia> function math_expr(op, op1, op2)
expr = Expr(:call, op, op1, op2)
return expr
end
math_expr (generic function with 1 method)
julia> ex = math_expr(:+, 1, Expr(:call, :*, 4, 5))
:(1 + 4 * 5)
julia> eval(ex)
21
そこで(1, 1, 1, 1)パズルで上記を用い,2項演算子を3つ与えた場合の5つのパターンの構文とその値を出力する関数を書いてみる。cc(a, b) = 10*a + bは2つの数字を並べて2桁の数(例えば a=1, b=1 なら cc(1,1) = 11である)を作る関数である。funcion me() においてSymbol(op)は文字列として与えた2項演算子を Expr型に変換する関数である(注:Ver 0.6以前の資料では symbol と小文字で始まっているので,Ver. 1.0 以降では大文字にすること)。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function cc(a,b)
return 10*a+b
end
function me(op, op1, op2)
expr = Expr(:call,Symbol(op), op1, op2)
return expr
end
function dop1(a,b,c)
# ((a,b),(cd))
x=me(a,1,1)
y=me(c,1,1)
z=me(b,x,y)
println((z,eval(z)))
end
function dop2(a,b,c)
# (((a,b),c),d)
x=me(a,1,1)
y=me(b,x,1)
z=me(c,y,1)
println((z,eval(z)))
end
function dop3(a,b,c)
# ((a,(b,c)),d)
x=me(b,1,1)
y=me(a,1,x)
z=me(c,y,1)
println((z,eval(z)))
end
function dop4(a,b,c)
# (a,((b,c),d))
x=me(b,1,1)
y=me(c,x,1)
z=me(a,1,y)
println((z,eval(z)))
end
function dop5(a,b,c)
# (a,(b,(c,d)))
x=me(c,1,1)
y=me(b,1,x)
z=me(a,1,y)
println((z,eval(z)))
end
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
dop1("cc","/","+")
dop2("cc","+","*")
dop3("-","*","/")
dop4("+","\\","^")
dop5("+","-","*")
(:((cc(1, 1) + 1) * 1), 12)
(:((1 - 1 * 1) / 1), 0.0)
(:(1 + (1 \ 1) ^ 1), 2.0)
(:(1 + (1 - 1 * 1)), 1)
(Juliaでパズル(3)に続く)
0 件のコメント:
コメントを投稿