--MyDebugTools
--priority
SUB = 1
ADD = 2
DIV = 3
MUL = 4
DIGIT = 5
function MergeNode(tbNode1 , tbNode2 , szOperator)
tbNode = {}
----ADD----
if szOperator == "+" then
tbNode.Num = tbNode1.Num + tbNode2.Num
tbNode.Pri = ADD
tbNode.Str = tbNode1.Str.." + "..tbNode2.Str
----MUL----
elseif szOperator == "*" then
tbNode.Num = tbNode1.Num * tbNode2.Num
tbNode.Pri = MUL
if(tbNode1.Pri < MUL) then
tbNode.Str = "("..tbNode1.Str..") * "
else
tbNode.Str = tbNode1.Str.." * "
end
if(tbNode2.Pri < MUL) then
tbNode.Str = tbNode.Str.."("..tbNode2.Str..")"
else
tbNode.Str = tbNode.Str..tbNode2.Str
end
----SUB----
elseif szOperator == "-" then
tbNode.Num = tbNode1.Num - tbNode2.Num
tbNode.Pri = SUB
if(tbNode2.Pri < DIV) then
tbNode.Str = tbNode1.Str.." - ("..tbNode2.Str..")"
else
tbNode.Str = tbNode1.Str.." - "..tbNode2.Str
end
----DIV----
elseif szOperator == "/" then
tbNode.Num = tbNode1.Num / tbNode2.Num
tbNode.Pri = DIV
if(tbNode1.Pri <= DIV) then
tbNode.Str = "("..tbNode1.Str..") / "
else
tbNode.Str = tbNode1.Str.." / "
end
if(tbNode2.Pri < DIGIT) then
tbNode.Str = tbNode.Str.."("..tbNode2.Str..")"
else
tbNode.Str = tbNode.Str..tbNode2.Str
end
end
return tbNode
end
tblstAns = {}
function Calculate(tblstNode)
local nLen = #tblstNode
if(nLen == 1) then
if(tblstNode[1].Num == 24) then
table.insert(tblstAns ,tblstNode[1].Str)
end
return
end
for i = 1 , nLen do
for j = i + 1 , nLen do
local tbTmpLst = {}
for k = 1 , nLen do
repeat
if( k == i or k == j) then
break
end
table.insert(tbTmpLst,tblstNode[k])
until true
end
local nEnd = #tbTmpLst + 1
tbTmpLst[nEnd] = MergeNode(tblstNode[i],tblstNode[j],"+")
Calculate(tbTmpLst)
tbTmpLst[nEnd] = MergeNode(tblstNode[i],tblstNode[j],"*")
Calculate(tbTmpLst)
tbTmpLst[nEnd] = MergeNode(tblstNode[i],tblstNode[j],"-")
Calculate(tbTmpLst)
tbTmpLst[nEnd] = MergeNode(tblstNode[j],tblstNode[i],"-")
Calculate(tbTmpLst)
tbTmpLst[nEnd] = MergeNode(tblstNode[i],tblstNode[j],"/")
Calculate(tbTmpLst)
tbTmpLst[nEnd] = MergeNode(tblstNode[j],tblstNode[i],"/")
Calculate(tbTmpLst)
end
end
return
end
function Calculate24(...)
local tblstNode = {}
for i , v in ipairs {...} do
tbNode = {}
tbNode.Num = v
tbNode.Str = tostring(v)
tbNode.Pri = DIGIT
tblstNode[i] = tbNode
end
Calculate(tblstNode)
n ={}
for i = 1 , #tblstAns do
print(tblstAns[i].."\n")
end
end
function Main()
Calculate24(5,4,12,9)
end
Main()