J'itérer sur les permutations d'une liste (18 articles) comme ceci:recenseurs ruby: sauter immédiatement plusieurs itérations (ou commencer à itérer de n)
List = [item0..item18] # (unpredictable)
Permutation_size = 7
Start_at = 200_000_000
for item, i in List.repeated_permutation(Permutation_size).each_with_index
next if i < Start_at
# do stuff
end
Start_at
est utilisé pour reprendre à partir d'un état précédemment enregistré donc c'est toujours différent mais il faut presque 200s pour atteindre 200 millions donc je me demande s'il y a un moyen plus rapide d'ignorer plusieurs itérations ou de commencer à l'itération n (convertir l'énumérateur en un tableau prend encore plus de temps). Sinon, un moyen de créer un repeated_permutation(n).each_with_index
personnalisé (qui donne des résultats dans le même ordre) serait également apprécié.
Sentez-vous libre de me rediriger vers une réponse existante (je n'ai pas trouvé)
PS. (Ce que je suis venu avec)
class Array
def rep_per_with_index len, start_at = 0
b = size
raise 'btl' if b > 36
counter = [0]*len
# counter = (start_at.to_s b).split('').map {|i| ''.include?(i) ? i.to_i : (i.ord - 87)} #this is weird, your way is way faster
start_at.to_s(b).chars.map {|i| i.to_i b}
counter.unshift *[0]*(len - counter.length)
counter.reverse!
i = start_at
Enumerator.new do |y|
loop do
y << [counter.reverse.map {|i| self[i]}, i]
i += 1
counter[0] += 1
counter.each_with_index do |v, i|
if v >= b
if i == len - 1
raise StopIteration
else
counter[i] = 0
counter[i + 1] += 1
end
else
break
end
end
end
end
end
end
Quelle est la taille maximale approximative de 'list'? –
Idéalement, je voudrais une solution générale mais maintenant la taille est toujours 18 –