Aidez-moi à imprimer le modèle ci-dessous tel quel, si l'entrée saisie est 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

J'ai compris pour trouver l'élément central du motif avec n'importe quelle entrée:

rows=int(input("Enter the number of rows:"))
l=[]
for x in range(1,rows+1):
    if x%2!=0:
        l.append(x)
mid_value=len(l)

S'il vous plaît, aidez-moi à compléter le modèle ci-dessus ... Merci d'avance!

2
user13747387 18 juin 2020 à 12:09

4 réponses

Meilleure réponse

Si vous utilisez une liste de listes pour stocker les valeurs, la valeur de n'importe quelle cellule spécifique peut être déterminée en effectuant des calculs de base impliquant les index de cellule et le nombre de lignes.

Une illustration:

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)

Production:

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
FMc 18 juin 2020 à 10:13

Implémentation simple sans utiliser aucune liste

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
komatiraju032 18 juin 2020 à 10:30

Ce n'est peut-être pas la solution la plus élégante, mais quelque chose comme ça devrait fonctionner:

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))
0
TKJensen 18 juin 2020 à 09:52

Cela ressemble à une question de devoir, je vais donc essayer d'expliquer comment l'aborder plutôt que de simplement fournir du code.

Quelques points à noter pour commencer:
- Le motif est symétrique dans les deux sens, nous pouvons donc économiser un peu d'effort et de logique en résolvant uniquement le quart supérieur gauche et en le copiant dans le reste.
- Chaque ligne est similaire à la précédente, avec une ajoutée au point où les indices de ligne et de colonne ( i et j ) sont égaux - plutôt que de recalculer chaque ligne à partir de scratch, on peut prendre celui d'avant comme base.

Donc, pour la première ligne, faites une liste de 1s la longueur de votre entrée (7, dans ce cas).
Copiez ceci pour la septième ligne (note: row6 = row0 ne créera pas de copie; vous aurez besoin de row6 = list (row0))
Pour les deuxième et sixième lignes, prenez une copie de la première ligne. Si i est égal ou supérieur à j et se trouve dans la première moitié de la ligne, ajoutez-y 1. Vous devrez copier cela à l'envers pour la moitié arrière de la rangée. (Alternative - définissez la valeur sur j +1 plutôt que d'ajouter simplement 1)

Répétez jusqu'à la quatrième rangée et vous devriez avoir terminé.

EDIT: code inclus, car c'était un problème intéressant

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)
1
LogicianWithAHat 18 juin 2020 à 12:35