编写一个 returns boolean true if matrix forms a magic square without importing numpy 的函数
Writing a function that returns boolean true if matrix forms a magic square without importing numpy
我已经写了一部分程序如下:
def matrix_is_square(matrix):
for i in range(len(matrix)):
if len(matrix[i]) != len(matrix):
return False
return True
这个函数returns 如果矩阵是方阵则为真,否则returns 为假。
然而,这就是问题的开始。
我必须编写第二个函数来确定该函数是否为幻方。
如果满足以下条件,则方阵形成幻方:
- 矩阵的元素是数字1,2,3,...,n2
- 每行、每列、两条对角线的元素之和为相同值
代码开头为:
def magic(matrix):
if(not(is_square(matrix))):
return False
# The remaining code
这就是我的尝试。
square = []
for i in range(len(matrix)):
square.append([])
for j in range(len(matrix)):
square[i].append(0)
total = 0
x = len(matrix)
for i in range(x):
total += square[i][i]
if total != x*(x*x+1)/2:
return False
else:
return True
total = 0;
for i in range(x):
total += square[i][x-1-i]
if total != x*(x*x+1)/2:
return False
else:
return True
我的代码中似乎有几个错误。一个重要的是我正在测试数字是否完全相等,这是错误的,因为数字不能完全表示为浮点数,但我找不到另一种方法来做到这一点。任何提示将不胜感激。
以下是此功能的预期结果,只是在同一页上。
正确
[[2,7, 6],[9,5,1],[4,3,8]]
[[16,3,2,13], [5,10,11,8],[9,6,7,12], [4,15,14,1]]
假
[[1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16]]
[[1,1],[1,1]]
[[1,1],[1,1],[1,2]]
没有导入 numpy。
使用 sum
、range
、any
函数和 set
对象的复杂解决方案:
def magic(m):
length = len(m)
first_sum = set()
if length <= 2 \
or any(len(row) != length for row in m) \
or any(i > (length * length) for row in m for i in row):
return False
for r in m:
s = sum(r)
if len(first_sum) == 0:
first_sum.add(sum(r))
if s not in first_sum:
return False
for i in range(length):
s = sum([r[i] for r in m])
if s not in first_sum:
return False
if sum(m[i][i] for i in range(length)) not in first_sum \
or sum(m[i][i] for i in range(length - 1, -1, -1)) not in first_sum:
return False
return True
m = [[2,7,6],[9,5,1],[4,3,8]]
print(magic(m))
m = [[16,3,2,13], [5,10,11,8],[9,6,7,12], [4,15,14,1]]
print(magic(m))
m = [[1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16]]
print(magic(m))
m = [[1,1],[1,1]]
print(magic(m))
m = [[1,1],[1,1],[1,2]]
print(magic(m))
输出(顺序):
True
True
False
False
False
我已经写了一部分程序如下:
def matrix_is_square(matrix):
for i in range(len(matrix)):
if len(matrix[i]) != len(matrix):
return False
return True
这个函数returns 如果矩阵是方阵则为真,否则returns 为假。
然而,这就是问题的开始。
我必须编写第二个函数来确定该函数是否为幻方。
如果满足以下条件,则方阵形成幻方:
- 矩阵的元素是数字1,2,3,...,n2
- 每行、每列、两条对角线的元素之和为相同值
代码开头为:
def magic(matrix):
if(not(is_square(matrix))):
return False
# The remaining code
这就是我的尝试。
square = []
for i in range(len(matrix)):
square.append([])
for j in range(len(matrix)):
square[i].append(0)
total = 0
x = len(matrix)
for i in range(x):
total += square[i][i]
if total != x*(x*x+1)/2:
return False
else:
return True
total = 0;
for i in range(x):
total += square[i][x-1-i]
if total != x*(x*x+1)/2:
return False
else:
return True
我的代码中似乎有几个错误。一个重要的是我正在测试数字是否完全相等,这是错误的,因为数字不能完全表示为浮点数,但我找不到另一种方法来做到这一点。任何提示将不胜感激。
以下是此功能的预期结果,只是在同一页上。
正确
[[2,7, 6],[9,5,1],[4,3,8]]
[[16,3,2,13], [5,10,11,8],[9,6,7,12], [4,15,14,1]]
假
[[1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16]]
[[1,1],[1,1]]
[[1,1],[1,1],[1,2]]
没有导入 numpy。
使用 sum
、range
、any
函数和 set
对象的复杂解决方案:
def magic(m):
length = len(m)
first_sum = set()
if length <= 2 \
or any(len(row) != length for row in m) \
or any(i > (length * length) for row in m for i in row):
return False
for r in m:
s = sum(r)
if len(first_sum) == 0:
first_sum.add(sum(r))
if s not in first_sum:
return False
for i in range(length):
s = sum([r[i] for r in m])
if s not in first_sum:
return False
if sum(m[i][i] for i in range(length)) not in first_sum \
or sum(m[i][i] for i in range(length - 1, -1, -1)) not in first_sum:
return False
return True
m = [[2,7,6],[9,5,1],[4,3,8]]
print(magic(m))
m = [[16,3,2,13], [5,10,11,8],[9,6,7,12], [4,15,14,1]]
print(magic(m))
m = [[1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16]]
print(magic(m))
m = [[1,1],[1,1]]
print(magic(m))
m = [[1,1],[1,1],[1,2]]
print(magic(m))
输出(顺序):
True
True
False
False
False