0
function table_merge(t1, t2)
    for _, v in ipairs(t2) do
        table.insert(t1, v)
    end
end


 function getMaster(tbl, rules)
     local result = false
     for _, rule in ipairs(rules) do
         for i, v in ipairs(tbl) do
             result = v
             if tostring(v) ~= tostring(rule) then
                 result = false
                 break
             end
         end
         if result then break end
     end

     return result
 end

function start(data, rules)
    local master_key, master_val
    local _temp, continue = {}, true

    for i, tbl in ipairs(data) do
        local master = getMaster(tbl, rules)

        if master and master ~= master_val then
            continue = true
        end

        if continue then
            if master then
                master_key = i
                master_val = master
            elseif tbl[#tbl] == master_val then
                tbl[#tbl] = nil
                table.insert(_temp[master_key], master_val)
           elseif master_key then
               continue = false
           end
       end
       _temp[i] = tbl
    end

    local result = {}
    for i, tbl in ipairs(_temp) do
        table_merge(result, tbl)
    end

    return table.concat(result, "")
 end

-- RULES
local rules = { 0, 1}

local data = {
    { 0, 0, 0, 0, 0, 0 },
    { 1, 1, 1, 1, 1, 0 },
    { 0, 0, 0, 8, 1, 0 },
    { 1, 1, 1, 1, 8, 8 },
    { 0, 0, 0, 0, 0, 0 },
}

start(data, rules)

输出:

000000001111100081111188000000

预期的结果应该是这样的:

000000001111110008111188000000

如何获得所需的结果?该表可以包含六个以上的元素,但最初是六个。所以当所有元素都为1时,它会检查下一个立即表,看最后一个元素是否也是1;如果为真,则将其删除并添加到六中,如果最后一位为 1,它将再次检查下一个立即表,如果为真,它也将删除并添加到七中,如果是 8。它将再次检查,如果false 回到它离开的地方。所以这里删除元素的表的数量变成了五个。所以我希望如果所有五个元素都是1或0,它们也能满足规则。但似乎只有六个元素满足规则......

我希望它很清楚谢谢

4

1 回答 1

0
function table_merge(t1, t2)
   for _, v in ipairs(t2) do
      table.insert(t1, v)
   end
end

function getMaster(tbl, rules, w)
   local result = false
   for _, rule in ipairs(rules) do
      for i = 1, w do
         local v = tbl[i]
         result = v
         if tostring(v) ~= tostring(rule) then
            result = false
            break
         end
      end
      if result then break end
   end
   return result
end

function start(data, rules)
   local width = #data[1]  -- assuming all data rows have the same width
   local master_keys = {}
   local master_values = {}
   local continue_idx = width + 1

   for i, tbl in ipairs(data) do
      for w = width, 1, -1 do
         if w >= continue_idx and tbl[w] == master_values[w] then
            table.insert(data[master_keys[w]], master_values[w])
            tbl[w] = nil
         else
            local master = getMaster(tbl, rules, w)
            if master then
               master_keys[w] = i
               master_values[w] = master
               continue_idx = w
            else
               continue_idx = w + 1
            end
            break
         end
      end
   end

   local result = {}
   for i, tbl in ipairs(data) do
      table_merge(result, tbl)
   end
   return table.concat(result, "")
end

-- RULES
local rules = { 0, 1 }

local data = {
   { 0, 0, 0, 0, 0, 0 },
   { 1, 1, 1, 1, 1, 0 },
   { 0, 0, 0, 8, 1, 0 },
   { 1, 1, 1, 1, 8, 8 },
   { 0, 0, 0, 0, 0, 0 },
}

print(start(data, rules))
于 2018-12-03T12:54:59.130 回答