【问题标题】:How would I best translate this Python script to Lua?我如何最好地将这个 Python 脚本翻译成 Lua?
【发布时间】:2014-08-19 20:15:45
【问题描述】:

作为不熟悉 Python 的人,我正在尝试将这个 Python 翻译成 Lua。函数取自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))

【问题讨论】:

  • 显示获得的输出和预期的输出。
  • 打算把它放在罗塞塔石碑上?
  • 如果我亲自使用它,我会把它放在 Rosetta Code 上,现在我不确定这是否取决于我。
  • 根据这个网页的底部:“在cc by-sa 3.0下授权的用户贡献需要署名”详细信息在这里:creativecommons.org/licenses/by-sa/3.0基本上你可以使用它,只要你有类似的东西答案的链接...
  • 哇,很高兴知道这一点。

标签: python lua translate


【解决方案1】:

所以你的代码几乎是正确的,只有几件事:

    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

【讨论】:

  • 你做得比我快 :)
  • 谢谢,看来我在一些测试中离开了,在其他一些方面搞砸了。
【解决方案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'))

【讨论】:

    猜你喜欢
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2015-09-22
    • 2014-08-13
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多