为魔术广场写一个类型合约

时间:2015-11-05 14:55:17

标签: python python-3.x

我被问到要为这个魔术广场编写代码。

  

如果

,则二维整数矩阵s是幻方      
      
  1. s的尺寸为nxn
  2.   
  3. [1,2,...,n * n]中的每个整数都出现在s中,恰好一次。
  4.   
  5. s中所有行的总和与s中所有列的总和相同,与s中对角元素的总和相同。
  6.         

    示例:s=[[8, 3, 4], [1, 5, 9], [6, 7, 2]]表示   跟随整数矩阵:

    8 3 4
    1 5 9
    6 7 2
    
         

    请注意,上面的s是一个二维整数数组

         
        
    1. s是3x3平方
    2.   
    3. [1,2,...,9]中的所有数字都只出现在s中一次。
    4.   
    5. 所有行的总和与所有列的总和相同,与两条对角线的总和相同。

           
          
      • 行总和: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
      •   
    6.         

      示例:以下内容也很神奇:[[8, 1, 6], [3, 5, 7], [4, 9, 2]], [[6, 7, 2], [1, 5, 9], [8, 3, 4]]

我理解如何编写和编写此代码,但我的问题是如何为此编写类型合同。我知道如何编写一个程序来执行它,但是当涉及为任何程序输入合同时,你怎么知道将要有多少参数,以及你如何知道如何编写你想要它做什么的例子对于像这样的程序。在编写类型合同并为程序编写示例时,是否有一般的方法可以遵循?

2 个答案:

答案 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已经满足,这将使魔术检查更容易。 但这取决于你如何实现它。您可以立即获取整个列表等,但这是用户和您商定的决定。