[英]Generate a dictionary of all possible Kakuro solutions
我剛從 Python 開始,並想嘗試為 Kakuro 拼圖生成所有可能解決方案的字典。 有一些關於這些謎題的帖子,但沒有一個顯示如何生成所述字典。 我所追求的是一個字典,它有 3-45 的鍵,它們的值是與鍵相加的整數的元組(例如 mydict[6] = ([1,5],[2,4] ,[1,2,3]))。 它本質上是一個子集和問題 - https://mathworld.wolfram.com/SubsetSumProblem.html
我自己有一個 go ,它可以處理長達三位數的元組。 我的方法需要為元組中每個額外的 integer 循環,所以需要我編寫一些非常重復的代碼嗎? 有沒有更好的方法來做到這一點,我覺得我想循環創建循環? 如果那是一件事?
def kakuro():
L = [i for i in range(1,10)]
mydict = {}
for i in L:
L1 = L[i:]
for j in L1:
if i+j in mydict:
mydict[i+j].append((i,j))
else:
mydict[i+j] = [(i,j)]
L2 = L[j:]
for k in L2:
if i+j+k in mydict:
mydict[i+j+k].append((i,j,k))
else:
mydict[i+j+k] = [(i,j,k)]
for i in sorted (mydict.keys()):
print(i,mydict[i])
return
我的第二輪嘗試——越來越好!
def kakurodict():
from itertools import combinations as combs
L = [i for i in range(1,10)]
mydict={}
mydict2={}
for i in L[1:]:
mydict[i] = list(combs(L,i))
for j in combs(L,i):
val = sum(j)
if val in mydict2:
mydict2[val].append(j)
else:
mydict2[val] = [j]
return mydict2
因此,這是根據以下假設編寫的。
我希望其他人提供更好的解決方案,因為當我們為值 3-45 生成所有子集時,需要相當長的時間。 我相信子集和生成問題的時間復雜度是 2^n,所以如果 n 是 45,它並不理想。
import itertools
def subsetsums(max):
if (max < 45):
numbers = [x for x in range(1, max)]
else:
numbers = [x for x in range(1, 45)]
result = [list(seq) for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == max]
return(result)
mydict = {}
for i in range(3, 46):
mydict[i] = subsetsums(i)
print(mydict)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.