【问题标题】:Logic with indentation using print function使用打印功能的缩进逻辑
【发布时间】:2020-10-19 15:04:46
【问题描述】:

我希望在控制台上打印“波浪”模式,例如:

   /\
  /  \
 /    

或:

   /\
  /  \
      \
       \

最后,显示为一个大的多波:

   /\  /\
  /  \/  \
 /        \
           \

基于描述向上/向前或向下/向后方向/斜线的斜线数量的整数列表。 我定义了两个函数,一个是波的左侧最长,反之亦然:

from itertools import zip_longest


def left_wave(water_l, water_r):
    """When left side of wave is largest"""
    l_str = " " * water_l + "/"
    if water_r == 1:
        r_str = "\\"
    elif water_r:
        r_str = " " * (water_r * 2 - 2) + "\\"
    else:
        r_str = ""
    line = l_str + r_str
    print(line)


def right_wave(water_l, water_r):
    """When right side of wave is largest"""
    if water_l:
        l_str = " " * water_l + "/"
        factor_r = water_r * 2 - 2
    else:
        l_str = " "
        factor_r = water_r * 2 - 2
    r_str = " " * factor_r + "\\"
    line = l_str + r_str
    print(line)

我从print_sequence() 调用的定义如下:

def print_sequence(args):
    """Show all waves."""
    for wave_height_l, wave_height_r in zip_longest(args[0::2], args[1::2], fillvalue=0):
        for water_l, water_r in zip_longest(reversed(range(1, wave_height_l + 1)),
                                            range(1, wave_height_r + 1),
                                            fillvalue=0):

            if wave_height_l > wave_height_r:
                left_wave(water_l, water_r)
            else:
                right_wave(water_l, water_r)

运行如下:

args = [11, 2,
        5, 7,
        # 4
        ]
print_sequence(args)

目前返回:

           /\
          /  \
         /
        /
       /
      /
     /
    /
   /
  /
 /
     /\
    /  \
   /    \
  /      \
 /        \
           \
             \

我现在正在努力解决的主要问题:我在 right_wave 函数中犯的逻辑错误是什么? (缩进是错误的)。 此外,我将如何开始在同一行上打印 2 个波形?也许在打印函数调用中使用end="" 作为参数?

【问题讨论】:

  • 请注意,print 是面向行的,除非您使用与系统相关的控制代码。这意味着您不能 print 从不同的功能到同一行,并且随后不能将整个波形打印为每个部分的功能。您必须在打印之前构造整行(作为列表、str 或类似的形式)。

标签: python python-3.x logic


【解决方案1】:

如果您可以选择list,这里有一个简单的打印波形的方法:

def print_wave(args):
    total_cols = sum(args)
    total_rows = args[0]  # init total rows by first arg
    matrix = [[' ' for _ in range(total_cols)] for _ in range(total_rows)]

    curr_col = 0
    curr_row = total_rows - 1
    down = True

    for num in args:
        down = not down
        char = '\\' if down else '/'
        # update total rows and current row if need
        if down:
            diff = curr_row + num - total_rows
            if diff > 0:
                for _ in range(diff):
                    matrix.append([' ' for _ in range(total_cols)])
                total_rows += diff
        else:
            diff = num - 1 - curr_row
            if diff > 0:
                for _ in range(diff):
                    matrix.insert(0, [' ' for _ in range(total_cols)])
                total_rows += diff
                curr_row += diff
        for i in range(num):
            matrix[curr_row][curr_col] = char
            # for conjection not update curr row for the last loop
            if i != num - 1:
                if down:
                    curr_row += 1
                else:
                    curr_row -= 1
            curr_col += 1

    for row in matrix:
        for col in row:
            print(col, end='')
        print()

args=[3, 5, 4, 11, 2, 5, 7] 的简单测试:

  /\
 /  \      /\
/    \    /  \
      \  /    \
       \/      \
                \
                 \
                  \
                   \                /
                    \              /
                     \  /\        /
                      \/  \      /
                           \    /
                            \  /
                             \/

希望这会有所帮助。

【讨论】:

  • 我和你的print_wave([3, 2, 2, 4, 4, 5, 5, 7]) 一样,但是通话的两波之间有一个跳跃:print_wave([11, 2, 5, 7])
  • 抱歉造成误解。如果需要联合,则需要动态调整矩阵。我已经更新了我的答案。希望对您有所帮助。
【解决方案2】:

当它是 python 2x 时这很简单,它是一个简单的逗号在末尾完成的魔法 例如。 打印(“一”), 打印(“b”) 输出: 一个 万一python 3x

你必须使用。 end=" " 控制下一个打印函数之间的间距

【讨论】:

  • 对于提供的args 输入,你能在代码中显示这个吗?
猜你喜欢
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多