Python - создание фигуры с двумя линиями и тремя звездочками посередине

Я должен спросить у пользователя номер и распечатать следующие формы:

пользовательский ввод = 1 (1 единица в высоту и 1 единица между двумя строками)

*****
* * *
*****

пользовательский ввод = 2 (2 блока высотой, 2 блока между ними)

*******
*  *  *
*  *  *
*******

пользовательский ввод = 3

*********
*   *   *
*   *   *
*   *   *
*********

и так далее...

На данный момент я получаю полый квадрат с номером пользовательского ввода:

side = int(input("Choose a number: "))
inner = side - 2
print ('*' * side)
for i in range(inner):
    print ('*' + ' ' * inner + '*')
print ('*' * side)

4 ответа

Решение

Обычно, когда вы хотите решить проблемы с ASCII-искусством, вы начинаете с анализа изображения. То, что мы видим здесь, это то, что каждое изображение:

  1. сначала есть строка, которая имеет 2*n+3 звездочки;
  2. с последующим n строки, которые отмечены звездочкой, n пробелы, звездочка, n пробелы и снова звездочка; а также
  3. линия с 2*n+3 звездочки.

Таким образом, мы можем просто использовать тот факт, что последовательность (list, strING, tuple), умноженное на число, представляет собой последовательность того же типа, которая повторяет последовательность заданное количество раз.

Так что для первой и последней строки мы можем просто написать '*'*(2*n+3), Линии в середине могут быть построены с '*'+' '*n+'*'+' '*n+'*' и мы должны повторить это n раз. Таким образом, мы можем построить список строк с помощью:

['*'*(2*n+3)]+['*'+' '*n+'*'+' '*n+'*']*n+['*'*(2*n+3)]
# ^ first     ^ middle line               ^ last line

А потом использовать '\n'.join(..) соединить линии вместе:

def print_pattern(n):
    print('\n'.join(['*'*(2*n+3)]+['*'+' '*n+'*'+' '*n+'*']*n+['*'*(2*n+3)]))

Это создает:

>>> print_pattern(1)
*****
* * *
*****
>>> print_pattern(2)
*******
*  *  *
*  *  *
*******
>>> print_pattern(3)
*********
*   *   *
*   *   *
*   *   *
*********
>>> print_pattern(4)
***********
*    *    *
*    *    *
*    *    *
*    *    *
***********
>>> print_pattern(5)
*************
*     *     *
*     *     *
*     *     *
*     *     *
*     *     *
*************

Вы также можете сделать его более предшествующим (хотя это обычно считается менее Pythonic) с помощью for цикл:

def print_pattern(n):
    print('*'*(2*n+3))
    for _ in range(n):
        print('*'+' '*n+'*'+' '*n+'*')
    print('*'*(2*n+3))

Или в программе с пользовательским вводом:

def print_pattern(n):
    print('*'*(2*n+3))
    for _ in range(n):
        print('*'+' '*n+'*'+' '*n+'*')
    print('*'*(2*n+3))
n = int(input("Eliga un número: "))
print_pattern(n)

Это должно работать для вас:

m = 6
n = 2
for i in range(m*n+(m-n)):
    print '*',

print
for c in range(m):
    for i in range(m):
        print "*",
        for b in range(n):
            print ' ',

     print

for i in range(m*n+(m-n)):
print '*',

print

Есть две основные вещи, которые должна сделать ваша программа. Во-первых, вам нужно рассчитать длину верхней и нижней линий. Это 3 + 2 * (число от пользователя), потому что будет 3 звездочки и 2 пробела, причем каждый пробел будет иметь ту же длину, что и число, введенное пользователем.

Тогда вам нужно использовать петли. Сначала распечатайте количество звездочек из числа, которое вы рассчитали выше. Затем используйте цикл, чтобы распечатать звездочки и пробелы. Вы можете выполнить каждую итерацию цикла, чтобы напечатать одну строку, поэтому цикл просто используется для вывода правильного количества строк. Затем выведите последнюю строку, соответствующую первой строке звездочек.

Я использовал формат () для обобщения

def ascing(n, C, patmid = "*{0: <{gap}}*{0: <{gap}}*\n" ):
    mid = (n * patmid).format(' ', gap=n)
    print( "{0}\n{1}{0}".format((3+2*n)*C, mid) )


for x in range(1,7):
    ascing(x, '*')
    print("\n====================\n")
Другие вопросы по тегам