我希望我的代码显示所有行,列和对角线等于15。数字1-9在3 x 3网格中只能显示一次。
我的代码不断告诉我未定义false,因此当我使用大写字母F将false更改为“ False”时,我的所有代码都显示为无效而不是有效。输入文件的前三行应该显示为有效,所以我有点困惑。
输入文件:
4 3 8 9 5 1 2 7 6
8 3 4 1 5 9 6 7 2
6 1 8 7 5 3 2 9 4
6 9 8 7 5 3 2 1 4
6 1 8 7 5 3 2 1 4
6 1 3 2 9 4 8 7 5
5 5 5 5 5 5 5 5 5
我的代码:
def contains(grid, i):
#Returns true if i appears in the grid & returns false otherwise
for row in grid:
for value in row:
if value == i:
return true
return False
def isValidMagicSquare(grid):
#make sure each # appears exactly once in grid
for i in range(1, 10):
if not contains(grid, i):
return False
#make sure rows add to 15
for row in grid:
r1 = sum(grid[0])
r2 = sum(grid[1])
r3 = sum(grid[2])
if r1 == 15 and r2 == 15 and r3 == 15:
return true
else:
return false
#Make sure columns equal 15
for column in grid:
c1 = grid[0][0]+ grid[1][0]+ grid[2][0]
c2 = grid[0][1]+ grid[1][1]+ grid[2][1]
c3 = grid[0][2]+ grid[1][2]+ grid[2][2]
if c1 == 15 and c2 == 15 and c3 == 15:
return true
else:
return false
#Make sure diagonals equal 15
for diagonal in grid:
dL = full[0][0]+ full[1][1]+ full[2][2]
dR = full[0][2]+ full[1][1]+ full[2][0]
if dL == 15 and dR == 15:
return true
else:
return false
def main():
lst = []
f = open('input.txt')
for line in f:
grid = [0, 0, 0]
grid[0] = lst[0:3]
grid[1] = lst[3:6]
grid[2] = lst[6:9]
if isValidMagicSquare(grid):
print("Valid")
else:
print("Invalid")
main()
应该显示:
valid
valid
valid
invalid
invalid
invalid
invalid
答案 0 :(得分:0)
def main():
lst = []
f = open('input.txt')
for line in f:
grid = [0, 0, 0]
grid[0] = lst[0:3]
grid[1] = lst[3:6]
grid[2] = lst[6:9]
在此代码中,lst
始终是一个空列表。因此,lst[0:3]
,lst[3:6]
和lst[6:9]
也将是空列表。也许您的意思是line[0:3]
?
但是,即使假设这就是您的意思,您仍然需要将每条输入行转换为整数列表。试试这个:
for line in f:
numbers = [int(n) for n in line.split()]
grid = [0, 0, 0]
grid[0] = numbers[0:3]
...
答案 1 :(得分:0)
有一些问题需要解决...
1)在这里,您将比较一个以字符串形式保存的数字(在网格中)和一个以整数形式保存的数字(传递给i)-因此此函数将始终返回False。
def contains(grid, i):
#Returns true if i appears in the grid & returns false otherwise
for row in grid:
for value in row:
if value == i:
return true
return False
将整数转换为要比较的字符串将起作用:
def contains(grid, i):
#Returns true if i appears in the grid & returns false otherwise
for row in grid:
for value in row:
if value == str(i):
return true
return False
2)然后,您将遇到此代码引发错误的问题,因为您试图对字符串(例如'123')而不是对字符串使用sum函数。数字列表(例如[1,2,3])在这里:
r1 = sum(grid[0])
r2 = sum(grid[1])
r3 = sum(grid[2])
您可以使用快速的自定义求和函数来解决这个问题:
def string_sum(s):
return int(s[0]) + int(s[1]) + int(s[2])
...然后将其放入...
r1 = string_sum(grid[0])
r2 = string_sum(grid[1])
r3 = string_sum(grid[2])
在这一点上,它似乎可以工作,并且(有趣地)给出您想要的答案,但是仍然存在两个问题,一个主要问题,一个次要问题:
3)isValidMagicSquare函数的逻辑已被破坏:从函数返回值将在该点结束函数的操作。因此,随着逻辑始终的行检查部分返回true或false,您将永远不会检查列或对角线-永远不会使用此代码。为此,我认为您需要重新考虑其逻辑和结构,这可能超出了此问题/答案的范围。
4)您在这里有未声明的变量:
dL = full[0][0]+ full[1][1]+ full[2][2]
dR = full[0][2]+ full[1][1]+ full[2][0]
我假设full
应该是grid
。但是代码将运行,因为(如前所述)此部分从未达到。