Skip to content

Instantly share code, notes, and snippets.

@dsibi
Created June 11, 2021 10:59
Show Gist options
  • Save dsibi/76b9da6c33abb7dca91a7a592a8e494a to your computer and use it in GitHub Desktop.
Save dsibi/76b9da6c33abb7dca91a7a592a8e494a to your computer and use it in GitHub Desktop.
Реализовать скрипт, генерирующий магический квадрат. Входным значением скрипта должен быть размер квадратной матрицы. Скрипт должен возвращать квадратную матрицу, суммы чисел во всех вертикалях, горизонталях и диагоналях которой равны.
//Магический квадрат для нечетных чисел с проверкой
//создаем функцию для магического квадрата, аргументом который будет размер матрицы
function magicSquare(n) {
//создадим пустой массив данных, в который будем записывать числа и сохраним его в переменной `matrix`
let matrix = [];
//создадим переменную для позиции по горизонтали - `x`
let x = 0;
//создадим переменную для позиции по вертикали - `y`
let y = (n - 1) / 2;
//цикл для итерирования по строкам (для создания пустых массивов равных размеру квадрата)
for (let i = 0; i < n; i++) {
matrix[i] = [];
//цикл для итерирования по столбцам (для создания ячеек с нулевыми значениями в ранее созданном массивах)
for (let j = 0; j < n; j++) {
matrix[i][j] = 0;
}
}
//заполнение массивов числами - кол-во итераций равно квадрату размера матрицы
for (let i = 0; i < n * n; i++) {
pos(i + 1);
}
//функция с правилами заполнения, которой передается аргумент `value` равный квадрату размера матрицы
function pos(value) {
//заполнение ячейки соответствующей рассчитанным значениям `x` и `y`
matrix[x][y] = value;
//создание переменных для сохранения текущих значений `x` и `y` или текущих положений числа
let tx = x;
let ty = y;
//уменьшаем значение `x` на 1
x--;
//если значение `x` меньше нуля, то прибавляем к переменной `x` число равное размеру матрицы
if (x < 0) {
x += n;
}
//все тоже самое проделываем с переменной `y`
y--;
if (y < 0) {
y += n;
}
//если число в ячейке не равно 0
if (matrix[x][y] !== 0) {
//то к переменной `tx` прибавляется 1 и сохраняется в переменной `x`
x = tx + 1;
//если переменная `x` равна размеру матрицы
if (x === n) {
//то x приравнивается к 0
x = 0;
}
//`y` приравнивается к значению `ty`, т.е. "адресу" последнего числа
y = ty;
}
}
//по прохождению цикла заполнения чисел производится возврат заполненной "матрицы"
return matrix;
}
//проверка является ли квадрат магическим
function isMagicSquare(mat) {
let N = mat.length;
//`sumd1` и `sumd2` - сумма числе по диагоналям
let sumd1 = 0,
sumd2 = 0;
for (let i = 0; i < N; i++) {
// (i, i) - диагональ с верхнего левого угла до нижнего правого
// (i, N - i - 1) - диагональ с верхнего правого до нижнего левого угла
sumd1 = sumd1 + mat[i][i];
sumd2 = sumd2 + mat[i][N - 1 - i];
}
// если две диагональные суммы не равны, то это не магический квадрат
if (sumd1 != sumd2) return false;
//аналогичная проверка для строк и столбцов
for (let i = 0; i < N; i++) {
let colSum = 0;
let rowSum = 0;
for (let j = 0; j < N; j++) {
rowSum += mat[i][j];
colSum += mat[j][i];
}
if (rowSum != colSum || colSum != sumd1) return false;
}
return true;
}
let oddNumber = 3;
console.log(magicSquare(oddNumber));
console.log(isMagicSquare(magicSquare(oddNumber)));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment