【问题标题】:Create an Hour Glass pattern on Java or Python using Simple Code?使用简单代码在 Java 或 Python 上创建沙漏模式?
【发布时间】:2019-01-23 03:17:34
【问题描述】:

所以我想知道,是否有任何简单的代码可以使用 Java 或 Python 制作具有奇数或偶数输入的沙漏图案?因为我的代码不简单(我用的是 Python)。

这是输出示例:

然后,这是我的代码:

def evenGlassHour(target):
 jsp=1
 jtop=target
 jbot=2
 jbotspace=int(target/2)
 eventarget=int(target/2)
 temp=""
 for i in range(eventarget):
     for j in range(i):
         temp+=" "
     for jsp in range(jtop):
         temp+="@"
     jtop-=2
     temp+="\n"
 for i in range(eventarget-1):
     for j in range(jbotspace-2):
         temp+=" "
     for j in range(jbot+2):
         temp+="@"
     jbot+=2
     jbotspace-=1
     temp+="\n"

 print(temp)

def oddGlassHour(target):
 jsp=1
 jtop=target
 jbot=1
 jbotspace=int(target/2)
 oddtarget=int(target/2)
 temp=""
 for i in range(oddtarget):
     for j in range(i):
         temp+=" "
     for jsp in range(jtop):
         temp+="@"
     jtop-=2
     temp+="\n"
 for i in range(oddtarget+1):
     for j in range(jbotspace):
         temp+=" "
     for j in range(jbot):
         temp+="@"
     jbot+=2
     jbotspace-=1
     temp+="\n"

 print(temp)

target=int(input("Input : "))

if(target%2==0):
 evenGlassHour(target)
else:
 oddGlassHour(target)

这是我的代码的结果:

 Input : 6
 @@@@@@
  @@@@
   @@
  @@@@
 @@@@@@

 Input : 7
 @@@@@@@
  @@@@@
   @@@
    @
   @@@
  @@@@@
 @@@@@@@

【问题讨论】:

  • 请直接发布代码和结果,不要截图。
  • 好的,等我编辑一下
  • 请记住,如果您将问题移至Code Review,您的问题需要包含在问题本身中的代码。另外,你的程序应该做什么并不明显,所以最好添加一个例子。
  • 非常感谢您提供的信息

标签: java python


【解决方案1】:

您可以使用带有str.zfill 和递归的字符串格式:

def _glass(_input, _original, flag=True):
  if _input in {1, 2}:
    return ('00' if _input == 2 else '0').center(_original) if flag else ''
  if flag:
    return ('0'*(_input)).center(_original)+'\n'+_glass(_input-2, _original, flag=flag)
  return _glass(_input-2, _original, flag=flag)+'\n'+('0'*(_input)).center(_original)

def print_glasses(_input):
  print(_glass(_input, _input)+_glass(_input, _input, False))

for i in range(3, 8):
  print_glasses(i)
  print('-'*20)

输出:

000
 0 
000
--------------------
0000
 00 
0000
--------------------
00000
 000 
  0  
 000 
00000
--------------------
000000
 0000 
  00  
 0000 
000000
--------------------
0000000
 00000 
  000  
   0   
  000  
 00000 
0000000
--------------------

【讨论】:

    【解决方案2】:

    在java中你可以写如下:

    public static void printPattern(int size) {
        int n = size; 
        boolean upper = true;
        for(int i = 0; size%2 == 0? i< size-1 : i<size; i++){            
            String str = String.join("", Collections.nCopies(n, "@"));
            String pad = String.join("", Collections.nCopies((size-n)/2 , " "));
            System.out.println(pad+str+pad);
            if(n-2>0 && upper){
                n-=2;
            }
            else {
                n+=2;
                upper = false;
            }           
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用居中对齐字符串格式

      灵感:https://stackoverflow.com/a/44781576

      def render(size):
          char = "*"
          #build a center-justified format mask
          mask = '{:^%ds}' % (size)
      
          print("size:%s:\n" % (size))
      
          #count down your shrinking
          for i in range(size, 0, -2):
              print(mask.format(char * i))
      
          #trickier:  you've already printed the narrowest
          #and your next line is different depending on odd/even input 
          if size % 2:
              start = 3
          else:
              start = 4
      
          for i in range(start, size+1, 2):
              print(mask.format(char * i))
          print()
      
      
      render(3)
      render(5)
      render(12)
      

      输出:

      size:3:
      
      ***
       *
      ***
      
      size:5:
      
      *****
       ***
        *
       ***
      *****
      
      size:12:
      
      ************
       **********
        ********
         ******
          ****
           **
          ****
         ******
        ********
       **********
      ************
      

      【讨论】:

        【解决方案4】:

        在 Python 中,您可以利用这样一个事实,即您可以将字符串乘以 x 并将字符串与自身连接 x 次,例如:

        "test" * 3 # becomes testtesttest
        

        此外,您还可以对沙漏的顶部和底部使用相同的函数,方法是为 range 使用不同的值:

        def evenGlassHour(target, direction = 1):
            for i in range(target, 1, -2) if direction == 1 else range(4, target+1, 2):
                pad = int((target - i) / 2)
                print((" " * pad) + "@" * i + " " * pad)
            if direction == 1:
                evenGlassHour(target, -1)
        
        def oddGlassHour(target, direction = 1):
            for i in range(target, 1, -2) if direction == 1 else range(1, target+1, 2):
                pad = int((target - i) / 2)
                print((" " * pad) + "@" * i + " " * pad)
            if direction == 1:
                oddGlassHour(target, -1)
        
        target=int(input("Input : "))
        
        if target % 2 == 0:
            evenGlassHour(target)
        else:
            oddGlassHour(target)
        

        编辑:您甚至可以删除递归调用,只需将 chain 两个范围放在一起,使函数更小:

        from itertools import chain
        
        def evenGlassHour(target):
            for i in chain(range(target, 1, -2), range(4, target+1, 2)):
                pad = int((target - i) / 2)
                print((" " * pad) + "@" * i + " " * pad)
        

        最后,您可以让函数接受要打印的所需符号(任意长度),如下所示:

        def evenGlassHour(target, symbol = "@"):
            for i in chain(range(target, 1, -2), range(4, target+1, 2)):
                pad = int((target - i) / 2) * len(symbol)
                print((" " * pad) + symbol * i + " " * pad)
        

        你也可以把这两个功能结合起来,让它更可笑:

        from itertools import chain
        def glassHour(t, s = "@"):
            for i in chain(range(t, 1, -2), range((4 if t % 2 == 0 else 1), t+1, 2)): 
                print((" " * (int((t - i) / 2)*len(s)) + s * i + " " * (int((t - i) / 2)*len(s))))
        
        target=int(input("Input : "))
        glassHour(target, "$$")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多