Lua массив печатает результаты в указанном порядке - PullRequest
0 голосов
/ 03 декабря 2018
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, он также удаляет это и добавляет к семерке, делающей 8. Он проверяет снова, и еслиложное возвращение туда, где оно осталось.Таким образом, здесь таблица, элемент которой был удален, становится пятью.Поэтому я надеялся, что они могли бы удовлетворить этому правилу, даже если все пять элементов равны 1 или 0. Но кажется, что только шесть элементов удовлетворяют правилу ...

Надеюсь, это понятно Спасибо

1 Ответ

0 голосов
/ 03 декабря 2018
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))
...