斜方向分割二维数组(lua简易实现)

分析规律(下图为11行-5列示例)

  • 同颜色数字相差值为列数-1
  • 可以产生(行数+列数-1)组数字(如图是15)
  • 每组数字中,每一行最多只有一个(同行号应舍去)

function formatVal(val)
    if val < 10 then return " " .. tostring(val) end
    return tostring(val)
end

local cols = 5
local rows = 11
local t = {}
local gap = " "
for r = 1, rows do
    local line = ""
    for c = 1, cols do
        local val = (r - 1) * cols + c
        table.insert(t, val, val)
        line = line .. " " .. formatVal(val)
    end
    print(line)
end

function SplitBySlash(t, cols, rows)
    local arr2 = {}
    local offset = cols - 1
    for c = 1, rows + cols - 1 do
        local arr = {}
        for r = 1, rows do
            local n = c + (r - 1) * offset
            local fakeR = math.ceil(n / cols)
            if fakeR == r then
                table.insert(arr, n)
                print(n, r, fakeR)
            end

        end
        print("================")
        table.insert(arr2, arr)
    end
    return arr2
end

local function __dump(var, level)
    local rval = {}
    table.insert(rval, "{")
    for k, v in pairs(var) do
        if type(v) == "table" and getmetatable(var) ~= v then
            if k ~= "__base" then
                table.insert(rval, string.format("%s%s=%s",
                                                 string.rep("    ", level), k,
                                                 __dump(v, level + 1)))
            end
        elseif type(v) ~= "function" then
            table.insert(rval, string.format("%s%s=%s",
                                             string.rep("    ", level), k,
                                             tostring(v)))
        end
    end
    table.insert(rval, string.format("%s}", string.rep("    ", level - 1)))
    return table.concat(rval, "\n")
end

local function log(inst)
    if inst == nil then
        print(nil)
        return
    end
    print(__dump(inst, 1))
end

local array2 = SplitBySlash(t, cols, rows)
log(array2)

最终效果

标签: none