Lua数组以指定顺序打印结果

时间:2018-12-02 22:23:40

标签: lua lua-table

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时,它将检查下一个立即表,以查看最后一个元素是否也是一个;如果为true,则将其删除并添加到前七个表中,最后一个数字为1,然后将再次检查下一个立即表。如果为true,则还将删除该表并添加到前七个表中,并添加到前七个表中。错误返回到它离开的地方。因此,此处已删除其元素的表的数量为5。 所以我希望,如果所有五个元素都为1或0,它们也可以满足该规则。但是似乎只有六个元素满足该规则...

我希望这很清楚

1 个答案:

答案 0 :(得分: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))