Помогите с решением задачи (нужно точки заменить на звездочки)

Сама задача: введите сюда описание изображения

Код этой задачи:

введите сюда описание изображения

Проблема в том, что я на 30 строке , где j == 3 (тройку я поставил от руки(подогнал под решение)) чтобы печатались центральные вертикальная и горизонтальная строки из звездочек. Прошу Вас помочь, подсказать, объяснить что нужно поставить в последнем блоке кода чтобы печатались центральные вертикальная и горизонтальные строки из звездочек(*) вместо точек(.)


Ответы (1 шт):

Автор решения: GrAnd

На скиншоте многабуков, ниасилил.
Но, видимо, решение выглядит как-то так:

n = int(input())
matrix = [['.']*n for _ in range(n)]
for i in range(n):
    matrix[i][i] = matrix[i][n-i-1] = matrix[i][n//2] = '*'
matrix[n//2] = ['*']*n
print(*map(' '.join, matrix), sep='\n')

Подробности

Конструкция вида ['.']*n создаёт список длиной n состоящий из элементов '.'. (Т.е., к примеру, запись [7]*4 породит список [7,7,7,7]) Таким образом генерируется ряд матрицы.

Чтобы заполнить матрицу такими рядами, всё действо просто повторяется в цикле [... for _ in range(n)]. Данная запись эквивалентна обычному циклу с вызовом append(...):

for _ in range(n):
    matrix.append(['.']*n)

Дальше заполняем матрицу звёздочками:

for i in range(n):
    matrix[i][i]     = '*'  # главная диагональ
    matrix[i][n-i-1] = '*'  # побочная диагональ
    matrix[i][n//2]  = '*'  # средний столбец

Если идет присваивание одного и того же значения нескольким переменным, то можно не городить кучу однотипных строк, а просто записать в виде однострочной конструкции как, например, a = b = c = d = 5 (т.е. всем перечисленным переменным будет присвоено значение 5).

Ну и в конце просто присваиваем средней строке матрицы список из одних звёздочек matrix[n//2] = ['*']*n.

Вывод на экран

Тут немного tricky...

Символ * говорит Питону, что элементы списка надо раскидать по аргументам. Т.е., к примеру, строка print(*[1,2,3]) сделает поэлементную постановку списка в аргументы, и, по сути, она как бы превратится в print(1,2,3).

Разделитель по умолчанию является пробел, но аргументом sep='\n' меняется на перевод строки. Таким образом, если просто позвать print(*matrix, sep='\n'), каждая строка матрицы пойдёт как отдельный аргумент в команду print(), и будет напечатана этой командой с новой строки (так как аргументы печатаются через разделитель, а он был заменён на перевод строки \n).

Но строки матрицы всё ещё списки, и будут напечатаны как списки, если ничего не предпринимать. Поэтому просто клеим списки через пробел (при помощи функции join()). Для этого задействуем функцию map() которая идёт по списку и для каждого элемента вызывает функцию, которую указали первым аргументом. Т.е., например, list(map(str, [1,2,3])) преобразует каждое число в строку и вернёт список ['1', '2', '3'].

Сам join() работает очень просто - он собирает (клеит) элементы списка в строку используя строку, от которой его вызвали, как разделитель. Например, '<>'.join([1,2,3]) вернёт строку '1<>2<>3'. В нашем случае в качестве разделителя используется строка содержащая пробел.

Короче, print(*map(' '.join, matrix), sep='\n') преобразует каждый ряд матрицы из списка в строку через пробел при помощи map() через ' '.join(); из-за того, что указана * - распихивает эти ряды по отдельным аргументам команды print(), которая выводит ряды построчно, потому как указан разделитель \n.

→ Ссылка