2013-04-17 45 views
1
1+3+9 = 13 = 1+3 = 4. 
6+1+1+5 = 13 = 1+3 = 4. 
9+9+4 = 22 = 2+2 = 4. 
etc 

考慮到前面的例子,可以說減少到4的可能性達到無窮大。儘管如此,IT有可能控制進入最初遊戲的數字的數量。Python Itertools:複雜的「產品」

def reduct(length): 
    ... 
    ... 
    return reduction 

你們有什麼想法,我怎麼可以編碼這樣的功能?我想輸入一個「長度」,假設它是7,例如,假設結束簡化爲5,我希望它做到這一點:

x + x + x + x + x + x + X = 5

如果它給了我爲x個做好一切準備。

我已經花了太多的時間去解決問題,我無法弄清楚如何做到這一點。順便說一句,這是一個很好的編程練習(一個很好的挑戰);我非常感謝你的幫助。

+0

什麼長度的限制?你想要所有的解決方案還是隻需要計數? – marcadian

+0

長度將通過「的raw_input」來指定。它可以是任何數字。所以,我想知道函數的長度是多少,只是爲了看看它是如何工作的:)。 –

+0

你是說長度沒有限制嗎? – marcadian

回答

5

我好不容易想起了一個解決方案(假設itertools已經導入):

def reduct(length, n=5): 
    return [i for i in \ 
      itertools.combinations_with_replacement(range(1, 10), length) \ 
      if ((sum(i) - 1) % 9 + 1) == n] 

這將返回所有獨特的組合是「減少」到n,這是5默認。


說明:

  • itertools.combinations_with_replacement(range(1, 10), length)產生(不包括0length一個數字號碼的所有唯一組合。請參閱documentation
  • ((sum(i) - 1) % 9 + 1)產生的每一種組合的「還原」。它使用digital root((n - 1) % 9 + 1,與n如在組合中的數字的總和。
  • 其餘部分是自我解釋(我希望)。

一些測試運行:

>>> reduct(2) 
[(1, 4), (2, 3), (5, 9), (6, 8), (7, 7)] 
>>> reduct(3) 
[(1, 1, 3), (1, 2, 2), (1, 4, 9), (1, 5, 8), (1, 6, 7), (2, 3, 9), 
(2, 4, 8), (2, 5, 7), (2, 6, 6), (3, 3, 8), (3, 4, 7), (3, 5, 6), 
(4, 4, 6), (4, 5, 5), (5, 9, 9), (6, 8, 9), (7, 7, 9), (7, 8, 8)] 
>>> len(reduct(7)) 
715 

指定自定義n

>>> reduct(2, 8) 
[(1, 7), (2, 6), (3, 5), (4, 4), (8, 9)] 
>>> reduct(3, 8) 
[(1, 1, 6), (1, 2, 5), (1, 3, 4), (1, 7, 9), (1, 8, 8), (2, 2, 4), 
(2, 3, 3), (2, 6, 9), (2, 7, 8), (3, 5, 9), (3, 6, 8), (3, 7, 7), 
(4, 4, 9), (4, 5, 8), (4, 6, 7), (5, 5, 7), (5, 6, 6), (8, 9, 9)] 
>>> len(reduct(7, 8)) 
715 
+0

血腥的輝煌!非常感謝你!我會深入研究它。 –

+1

@EricsonWillians無後顧之憂。這是一個有趣的挑戰! – Volatility

+0

數字根公式..這很酷 – wim