2015-11-05 20 views
2

我被給了這個問題來寫這個魔方的代碼。寫一個幻方的代碼合同

的二維整數矩陣s是一個幻方如果

  1. S的尺寸是n×n的
  2. 中的每個整數[1,2,...,N * N]出現在s,恰好一次。
  3. s中所有行的總和與s中所有列的總和相同,與s中對角元素的總和相同。

實施例:s=[[8, 3, 4], [1, 5, 9], [6, 7, 2]]表示 下列整數矩陣:

8 3 4 
1 5 9 
6 7 2 

注意,以上s是二維整數數組

  1. S是一個3×3的正方形
  2. 在所有數字[1,2,...,9]只出現一次。
  3. 所有行的總和相等,所有列的總和與兩個對角線上的總和相同。

    • 行總和:8+3+4 == 1+5+9 == 6+7+2 == 15
    • 山口總和:8+1+6 == 3+5+7 == 4+9+2 == 15
    • Diag(診斷)和: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]]

我明白如何預測並寫這段代碼,但我的問題是如何爲此寫一個類型合同。我知道如何編寫一個程序來執行此操作,但是當涉及到爲任何程序鍵入契約時,您如何知道將要有多少個參數,以及您如何知道如何編寫您希望執行的操作的示例對於這樣的程序。在編寫一份合同和爲一個程序舉例時,是否有一種通用的方法?

+1

* 「型合同」 *?這是* Python!*假設輸入是一系列序列,並讓調用者處理任何錯誤,如果他們通過其他任何東西。 – jonrsharpe

+0

@jonrsharpe但我將不得不輸入的例子,如果我放在讓我們說is_magic( .....),然後把它假設的輸出。 – JerryMichaels

+0

如果你想展示的例子,把它們放在docstring中['doctest's](https://docs.python.org/3/library/doctest.html),那麼你實際上可以確保它們運行並使用它們測試你的代碼。 – jonrsharpe

回答

0

如果你的意思是你如何能夠一般地解決這個問題,那麼所有問題都沒有銀彈。

但是,在這個特定問題中,您的輸入是單個列表。用戶可以給你任何這樣的列表,例如。

[3] 
[3, [2, 5]] 
[[5, 6]] 
['ac'] 

只要你能確定它是根據一定的規則爲「語法有效的」列表中,您可以處理無論是神奇與否。

你可以強制用戶輸入的數據分別以保證它是n×n的和獨特的整數[1..9]是這樣的:

> Enter n: 3 
> Enter [row, column] [1, 1]: 1 
> Enter [row, column] [1, 2]: 3 
... 

這將使神奇的條件#1檢查之後輕鬆, #2已經滿足了。 但實際上它取決於你。你可以一次拿走整個清單等,但這是用戶和你同意的決定。

+0

*「只要你可以根據一些規則確定它是一個」語法上有效的「列表」*「,但最簡單的方法是通過鴨子打字(即嘗試使用它,就好像它是有效的),以及最好的方式告訴用戶否則會引發錯誤,並且*會自動發生!* – jonrsharpe

+0

您假設'最簡單'對程序員來說意味着最簡單。用戶必須弄清楚他自己做錯了什麼。 – ergonaut

+0

誰是用戶?如果OP只是寫一個Python函數,那麼*「user」*可能會是*一些其他的Python代碼*,它可以檢查例如'TypeError'相應地帶有'try'。 **這個函數無法繼續無效輸入,所以它應該停止,抱怨任何人調用它並讓它們處理它。這是所有關於在最合適的地方處理錯誤的方法,無論是當前函數(我們可以繼續),調用者(他們可以繼續),還是回到用戶(根本無法繼續),報告的級別是每個點也不同。 – jonrsharpe

1

在檢查array是否是您的文檔字符串應該是,我不會打擾。使用duck typing;假設這是正確的事情,並讓調用者處理任何錯誤,如果他們不通過你所要求的。

如果輸入無效,則您的函數無法繼續,因此沒有意義處理該級別的錯誤,並嘗試明確使用例如isinstance只能縮小用戶可以進一步傳遞的內容(例如,如果用戶傳入元組元組而不是列表列表,它們爲什麼不能繼續工作?它們都是序列... )。


如果您的問題實際上是關於包括示例,爲您的評論表明,這裏就是我會開始:

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.