Как напечатать наполовину заполненный квадрат звездочки?

#python #design-patterns

#python #дизайн-шаблоны

Вопрос:

Я могу получить пустой квадрат, но, похоже, не могу понять, как заполнить правую половину квадрата. Вот что у меня есть…

 def star():
    """ Display a star without the normal new line """
    print('*', end='')
def space():
    """ Display a space without the normal new line """
    print(' ', end='')
def newline():
    """ Display a new line """
    print()

def halfAndHalf(size):
    """ Display a square that is half filled 
        - This example has size = 6
    ******  
    *  ##*
    *  ##*
    *  ##*
    *  ##*
    ******    
    """
    print('Half and half square of size', size)
    for i in range(size):
        star()
    newline()
    for i in range(size - 2):
        star()
        for j in range(size - 2):
            space()
        star()
        newline()
    for i in range(size):
        star()
    newline()
  

Ответ №1:

Добавьте явную проверку:

 def star(): print('*', end = '')
def newline(): print()
def space(): print(' ', end = '')
def sharp(): print('#', end = '')

def halfAndHalf(size):
    print('Half and half square of size', size)
    for i in range(size):
        star()

    newline()
    sz = size - 2;

    for i in range(sz):
        star()
        for j in range(sz):
            space() if (j < sz / 2) else sharp(); # <- check here

        star()
        newline()

    for i in range(size):
        star()

    newline()

def main():
  halfAndHalf(20);

if (__name__ == '__main__'):
  main();
  

Вывод:

 Half and half square of size 20
********************
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
*         #########*
********************
  

Если вы не знакомы с space() if (j < sz / 2) else sharp() троичным оператором, вы можете использовать простой if или обратиться к документации по Python

Ответ №2:

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

 def halfAndHalf(size):
    print('Half and half square of size', size)
    for i in range(size):
        print('*', end='')
    print('n', end='')
    for i in range(size - 2):
        padding_size = size // 2 - 1
        print('*', end='')
        for j in range(padding_size):
            print(' ', end='')
        for j in range(size - 2 - padding_size):
            print('#', end='')
        print('*', end='')
        print('n', end='')
    for i in range(size):
        print('*', end='')
    print('n', end='')
  

Обратите внимание, что вместо цикла для многократной печати символа вы можете использовать оператор repeat для строк, поэтому приведенный ниже код будет достаточным и более читаемым:

 def halfAndHalf(size):
    print('Half and half square of size', size)
    print('*' * size)
    padding_size = size // 2 - 1
    for i in range(size - 2):
        print('*'   ' ' * padding_size   '#' * (size - 2 - padding_size)   '*')
    print('*' * size)