如何将这个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)
-- 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