2019年1月26日土曜日

Juliaでパズル(3)

Juliaでパズル(2)からの続き)

世の中で流布している数学パズルだと,4つの数字と加減乗除を組み合わせて10をつくる Make 10 が有名らしい。もちろん,この手の問題では計算結果はすべて整数となるのが普通であるが,今回は,実数の範囲で計算して最後に整数化できるものを探している。

とりあえず,2項演算だけを組み合わせた結果をすべて探すプログラムを作ってみた。

(1) findfirst()のように,ある目的の数に一致する数をコレクション(配列またはタプル)の中から探すとともに,その位置の添字を返すことができれば有り難い。いまのところ「タプルの配列に対して1コマンドである数字を見つける方法」がわからない。

(2) 2次元配列ならば融通がききそうなのであるが,「タプルの配列を1コマンドで多次元配列に展開する方法」がわからない。もちろん地道にやればできることなのだが。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
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)
    if b=="cc"
      z=:0
    end
    return (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)
    if  (a!="cc" && b=="cc") || ((a!="cc" || b!="cc") && c=="cc")
      z=:0
    end
    return (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)
    if a=="cc" || c=="cc"
      z=:0
    end
    return (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)
    if a=="cc" || (b!="cc" && c=="cc")
      z=:0
    end
    return (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)
    if a=="cc" || b=="cc"
      z=:0
    end
    return (z,eval(z))
end

pz=[]
uno=["+","-","*","/","cc"]
for a in uno, b in uno, c in uno
    d,e = dop1(a,b,c)
    if e>0.5 && e<Inf
      push!(pz,(d,e))
    end
    d,e = dop2(a,b,c)
    if e>0.5 && e<Inf
      push!(pz,(d,e))
    end
    d,e = dop3(a,b,c)
    if e>0.5 && e<Inf
      push!(pz,(d,e))
    end
    d,e = dop4(a,b,c)
    if e>0.5 && e<Inf
      push!(pz,(d,e))
    end
    d,e = dop5(a,b,c)
    if e>0.5 && e<Inf
      push!(pz,(d,e))
    end
end

qz=[]
sort!(pz, by=x->x[2])
pl=length(pz)
for i in 1:pl
    push!(qz,Int(ceil(pz[i][2])))
end

for i in 1:121
  if in(i,qz)==true
    j=findfirst(isequal(i),qz)
    rz=repr(pz[j][1])
    rz=replace(rz,":"=>"")
    rz=replace(rz,"cc(1, 1)"=>"11")
    rz=replace(rz,"cc(11, 1)"=>"111")
    println(i," -> ",rz," = ",pz[j][2])
  end
end
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 -> (1 - 1 / 11) = 0.9090909090909091
2 -> (1 + 1 / 11) = 1.0909090909090908
3 -> ((1 + 1) + 1 * 1) = 3
4 -> ((1 + 1) + (1 + 1)) = 4
6 -> (11 / (1 + 1)) = 5.5
9 -> (11 - (1 + 1)) = 9
10 -> (1 * 11 - 1) = 10
11 -> ((1 + 11) - 1) = 11
12 -> (1 + 1 * 11) = 12
13 -> ((1 + 1) + 11) = 13
22 -> ((1 + 1) * 11) = 22
110 -> (111 - 1) = 110
111 -> (1 * 111) = 111
112 -> (1 + 111) = 112
121 -> (11 * 11) = 121


「冬麗の不思議をにぎる赤ン坊」(野澤節子 1920-1995)

0 件のコメント: