Печать выкройки без импорта модулей - PullRequest
2 голосов
/ 18 июня 2020

Пожалуйста, помогите мне распечатать шаблон ниже как есть, если введено 7:

1 1 1 1 1 1 1
1 2 2 2 2 2 1
1 2 3 3 3 2 1
1 2 3 4 3 2 1
1 2 3 3 3 2 1
1 2 2 2 2 2 1
1 1 1 1 1 1 1

Я вычислил, как найти средний элемент шаблона с любым вводом: *

Пожалуйста, помогите мне завершить вышеприведенный образец ...... Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 18 июня 2020

Если вы используете список списков для хранения значений, значение для любой указанной c ячейки можно определить, выполнив некоторые основные c математические вычисления, включая индексы ячеек и количество строк.

Иллюстрация:

def cell_value(i, j, n_rows):
    # The value of any cell is the minimum distance
    # from its own coordinates (i, j) to the "outside" (ie,
    # an i or j less than 0 or equal to n_rows). Imagine an
    # ant in the grid. How many steps would it have to take
    # to escape the grid, using the shortest route?
    return min(
        abs(i - -1),
        abs(i - n_rows),
        abs(j - -1),
        abs(j - n_rows),
    )

N_ROWS = 7

rows = [
    [
        cell_value(i, j, N_ROWS)
        for j in range(N_ROWS)
    ]
    for i in range(N_ROWS)
]

for r in rows:
    print(*r)

Вывод:

1 1 1 1 1 1 1
1 2 2 2 2 2 1
1 2 3 3 3 2 1
1 2 3 4 3 2 1
1 2 3 3 3 2 1
1 2 2 2 2 2 1
1 1 1 1 1 1 1
1 голос
/ 18 июня 2020

Это похоже на вопрос домашнего задания, поэтому я попытаюсь объяснить, как подойти к нему, а не просто предоставить код.

Несколько вещей, на которые стоит обратить внимание для начала:
- Симметричность шаблона в обоих направлениях, поэтому мы можем сэкономить некоторые усилия и c, решив только верхнюю левую четверть и скопировав ее в остальные.
- Каждая строка похожа на предыдущую, с добавлением одной в точке где индексы строки и столбца ( i и j ) равны - вместо того, чтобы пересчитывать каждую строку с нуля, мы можем взять предыдущую за основу.

Итак, для первой строки составьте список из единиц длины вашего ввода (в данном случае 7).
Скопируйте это для седьмой строки (примечание: row6 = row0 не будет создавать копию; вы need row6 = list (row0))
Для второй и шестой строк возьмите копию первой строки. Если i больше или равно j и находится в первой половине строки, добавьте к нему 1. Вам нужно будет скопировать это в обратном порядке для задней половины ряда. (Альтернатива - установите значение j + 1, а не просто добавляйте 1)

Повторяйте до четвертой строки, и все готово.

EDIT: код включен , потому что это была интересная задача

numberOfRows = int(input("Enter the number of rows:"))
listOut = [[1]*numberOfRows] * numberOfRows #grid of 1s of appropriate size
for j in range(int((numberOfRows+1)/2)): #symmetrical, so only look to the middle
    if j > 0:
        listOut[j] = list(listOut[j-1]) #copy previous row
    for i in range(int((numberOfRows+1)/2)):   
        if i>=j:
            listOut[j][i] = j+1
            listOut[j][numberOfRows-(i+1)] = j+1
    #copy current row to appropriate distance from the end
    listOut[numberOfRows-(j+1)] = list(listOut[j])
for row in listOut:
    # * for sequence unpacking, printing lists as strings w/o commas
    print(*row)
0 голосов
/ 18 июня 2020

Простая реализация без использования списка

n = int(input())
x = n
for i in range((n // 2 + 1) if n % 2 and n > 1 else n //2):
    for l in range(1, i + 1):
        print(l, end=' ')

    print((str(i + 1) + ' ') * x, end='') 

    for r in range(i, 0, -1):
        print(r, end=' ')
    print()
    x -= 2

y = 1
for j in range(n // 2, 0, -1):
    for l in range(1, j):
        print(l, end=' ')

    print((str(j) + ' ') * (2 * y + 1 if n % 2 else 2 * y), end='') 

    for r in range(j-1, 0, -1):
        print(r, end=' ')
    print()
    y += 1
0 голосов
/ 18 июня 2020

Возможно, это не самое элегантное решение, но должно работать что-то вроде этого:

n = int(input('Enter the number of rows:'))

table = [[1 for _ in range(n)] for _ in range(n)]
start = 0
end = n

while start < end:
    start += 1
    end -= 1

    for i in range(start, end):
        for j in range(start, end):
            table[i][j] += 1

for row in table:
    print(' '.join(str(ele) for ele in row))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...