J'ai rapidement fouetté du code pour cela. Cependant, j'ai omis de séparer chaque combinaison possible de la liste donnée, parce que je n'étais pas sûr que c'était réellement nécessaire, mais il devrait être facile à ajouter, si nécessaire. Quoi qu'il en soit, le code fonctionne assez bien pour de petites quantités, mais comme le mentionne déjà CodeByMoonlight, la quantité de possibilités est vraiment très élevée et le temps d'exécution augmente en conséquence.
Quoi qu'il en soit, voici le code python:
import time
def separate(toseparate):
"Find every possible way to separate a given list."
#The list of every possibility
possibilities = []
n = len(toseparate)
#We can distribute n-1 separations in the given list, so iterate from 0 to n
for i in xrange(n):
#Create a copy of the list to avoid modifying the already existing list
copy = list(toseparate)
#A boolean list indicating where a separator is put. 'True' indicates a separator
#and 'False', of course, no separator.
#The list will contain i separators, the rest is filled with 'False'
separators = [True]*i + [False]*(n-i-1)
for j in xrange(len(separators)):
#We insert the separators into our given list. The separators have to
#be between two elements. The index between two elements is always
#2*[index of the left element]+1.
copy.insert(2*j+1, separators[j])
#The first possibility is, of course, the one we just created
possibilities.append(list(copy))
#The following is a modification of the QuickPerm algorithm, which finds
#all possible permutations of a given list. It was modified to only permutate
#the spaces between two elements, so it finds every possibility to insert n
#separators in the given list.
m = len(separators)
hi, lo = 1, 0
p = [0]*m
while hi < m:
if p[hi] < hi:
lo = (hi%2)*p[hi]
copy[2*lo+1], copy[2*hi+1] = copy[2*hi+1], copy[2*lo+1]
#Since the items are non-unique, some possibilities will show up more than once, so we
#avoid this by checking first.
if not copy in possibilities:
possibilities.append(list(copy))
p[hi] += 1
hi = 1
else:
p[hi] = 0
hi += 1
return possibilities
t1 = time.time()
separations = separate([2, 3, 3, 5])
print time.time()-t1
sepmap = {True:"|", False:""}
for a in separations:
for b in a:
if sepmap.has_key(b):
print sepmap[b],
else:
print b,
print "\n",
Il est basé sur l'algorithme de QuickPerm, que vous pouvez en savoir plus sur ici: QuickPerm
Fondamentalement, mon code génère une liste contenant des séparations n, inserts dans la liste donnée, puis trouve toutes les permutations possibles des séparations dans la liste.
Donc, si nous utilisons votre exemple, nous obtenons:
2 3 3 5
2 | 3 3 5
2 3 | 3 5
2 3 3 | 5
2 | 3 | 3 5
2 3 | 3 | 5
2 | 3 3 | 5
2 | 3 | 3 | 5
En ,000154972076416 secondes. Cependant, j'ai lu la description du problème que vous faites et je vois comment vous essayez de résoudre cela, mais vu la rapidité avec laquelle le temps d'exécution augmente, je ne pense pas que cela fonctionnerait aussi vite que prévu. . Rappelez-vous que les problèmes du projet Euler devraient résoudre dans environ une minute.
En fait, ce sont des listes, pas de jeux. Pardon. Il y aura des valeurs en double. –
Sur quel problème travaillez-vous? –
159, mais je vais vous laisser savoir pourquoi je veux cet algorithme –