我被问到要为这个魔术广场编写代码。
如果
,则二维整数矩阵s
是幻方
- s的尺寸为nxn
- [1,2,...,n * n]中的每个整数都出现在s中,恰好一次。
- s中所有行的总和与s中所有列的总和相同,与s中对角元素的总和相同。
醇>示例:
s=[[8, 3, 4], [1, 5, 9], [6, 7, 2]]
表示 跟随整数矩阵:8 3 4 1 5 9 6 7 2
请注意,上面的
s
是一个二维整数数组
- s是3x3平方
- [1,2,...,9]中的所有数字都只出现在s中一次。
- 醇>
所有行的总和与所有列的总和相同,与两条对角线的总和相同。
- 行总和:
8+3+4 == 1+5+9 == 6+7+2 == 15
- Col sums:
8+1+6 == 3+5+7 == 4+9+2 == 15
- Diag sums:
8+5+2 == 6+5+4 == 15
示例:以下内容也很神奇:
[[8, 1, 6], [3, 5, 7], [4, 9, 2]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]]
我理解如何编写和编写此代码,但我的问题是如何为此编写类型合同。我知道如何编写一个程序来执行它,但是当涉及为任何程序输入合同时,你怎么知道将要有多少参数,以及你如何知道如何编写你想要它做什么的例子对于像这样的程序。在编写类型合同并为程序编写示例时,是否有一般的方法可以遵循?
答案 0 :(得分:1)
在检查array
是否是您的文档字符串应该是什么的方面,我实际上并不打扰。使用duck typing;假设它是正确的事情,并让呼叫者处理任何错误,如果他们没有传递你所要求的内容。
如果输入无效,您的功能将无法继续,因此无法处理该级别的错误,并尝试明确使用例如isinstance
只会缩小用户可以进一步传递的内容(例如,如果用户传入元组元组而不是列表列表,为什么不能继续工作?他们&# 39;两个序列......)。
如果您的问题实际上是关于包含示例,正如您的评论所示,我在这里开始:
def is_magic(array):
"""Whether the array is 'magic'.
Arguments:
array (sequence of sequences of integers): The array to test.
Returns:
bool: Whether the array is 'magic'.
Notes:
A 'magic' array is a 3x3 array of integers where each row, column
and diagonal adds up to the same number
Examples:
>>> is_magic([[8, 3, 4], [1, 5, 9], [6, 7, 2]])
True
"""
raise NotImplementedError
if __name__ == '__main__':
import doctest
doctest.testmod()
docstring记录该功能,并且可以由例如IDE和help
函数告诉用户该函数的功能。请注意使用doctest
示例,这两个示例都向用户显示如何调用函数以及预期返回的内容,并作为代码的测试。
当然,当你第一次运行它时,它会失败......
**********************************************************************
File "C:\Python27\so.py", line 16, in __main__.is_magic
Failed example:
is_magic([[8, 3, 4], [1, 5, 9], [6, 7, 2]])
Exception raised:
Traceback (most recent call last):
File "C:\Python27\lib\doctest.py", line 1315, in __run
compileflags, 1) in test.globs
File "<doctest __main__.is_magic[0]>", line 1, in <module>
is_magic([[8, 3, 4], [1, 5, 9], [6, 7, 2]])
File "C:\Python27\so.py", line 20, in is_magic
raise NotImplementedError
NotImplementedError
**********************************************************************
1 items had failures:
1 of 1 in __main__.is_magic
***Test Failed*** 1 failures.
答案 1 :(得分:0)
如果你的意思是你如何能够解决这个问题,那么所有问题都没有灵丹妙药。
但是,在此特定问题中,您的输入是单个列表。用户可以为您提供任何此类列表,例如
[3]
[3, [2, 5]]
[[5, 6]]
['ac']
只要你能确定它是&#34;语法上有效的&#34;根据一些规则列出,你可以处理它是否神奇。
您可以强制用户单独输入数据,以确保它是nxn和唯一整数[1..9],如下所示:
> Enter n: 3
> Enter [row, column] [1, 1]: 1
> Enter [row, column] [1, 2]: 3
...
由于条件#1,#2已经满足,这将使魔术检查更容易。 但这取决于你如何实现它。您可以立即获取整个列表等,但这是用户和您商定的决定。