Помогите решить задачу на языка python

Напиши код на языке python. Размерности двумерных массивов следует запрашивать у пользователя. Все необходимые данные должны передаваться в функции в качестве параметров. Все переменные, используемые только внутри функции, должны быть описаны как локальные. Использование глобальных переменных в функциях не допускается. Обеспечить вывод, как исходного массива, так и массива, полученного в результате работы программы, там, где это возможно по условию задачи. Пункты задания оформить в виде функций Осуществить циклический сдвиг элементов матрицы размером m * n (m строк x n столбцов). Сдвиг выполнить вправо на k элементов таким образом: элементы первой строки сдвигаются в последний столбец сверху вниз, из него - в последнюю строку справа налево, из нее - в первый столбец снизу вверх, из него - в первую строку; для остальных элементов - аналогично.Осуществить циклический сдвиг элементов матрицы размером m * n (m строк x n столбцов). Сдвиг выполнить вправо на k элементов таким образом: элементы первой строки сдвигаются в последний столбец сверху вниз, из него - в последнюю строку справа налево, из нее - в первый столбец снизу вверх, из него - в первую строку; для остальных элементов - аналогично. матрица наполняется рандомными числами. Пример сдвига матрицы на фото: введите сюда описание изображения

Сам не понимаю как сделать, chat gpt решает не правильно, решил сюда обратится

Вот мой код, он работает, но нужно по максимуму использовать библиотеку numpy, чего я не умею, эта библиотека должна использоваться в функции rotate_spiral

import random

N = 6

def print_matrix(matrix):
    for row in matrix:
        for elem in row:
            print(f"{elem:6}", end="")
        print()

def rotate_spiral(matrix, step):
    layers = N // 2
    for k in range(layers):
        edge = N - 1 - k
        cur = []

        # Extract the layer
        cur.extend(matrix[k][k:edge])
        cur.extend([matrix[i][edge] for i in range(k, edge)])
        cur.extend(matrix[edge][edge:k:-1])
        cur.extend([matrix[i][k] for i in range(edge, k, -1)])

        # Rotate the layer
        shifted = cur[-step % len(cur):] + cur[:-step % len(cur)]

        # Place the rotated layer back
        idx = 0
        for j in range(k, edge):
            matrix[k][j] = shifted[idx]
            idx += 1
        for i in range(k, edge):
            matrix[i][edge] = shifted[idx]
            idx += 1
        for j in range(edge, k, -1):
            matrix[edge][j] = shifted[idx]
            idx += 1
        for i in range(edge, k, -1):
            matrix[i][k] = shifted[idx]
            idx += 1

    return matrix

if __name__ == "__main__":
    spiral = [[random.randint(1, 20) for _ in range(N)] for _ in 
 range(N)]

    print("Original array:")
    print_matrix(spiral)

    step = int(input("\nHow many steps to turn? Step = "))

    result = rotate_spiral(spiral, step)

    print("\nResult:")
    print_matrix(result)

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

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

Подробно расписывать решение не буду, но основную идею - покажу. Итак, вам надо использовать numpy - чудесно, работа упрощается раза в четыре. Запросы пользователя, оформление функции и передачу ей параметров, работа с локальными и глобальными переменными - все это оставляю вам на "домашнюю проработку" материала. А вот вам сам код, он очень прост:

n=7
m=9
L=3
arr=np.arange(n*m).reshape((n,m))
print(arr)

i=0
j=0
while ((m-i)>=2 and (n-j)>=2):
    a=np.concatenate((arr[j,i:m-1],arr[j:n-1,m-1],arr[n-1,m-1:j:-1],arr[n-1:j:-1,i]))  
    a=np.roll(a, L)
    arr[j,i:m-1]=a[0:m-i-1]
    arr[j:n-1,m-1]=a[m-i-1:m-i-1+n-j-1]
    arr[n-1,m-1:j:-1]=a[m+n-i-j-2:2*(m-i-1)+n-j-1]
    arr[n-1:j:-1,i]=a[2*(m-i-1)+n-j-1:]
    m=m-1
    i=i+1
    n=n-1
    j=j+1   
print(arr)

Имеем до выполнения "функции":

[ 0  1  2  3  4  5  6  7  8]
 [ 9 10 11 12 13 14 15 16 17]
 [18 19 20 21 22 23 24 25 26]
 [27 28 29 30 31 32 33 34 35]
 [36 37 38 39 40 41 42 43 44]
 [45 46 47 48 49 50 51 52 53]
 [54 55 56 57 58 59 60 61 62]]

После выполнения функции:

[[27 18  9  0  1  2  3  4  5]
 [36 37 28 19 10 11 12 13  6]
 [45 46 39 38 29 20 21 14  7]
 [54 47 40 30 31 32 22 15  8]
 [55 48 41 42 33 24 23 16 17]
 [56 49 50 51 52 43 34 25 26]
 [57 58 59 60 61 62 53 44 35]]

В этом примере, все "сферы" матрицы циклически сдвигаются по своим "орбитам". Естественно, если количество строк и/или столбцов нечетно - в середине матрицы остается "островок", который сдвинуть соответственно условию невозможно ( в данном примере - это последовательность "30 31 32".

Будут вопросы - пишите. И совет на бедующее, хорошо запомните - ChatGPT для обучения программированию - это зло! Не хотите сами думать - лучше не мучить себя, не насиловать ChatGPT, не обманывать учителя и не заниматься программированием вообще. Все равно ни результата, ни пользы в обучении не будет. Только время зря потратите.

→ Ссылка