废话不多打了,直接上代码得了
local _24PointManager = {}
local _24PointResult = 24
local OperateType = {
Add = 1,
Sub = 2,
Mul = 3,
Div = 4,
}
local TempNumberLine = {}
local TempNumberList = {}
local HandlerList = {}
local Handlers = {
[OperateType.Add] = function (a, b) return a + b end,
[OperateType.Sub] = function (a, b) return a - b end,
[OperateType.Mul] = function (a, b) return a * b end,
[OperateType.Div] = function (a, b) return a / b end,
}
local OperateSymbol = {
[OperateType.Add] = " + ",
[OperateType.Sub] = " - ",
[OperateType.Mul] = " * ",
[OperateType.Div] = " / ",
}
local function InitOperateMap()
for _, operate_1 in pairs(OperateType) do
for _, operate_2 in pairs(OperateType) do
for _, operate_3 in pairs(OperateType) do
local operates = {operate_1, operate_2, operate_3}
table.insert(HandlerList, operates)
end
end
end
end
local function CopyNumberTable(t)
local new_t = {}
for k, v in pairs(t) do
new_t[k] = v
end
return new_t
end
local function Swap(t, i1, i2)
local new_t = _24PointManager.CopyNumberTable(t)
local temp = new_t[i1]
new_t[i1] = new_t[i2]
new_t[i2] = new_t
return new_t
end
local function GetNumberMap(nums)
for i = 1, #nums do
TempNumberLine[#nums] = nums[i]
if #nums == 1 then
table.insert(TempNumberList, TempNumberLine)
TempNumberLine = _24PointManager.CopyNumberTable(TempNumberLine)
return
end
local tempNums = _24PointManager.CopyNumberTable(nums)
table.remove(tempNums, i)
_24PointManager.GetNumberMap(tempNums)
end
end
local function DoCal(operates, numbers)
local result = numbers[1]
for i, operate in ipairs(operates) do
result = Handlers[operate](result, numbers[i + 1])
end
if math.abs(result - _24PointResult) > 0.0001 then
return false
end
_24PointManager.PrintResult(operates, numbers, result)
return true
end
local function PrintResult(operates, numbers, result)
local str = tostring(numbers[1])
for i, operate in ipairs(operates) do
str = str .. OperateSymbol[operate] .. numbers[i + 1]
end
XLog.Error("[dragon] ---------->>", str .. " = " .. result, "<<----------")
end
function _24PointManager.GetResult(nums)
local resultCount = 0
TempNumberList = {}
for k, v in pairs(nums) do
nums[k] = tonumber(v)
end
_24PointManager.GetNumberMap(nums)
XLog.Debug("24点结果:")
for _, operates in pairs(HandlerList) do
for _, numbers in pairs(TempNumberList) do
if _24PointManager.DoCal(operates, numbers) then
resultCount = resultCount + 1
end
end
end
XLog.Debug("[dragon] 匹配数量:", resultCount)
end
-- 初始化符号表
InitOperateMap()
return _24PointManager