如何最好地将此Python脚本翻译成Lua?

我正在尝试将这个 Python 代码翻译成 Lua,但我不熟悉 Python。这个函数取自 http://rosettacode.org/wiki/Sierpinski_triangle#Python

def sierpinski(n):
    d = ["*"]
    for i in xrange(n):
        sp = " " * (2 ** i)
        d = [sp+x+sp for x in d] + [x+" "+x for x in d]
    return d

print "\n".join(sierpinski(4))

这是我迄今为止的代码,但它没有给出预期输出。我是不是分析 Python 代码出错了?我自己不懂 Python,所以我认为这是正确的。

function each(array,operation)
    --  对数组中的每个对象执行操作
    local out = {}
    for _,obj in pairs(array) do
        print(obj)
        table.insert(out,operation(obj))
    end
    return out
end

function join(...)
    --  合并两个表
    local out = {}
    for _,arr in pairs({...}) do
        for _,v in pairs(arr) do
            table.insert(out,v)
        end
    end
    return out
end

function sierpinski(n)
    local triangle = {"*"}
    for i = 1,n do
        local sp = (" "):rep(2^n)
        triangle = join(
            each(triangle,(function(x)
                return sp..x..sp
            end)),
            each(triangle,(function(x)
                return x.." "..x
            end))
        )
    end
    return table.concat(triangle,"\n")
end

print(sierpinski(4))
点赞
用户667648
用户667648

所以你的代码基本正确,只有几个问题:

    print(obj)

这一行产生了不必要的打印,会搞乱一些东西。

for i = 1,n do

由于 Python 和 Lua 的索引不同,这应该是:0,n-1

    local sp = (" "):rep(2^n)

n 应该是 i

总之,这在我的机器上工作:

function each(array,operation)
    --  在数组中的每个对象上执行操作
    local out = {}
    for _,obj in pairs(array) do
        table.insert(out,operation(obj))
    end
    return out
end

function join(...)
    --  合并两个表
    local out = {}
    for _,arr in pairs({...}) do
        for _,v in pairs(arr) do
            table.insert(out,v)
        end
    end
    return out
end

function sierpinski(n)
    local triangle = {"*"}
    for i = 0,n-1 do
        local sp = (" "):rep(2^i)
        triangle = join(each(triangle,(function(x) return sp..x..sp end)), each(triangle,(function(x) return x.." "..x end)))
    end
    return table.concat(triangle,"\n")
end
2014-06-29 06:07:12
用户375651
用户375651

一个较短的版本:

--定义函数
local function sierpinski(n)
  local d = {'*'} --初始化
  for i = 0, n - 1 do  --循环
    local sp = string.rep(' ', 2^i) --填充空格的数量
    local len = #d --获取d数组的长度
    for i = 1, len do
      local x = d[i]
      d[i] = sp .. x .. sp --上半部分
      d[i+len] = x .. ' ' .. x --下半部分
    end
  end
  return d --返回结果
end

--输出结果
print(table.concat(sierpinski(4), '\n'))
2014-07-01 06:33:40