RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1608755
Accepted
Павел Мищенко
Павел Мищенко
Asked:2025-03-16 13:58:06 +0000 UTC2025-03-16 13:58:06 +0000 UTC 2025-03-16 13:58:06 +0000 UTC

我不明白如何解决“花环”问题[关闭]

  • 772
关闭。这个问题与主题无关。目前不接受对此问题的答复。

寻求调试帮助的问题(“为什么这段代码不起作用? ”)应该包括所需的行为、具体的问题或错误,以及在问题中重现它的最少代码。没有明确问题描述的问题对其他访问者来说是没用的。请参阅如何创建一个最小、独立且可重现的示例。

8 小时前关闭。

改进问题

我制作了一个元素,但我不知道如何将其与其他元素连接起来,我寻求帮助

在此处输入图片描述

n = int(input())
maxn = n * 2 + 1

for i in range(maxn):
    if i <= maxn // 2:
        dots = maxn // 2 - i
        thing = 2 * i + 1
    else:
        dots = i - maxn // 2
        thing = 2 * (maxn - i) - 1
    
    print("." * dots, end="")
    if i == 0 or i == maxn - 1:
        print("#" * thing, end="")
    else: 
        print("#" + "." * (thing - 2) + "#", end="")

    print("." * dots)
python
  • 1 1 个回答
  • 102 Views

1 个回答

  • Voted
  1. Best Answer
    Vitalizzare
    2025-03-16T21:34:41Z2025-03-16T21:34:41Z

    开发原始模型

    在这部分我使用源代码作为黑匣子。该代码非常实用。我们将其写成一个函数,n用替换size,"#"用brick并将它们设置为参数:

    def print_link(size: int, brick: str) -> None:
        maxn = size * 2 + 1
        for i in range(maxn):
            if i <= maxn // 2:
                dots = maxn // 2 - i
                thing = 2 * i + 1
            else:
                dots = i - maxn // 2
                thing = 2 * (maxn - i) - 1
            print("." * dots, end="")
            if i == 0 or i == maxn - 1:
                print(brick * thing, end="")
            else: 
                print(brick + "." * (thing - 2) + brick, end="")
            print("." * dots)
    

    在这种方法中,数据显示在屏幕上,之后我们无法更改它。让我们通过使用托管文本缓冲区替换标准输出设备来解决这个问题:

    def get_link(size: int, brick: str) -> list[str]:
        from io import StringIO
        from contextlib import redirect_stdout
    
        buffer = StringIO()
        with redirect_stdout(buffer):
            print_link(size, brick)
        return buffer.getvalue().splitlines()
    

    现在我们有机会把各个环节连接在一起。操作顺序可能如下:

    1. 建立顶部和底部的链接。
    2. 将顶部链接倒数第二条线的中心替换为底部链接第一条线的中心。
    3. 将底部链接的第二行的中心替换为顶部链接的最后一行的中心。
    4. 删除顶部链接的最后一行和底部链接的第一行。
    5. 按宽度对齐链接。
    6. 连接链接。

    其中一种可能的实现方式:

    from collections.abc import Sequence, Generator
    
    
    def replace_middle(outer: str, inner: str) -> str:
        half_outer = len(outer) // 2
        left, right = outer[:half_outer], outer[half_outer + 1:]
        middle = inner[len(inner) // 2]
        return left + middle + right
    
    
    def generate_chain(n: int, sizes: Sequence[int]) -> Generator[str]:
        from itertools import cycle
    
        if n < 1:
            return
        brick = cycle("#*")
        top = get_link(sizes[0], next(brick))
        if n == 1:
            yield from top
        else:
            align_width = f"{{:.^{1+2*max(sizes)}}}".format
            for size in sizes[1:]:
                bottom = get_link(size, next(brick))
                top[-2] = replace_middle(top[-2], bottom[0])
                bottom[1] = replace_middle(bottom[1], top[-1])
                yield from map(align_width, top[:-1])
                top = bottom[1:]
            yield from map(align_width, top)
    
    
    def main():
        data = input("Количество звеньев и их размеры: ")
        n, *sizes = map(int, data.split())
        print(*generate_chain(n, sizes), sep="\n")
    

    结果示例:

    链接数量及其大小:3 1 1 2
    ..#..
    .###.
    .*#*.
    .###.
    #...#
    .#.#.
    ..#..
    

    另一种观点

    如何使用二维单元格数组来绘图而不是打印链接?在这样的模型中,您可以像在画布上一样从上到下移动数组,并通过从中心垂直方向移动来更改单元格。当你开始绘制下一个链接时,你不是向下移动,而是向上移动一行。例如:

    from itertools import cycle, chain
    
    # Читаем данные
    data = input('Количество и размеры звеньев: ')
    n, *sizes = map(int, data.split())
    assert n == len(sizes)
    
    # Строим пустой холст для рисования
    width = 1 + 2 * max(sizes)
    height = 2 + 2 * sum(sizes) - n
    canvas = [["."] * width for _ in range(height)]
    
    # Рисуем гирлянду
    bricks = cycle("#*")
    middle = width // 2
    row = 0
    for size in sizes:
        brick = next(bricks)
        canvas[row][middle] = brick
        row += 1
        for shift in chain(range(1, size), range(size, 0, -1)):
            canvas[row][middle - shift] = brick
            canvas[row][middle + shift] = brick
            row += 1
        canvas[row][middle] = brick
        row -= 1
    
    # Печатаем содержимое холста
    print('\n'.join(map(''.join, canvas)))
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5