Growing Normal Magic Squares - NumPy + PyGame
Выращивание магических квадратов с помощью Python + [NumPy + PyGame + SortedContainers].
Использование:
В программе уже есть готовые пресеты для магических квадратов 3х3, 4х4, 5х5 и 7х7. Если вас интересует, как создать свой пресет, следуйте следующим простым шагам:
-
Убедитесь, что магический квадрат - нормальный и ассоциативный (числа идут по-порядку, с шагом возрастания 1, начиная с 1, и суммы чисел, равноудаленных от центра и находящихся на одной прямой с центром - равны).
-
Нарисуйте пустой квадрат со стороной n
-
Напишите над верхней стороной квадрата цифры от 0 до n-1, по одной цифре над каждым столбцом, слева-направо. Это - X координата
-
Напишите с левой стороны квадрата цифры от 0 до n-1, по одной цифре перед каждой строкой, сверху-вниз. Это - Y координата.
-
Начните переписывать числа из имеющегося ассоциативного магического квадрата в следующем порядке:
5.1) Начните с цифры 1. Найдите ее в магическом квадрате.
5.2) Если она находится не на координатах [0, 0], запишите ее координаты рядом с магическим квадратом и перепишите цифру 1 в пустой квадрат на ту же позицию.
5.3) Найдите в магическом квадрате число, которое должно было находиться там, где вы нашли 1. Это число рассчитывается по формуле (X + 1) + (Y * X).
5.4) Запишите координаты этого следующего числа после координат цифры 1.
5.5) Продолжайте шаги 5.2 - 5.4 до тех пор, пока цикл не будет замкнут, т.е., до тех пор, пока следующим магическим числом не окажется 1.
5.6) Выберите другую цифру из магического квадрата, которой соответствует пустая клетка в частично заполненном квадрате, и повторите шаги 5.2 - 5.5, записывая координаты чисел в новой строке.
5.7) Если число, которое вы выбрали, стоит "на своем месте" (i == (X + 1) + (Y * X)), не переписывайте его координаты.
-
Вы получили один или несколько цепочек координат. Теперь перепишите их в файл программы, под другими пресетами, в обратном порядке в следующем виде:
[[<---------Первая цепочка координат----------], [<----------Вторая цепочка координат----------], [<---------Третья цепочка координат---------], ...]
---V (замените n на число, равное длине стороны квадрата)
m_n = [[[Xn-1, Yn-1], ... , [X2, Y2], [X1, Y1], [X0, Y0]], [[Xn-1, Yn-1], ... , [X2, Y2], [X1, Y1], [X0, Y0]], [[Xn-1, Yn-1], ... ,[X2, Y2], [X1, Y1], [X0, Y0]], ...]
Для проверки правильности записи нового пресета, вы можете использовать готовые пресеты.
- Готовую последовательность можно использовать, изменив строки: pow = 6 (нужная степень основания >= 1) root = n (заменить n на число, равное длине стороны квадрата) m1 = pow_square(root, pow, m_n) (заменить n на число, равное длине стороны квадрата)
Если все сделано правильно, вы получите изображение, обладающее поворотной симметрией (может зависеть от свойств монитора - особенно для больших магических квадратов). Когда вы закроете окно с рисунком, программа выведет суммы для строк, столбцов и диагоналей, чтобы вы могли проверить, является ли квадрат магическим. Также, вы можете попробовать использовать инструкцию to_csv(m1, path), чтобы сохранить магический квадрат для дальнейшей работы с ним в MS Excel, или другом редакторе таблиц.
Остальные функции программы используются, в основном, только для тестирования.
Программа обозначает точками на рисунке числа, оставшиеся на исходных координатах.