Python 调试中的幻方
Magic Square in Python Debugging
问题原来出在thislink。我写了一个 Python 代码,但我得到了 64 分(总分是 100),这表明我的代码有一些缺失点。我通过了 16 个测试用例中的 11 个,但有 5 个测试用例对我来说有问题。你能说我的代码哪里有遗漏的地方吗?我该如何解决?
import math
m = int(raw_input())
liste = []
y_liste = []
md = 0
ad = 0
sum = 0
sum2 = 0
for k in range(m):
temp = str(raw_input())
liste.append(temp)
liste[k] = liste[k].split(" ")
liste[k] = [int(i) for i in liste[k]]
for k in range(m):
md += liste[k][k]
ad += liste[k][m-k-1]
if md == ad:
print 0
else:
for k in range(m):
for l in range(m):
sum2 += liste[l][k]
sum += liste[k][l]
if sum2 != md and -(k+1) is not y_liste:
y_liste.append(-(k+1))
if sum != md and (k+1) is not y_liste:
y_liste.append(k+1)
sum2 = 0
sum = 0
if md != ad:
y_liste.append(0)
print len(y_liste)
y_liste.sort()
for i in y_liste:
print i
问题陈述
幻方
Johnny 设计了一个魔方(所有行、列和对角线的总和相同的数字平方,即主对角线 - 即从左上角到右下角的对角线 - 和antidiagonal - 意思是从右上角到左下角的对角线)。写个程序测试一下。
任务
编写一个程序来检查给定的正方形是否神奇(即所有行、列和对角线的总和都相同)。
输入
第一行:N,正方形的大小 (1 <= N <= 600)。
接下来 N 行:正方形,前行 N space 个分隔整数,代表正方形每一行的条目。
输出
第一行: M ,总和不等于主对角线总和的行数(即包含正方形第一个元素的行)。如果 Square 是魔法,程序应该输出 0。
接下来的 M 行:一个排序的(递增顺序)行列表,这些行的总和不等于主对角线的总和。行编号为 1,2,...,N;列编号为 -1、-2、...、-N;并且反对角线编号为零。
注意:输出的最后一行末尾有一个换行符。
示例输入 1
3
8 1 6
3 5 7
4 9 2
示例输出 1
0
示例输入 2
4
16 3 2 13
5 10 11 8
6 9 7 12
4 15 14 1
示例输出 2
3
-2
-1
0
示例输出 2 的解释
输入方块如下所示:http://i.stack.imgur.com/JyMgc.png
(抱歉 link 但由于声誉原因我无法添加图片)
正方形有 4 行(橙色标记为 1 到 4)和 4 列(绿色标记为 -1 到 -4),如上图所示。正方形的主对角线和反对角线分别以红色和蓝色突出显示。
主对角线的总和 = 16 + 10 + 7 +1 = 34。
反对角线的总和 = 13 + 11 + 9 + 4 = 37。这与主对角线的总和不同,因此应报告反对角线对应的值 0。
第 1 行的总和 = 16 + 3 + 2 + 13 = 34.
第 2 行的总和 = 5 + 10 + 11 + 8 = 34.
第 3 行的总和 = 6 + 9 + 7 + 12 = 34.
第 4 行的总和 = 4 + 15 + 14 + 1 = 34.
-1 列的总和 = 16 + 5 + 6 + 4 = 31。这与主对角线的总和不同,因此应报告值 -1。
-2 列的总和 = 3 + 10 + 9 + 15 = 37。这与主对角线的总和不同,因此应报告值 -2。
第 -3 列的总和 = 2 + 11 + 7 + 14 = 34.
第 -4 列的总和 = 13 + 8 + 12 + 1 = 34.
根据以上,有3条线的总和不等于主对角线的元素之和。由于它们应按递增顺序排序,因此输出应为:
3
-2
-1
0
你的解释没有讨论这个可能导致错误的子句:
if md == ad:
print 0
else:
它说如果主对角线和反对角线相加等于相同的值,则只打印 0(无坏线),表示幻方有效(不同于在坏线列表中报告 0)。考虑这个有效的幻方:
9 6 3 16
4 15 10 5
14 1 8 11
7 12 13 2
如果我交换 13 和 11,对角线仍然相等,但正方形无效。所以上面的代码似乎不正确。在上述 if
语句的 else
子句中,您测试:
if md != ad:
y_liste.append(0)
您已经从 previous/outer 测试中知道一个事实,因此您的代码似乎与自身不一致。
问题原来出在thislink。我写了一个 Python 代码,但我得到了 64 分(总分是 100),这表明我的代码有一些缺失点。我通过了 16 个测试用例中的 11 个,但有 5 个测试用例对我来说有问题。你能说我的代码哪里有遗漏的地方吗?我该如何解决?
import math
m = int(raw_input())
liste = []
y_liste = []
md = 0
ad = 0
sum = 0
sum2 = 0
for k in range(m):
temp = str(raw_input())
liste.append(temp)
liste[k] = liste[k].split(" ")
liste[k] = [int(i) for i in liste[k]]
for k in range(m):
md += liste[k][k]
ad += liste[k][m-k-1]
if md == ad:
print 0
else:
for k in range(m):
for l in range(m):
sum2 += liste[l][k]
sum += liste[k][l]
if sum2 != md and -(k+1) is not y_liste:
y_liste.append(-(k+1))
if sum != md and (k+1) is not y_liste:
y_liste.append(k+1)
sum2 = 0
sum = 0
if md != ad:
y_liste.append(0)
print len(y_liste)
y_liste.sort()
for i in y_liste:
print i
问题陈述
幻方
Johnny 设计了一个魔方(所有行、列和对角线的总和相同的数字平方,即主对角线 - 即从左上角到右下角的对角线 - 和antidiagonal - 意思是从右上角到左下角的对角线)。写个程序测试一下。
任务
编写一个程序来检查给定的正方形是否神奇(即所有行、列和对角线的总和都相同)。
输入
第一行:N,正方形的大小 (1 <= N <= 600)。
接下来 N 行:正方形,前行 N space 个分隔整数,代表正方形每一行的条目。
输出
第一行: M ,总和不等于主对角线总和的行数(即包含正方形第一个元素的行)。如果 Square 是魔法,程序应该输出 0。
接下来的 M 行:一个排序的(递增顺序)行列表,这些行的总和不等于主对角线的总和。行编号为 1,2,...,N;列编号为 -1、-2、...、-N;并且反对角线编号为零。
注意:输出的最后一行末尾有一个换行符。
示例输入 1
3
8 1 6
3 5 7
4 9 2
示例输出 1
0
示例输入 2
4
16 3 2 13
5 10 11 8
6 9 7 12
4 15 14 1
示例输出 2
3
-2
-1
0
示例输出 2 的解释
输入方块如下所示:http://i.stack.imgur.com/JyMgc.png
(抱歉 link 但由于声誉原因我无法添加图片)
正方形有 4 行(橙色标记为 1 到 4)和 4 列(绿色标记为 -1 到 -4),如上图所示。正方形的主对角线和反对角线分别以红色和蓝色突出显示。
主对角线的总和 = 16 + 10 + 7 +1 = 34。
反对角线的总和 = 13 + 11 + 9 + 4 = 37。这与主对角线的总和不同,因此应报告反对角线对应的值 0。
第 1 行的总和 = 16 + 3 + 2 + 13 = 34.
第 2 行的总和 = 5 + 10 + 11 + 8 = 34.
第 3 行的总和 = 6 + 9 + 7 + 12 = 34.
第 4 行的总和 = 4 + 15 + 14 + 1 = 34.
-1 列的总和 = 16 + 5 + 6 + 4 = 31。这与主对角线的总和不同,因此应报告值 -1。
-2 列的总和 = 3 + 10 + 9 + 15 = 37。这与主对角线的总和不同,因此应报告值 -2。
第 -3 列的总和 = 2 + 11 + 7 + 14 = 34.
第 -4 列的总和 = 13 + 8 + 12 + 1 = 34.
根据以上,有3条线的总和不等于主对角线的元素之和。由于它们应按递增顺序排序,因此输出应为:
3
-2
-1
0
你的解释没有讨论这个可能导致错误的子句:
if md == ad:
print 0
else:
它说如果主对角线和反对角线相加等于相同的值,则只打印 0(无坏线),表示幻方有效(不同于在坏线列表中报告 0)。考虑这个有效的幻方:
9 6 3 16
4 15 10 5
14 1 8 11
7 12 13 2
如果我交换 13 和 11,对角线仍然相等,但正方形无效。所以上面的代码似乎不正确。在上述 if
语句的 else
子句中,您测试:
if md != ad:
y_liste.append(0)
您已经从 previous/outer 测试中知道一个事实,因此您的代码似乎与自身不一致。