"Rotating" tables in Lua?

假设我有表X:

{
  {1,1,1},
  {1,0,0},
  {1,1,1}
}

我的目标是"旋转" X,使其转变为表Y:

{
  {1,1,1},
  {1,0,1},
  {1,0,1}
}

我希望这个解决方案也适用于不对称的表格,比如表格Z:

{
  {1,1,1},
  {1,0,0},
  {1,1,1},
  {1,1,0}
}

请使用Vanilla Lua 5.1使此工作完成,无需添加。

点赞
用户6834680
用户6834680
function transpose(m)
   local rotated = {}
   for c, m_1_c in ipairs(m[1]) do
      local col = {m_1_c}
      for r = 2, #m do
         col[r] = m[r][c]
      end
      table.insert(rotated, col)
   end
   return rotated
end

function rotate_CCW_90(m)
   local rotated = {}
   for c, m_1_c in ipairs(m[1]) do
      local col = {m_1_c}
      for r = 2, #m do
         col[r] = m[r][c]
      end
      table.insert(rotated, 1, col)
   end
   return rotated
end

function rotate_180(m)
   return rotate_CCW_90(rotate_CCW_90(m))
end

function rotate_CW_90(m)
   return rotate_CCW_90(rotate_CCW_90(rotate_CCW_90(m)))
end

使用样例:

local m1 = {
  {1,1,1},
  {1,0,0},
  {1,1,1},
  {1,1,0}
}

local m2 = rotate_CCW_90(m1)
-- m2现在是{
--    {1, 0, 1, 0},
--    {1, 0, 1, 1},
--    {1, 1, 1, 1}
-- }

local m3 = transpose(m1)
-- m3现在是{
--    {1, 1, 1, 1},
--    {1, 0, 1, 1},
--    {1, 0, 1, 0}
-- }
2017-09-29 16:12:10
用户12968803
用户12968803

你想要转置:

function transponieren (udata)
    local tdata = {}
    for y, xs in pairs (udata) do
        for x, value in pairs (xs) do
            tdata[x]=tdata[x] or {}
            tdata[x][y]=value
        end
    end
    return tdata
end

local udata = {
    {1, 0, 0.9},
    {0.9, 0.5, 1},
    {0, 0.1, 1},
}
udata = transponieren (udata) -- 转置后的结果
2021-01-21 09:58:14