しばらく前に、単純な python プログラムを作成して、ドライブ ヤ ナッツ パズルの単一のソリューションをブルート フォースしました。
(ソース: tabbykat.com )
パズルは 1 ~ 6 の数字が書かれた 7 つの六角形で構成され、すべてのピースを並べて、各数字が次のピースの同じ数字に隣接するようにする必要があります。
パズルには~1.4G
ユニークではない可能性があります:7!
ピースを順番に並べ替えるオプションがあります (たとえば、center=0
、top=1
、時計回りに続く...)。ピースを並べ替えた後、各ピースを 6 つの方法で回転させることができます (各ピースは六角形です)。これ6**7
により、7 つのピースの特定の順列に対して可能な回転を得ることができます。合計:7!*(6**7)=~1.4G
可能性。次の python コードは、これらの可能なソリューションを生成します。
def rotations(p):
for i in range(len(p)):
yield p[i:] + p[:i]
def permutations(l):
if len(l)<=1:
yield l
else:
for perm in permutations(l[1:]):
for i in range(len(perm)+1):
yield perm[:i] + l[0:1] + perm[i:]
def constructs(l):
for p in permutations(l):
for c in product(*(rotations(x) for x in p)):
yield c
ただし、パズルには~0.2G
一意の可能なソリューションしかないことに注意してください。各可能なソリューションは他の 5 つのソリューションに相当するため、可能なソリューションの総数を 6 で割る必要があります (パズル全体を 1/6 回転させるだけです)。
このパズルのユニークな可能性だけを生成するより良い方法はありますか?