在LUA中生成星型图案

我是LUA编程的新手,不知道如何解决下面的问题。

给定一个数N生成一个星型图案,使得第一行有N个星星,随后的每一行星星的数量减少1个。

生成的图案应该有N行。在每行中,每隔五个星号(*)就用一个#号代替。每行应该有所需的星号(*)和#号符号。

[示例输入和输出,其中第一行是测试用例的数量](https://i.stack.imgur.com/IwAw9.png)

这是我尝试的..但我无法继续

function generatePattern()
  n = tonumber(io.read())
  i = n
  while(i >= 1)
  do
    j = 1
    while(j<=i)
    do
      if(j<=i)
      then
          if(j%5 == 0)
          then
             print("#");
          else
             print("*");
          end
        print(" ");
      end
      j = j+1;
    end
    print("\n");
    i = i-1;
  end
end

tc = tonumber(io.read())
for i=1,tc
do
   generatePattern()
end
点赞
用户8080648
用户8080648

请不要使用这个答案,因为它不是良好的编程风格!我想删除它,但 SO 不会让我。请查看评论和其他答案,寻找更好的解决方案。


我的 Lua print 函数会为每个输出添加换行符,因此我将每个字符连接成一个字符串,并在之后打印出连接后的字符串。

function generatePattern()
  n = tonumber(io.read())
  i = n
  while(i >= 1)
      do
        ouput = ""
        j = 1
        while(j<=i)
        do
              if(j%5 == 0)
              then
                 ouput=ouput .. "#";
              else
                 ouput=ouput .. "*";
              end
          j = j+1;
        end
        print(ouput);
        i = i-1;
      end
end

此代码仅是您的代码作出少量改动以呈现正确输出。解决此任务的方法有很多种,有些比其他方法更快或更直观。

2020-10-19 12:32:06
用户11740758
用户11740758

根据 Lua 版本,元方法 __index 可以持有 rep 进行重复操作...

--- Lua 5.3
n=10
asterisk='*'
print(asterisk:rep(n))
-- 输出:**********
2020-10-19 13:04:12
用户4984564
用户4984564

首先,只有星号没有井号。 这部分很容易:

local function pattern(n)
  for i=n,1,-1 do
    print(string.rep("*", i))
  end
end

要将每个第5个星号替换为井号,您可以通过以下替换扩展表达式:

local function pattern(n)
  for i=n,1,-1 do
    print((string.rep("*", i):gsub("(%*%*%*%*)%*", "%1#")))
  end
end

模式中的星号需要用转义,因为Lua模式中的*具有特殊含义。

请注意,string.gsub返回2个值,但可以通过添加额外的括号将它们截断为一个值,导致形式有些尴尬的方式print((..))

2020-10-19 13:39:56
用户3342050
用户3342050
#! /usr/bin/env lua   <!-- lua脚本环境声明-->

for n = arg[1], 1, -1 do   <!--for循环,n为输入,从输入到1循环-->
  local char = ''   <!--定义字符串char-->

  while #char < n do   <!--while循环,当字符串长度小于n,继续循环-->
    if #char %5 == 4 then char = char ..'#'   <!--当字符长度对5取余为4时,在字符后加入#号-->
    else char = char ..'*'   <!--否则在字符后加入*号-->
    end   <!--结束if判断-->
  end   <!--结束while循环-->

  print(char)   <!--输出字符串char-->
end   <!--for循环结束-->

chmod +x asterisk.lua

./asterisk.lua 15

2020-10-20 08:14:24