如何将这个Python脚本最佳翻译成Lua?

2 投票
2 回答
1427 浏览
提问于 2025-04-18 11:28

我正在尝试把这段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)
    --  Do an operation on each object in an array
    local out = {}
    for _,obj in pairs(array) do
        print(obj)
        table.insert(out,operation(obj))
    end
    return out
end

function join(...)
    --  Join two tables
    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))

2 个回答

2

简短版:

local function sierpinski(n)
  local d = {'*'}
  for i = 0, n - 1 do
    local sp = string.rep(' ', 2^i)
    local len = #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'))
3

你的代码差不多是对的,只是有几个地方需要注意:

    print(obj)

这一行会产生多余的输出,搞乱了一些东西。

for i = 1,n do

因为Python和Lua的索引方式不同,所以这里应该是:0,n-1

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

n应该改成i

总的来说,这在我的电脑上是可以正常工作的:

function each(array,operation)
    --  Do an operation on each object in an array
    local out = {}
    for _,obj in pairs(array) do
        table.insert(out,operation(obj))
    end
    return out
end

function join(...)
    --  Join two tables
    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

撰写回答