SSブログ

Lua で小町算 [Lua]

「LL魂ブログ:キミならどう書く 2.0 - 2007 - その 2」 [1] より。Lua で挑戦。
これは言語に eval 相当があれば超有利でコルーチンがあればかなり柔軟に書ける種類の問題かなあと思った。

function table.copy(t)
  local t2 = {}
  for k,v in pairs(t) do
    t2[k] = v
  end
  return t2
end

function enum(items, enums, n)
  if n == 0 then
      coroutine.yield(enums)
  else
    for i,v in ipairs(items) do
      local lenums = table.copy(enums)
      table.insert(lenums, v)
      enum(items, lenums, n-1)
    end
  end
end

function make_expr(ops)
  local expr = ""
  for i,v in ipairs(ops) do
    expr = expr .. i .. v
  end
  return expr .. (#ops+1)
end

function gen_expr(ops, n)
  local co = coroutine.create(function() enum(ops, {}, n) end)
  return function()
    local code, res = coroutine.resume(co)
    return res and make_expr(res)
  end
end

i=0
for e in gen_expr({"+", "-", "*", "/", ""}, 8) do
  local result = loadstring("return "..e)()
  if result == 100 then
    print(e.."="..result)
    i = i + 1
  end
end
print(i.." patterns found")

玄箱での実行は5分かかった。

KURO-BOX% time lua komachi.lua
1+2+3+4+5+6+7+8*9=100
1+2+3-4+5+6+78+9=100
1+2+3-4*5+6*7+8*9=100
1+2+3-45+67+8*9=100
1+2+3*4-5-6+7+89=100
1+2+3*4*5/6+78+9=100
1+2+3*4*56/7-8+9=100
1+2+34-5+67-8+9=100
1+2+34*5+6-7-8*9=100
1+2-3*4+5*6+7+8*9=100
1+2-3*4-5+6*7+8*9=100
1+2*3+4+5+67+8+9=100
1+2*3+4*5-6+7+8*9=100
1+2*3-4+56/7+89=100
1+2*3-4-5+6+7+89=100
1+2*3*4*5/6+7+8*9=100
1+2*34-56+78+9=100
1+23-4+5+6+78-9=100
1+23-4+56+7+8+9=100
1+23-4+56/7+8*9=100
1+23-4-5+6+7+8*9=100
1+23*4+5-6+7-8+9=100
1+23*4+56/7+8-9=100
1+23*4-5+6+7+8-9=100
1+234-56-7-8*9=100
1+234*5*6/78+9=100
1+234*5/6-7-89=100
1-2+3+45+6+7*8-9=100
1-2+3*4+5+67+8+9=100
1-2+3*4*5+6*7+8-9=100
1-2+3*4*5-6+7*8-9=100
1-2-3+4*5+67+8+9=100
1-2-3+4*56/7+8*9=100
1-2-3+45+6*7+8+9=100
1-2-3+45-6+7*8+9=100
1-2-3+45-6-7+8*9=100
1-2-34+56+7+8*9=100
1-2*3+4*5+6+7+8*9=100
1-2*3-4+5*6+7+8*9=100
1-2*3-4-5+6*7+8*9=100
1-23+4*5+6+7+89=100
1-23-4+5*6+7+89=100
1-23-4-5+6*7+89=100
1*2+3+4*5+6+78-9=100
1*2+3+45+67-8-9=100
1*2+3-4+5*6+78-9=100
1*2+3*4+5-6+78+9=100
1*2+34+5+6*7+8+9=100
1*2+34+5-6+7*8+9=100
1*2+34+5-6-7+8*9=100
1*2+34+56+7-8+9=100
1*2+34-56/7+8*9=100
1*2-3+4+56/7+89=100
1*2-3+4-5+6+7+89=100
1*2-3+4*5-6+78+9=100
1*2*3+4+5+6+7+8*9=100
1*2*3-4+5+6+78+9=100
1*2*3-4*5+6*7+8*9=100
1*2*3-45+67+8*9=100
1*2*3*4+5+6+7*8+9=100
1*2*3*4+5+6-7+8*9=100
1*2*3*4-5-6+78+9=100
1*2*34+56-7-8-9=100
1*2/3+4*5/6+7+89=100
1*23+4+5+67-8+9=100
1*23+4+56/7*8+9=100
1*23-4+5-6-7+89=100
1*23-4-56/7+89=100
1*23*4-56/7/8+9=100
1*234+5-67-8*9=100
1/2*3/4*56+7+8*9=100
1/2*34-5+6-7+89=100
1/2/3*456+7+8+9=100
12+3+4+5-6-7+89=100
12+3+4-56/7+89=100
12+3-4+5+67+8+9=100
12+3*4+5+6+7*8+9=100
12+3*4+5+6-7+8*9=100
12+3*4-5-6+78+9=100
12+3*45+6*7-89=100
12+34+5*6+7+8+9=100
12+34-5+6*7+8+9=100
12+34-5-6+7*8+9=100
12+34-5-6-7+8*9=100
12-3+4*5+6+7*8+9=100
12-3+4*5+6-7+8*9=100
12-3-4+5-6+7+89=100
12-3-4+5*6+7*8+9=100
12-3-4+5*6-7+8*9=100
12*3-4+5-6+78-9=100
12*3-4-5-6+7+8*9=100
12*3-4*5+67+8+9=100
12/3+4*5-6-7+89=100
12/3+4*5*6-7-8-9=100
12/3+4*5*6*7/8-9=100
12/3/4+5*6+78-9=100
123+4-5+67-89=100
123+4*5-6*7+8-9=100
123+45-67+8-9=100
123-4-5-6-7+8-9=100
123-45-67+89=100
101 patterns found
lua komachi.lua  304.52s user 0.03s system 99% cpu 5:04.56 total

アルゴリズム的に高速化するのはできるのかなあ。よくわからない。

[1] http://karetta.jp/article/blog/ll-spirit/034942


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。