Я повторяю перестановки списка (18 элементов) следующим образом:
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
используется для возобновления работы из ранее сохраненного состояния, поэтому оно всегда отличается, но для достижения 200 миллионов требуется почти 200 с, поэтому мне интересно, есть ли более быстрый способ пропустить несколько итераций или начать с итерации n (преобразование перечислителя в массив занимает еще больше времени). Если нет, то также будет оценен способ создания пользовательского repeated_permutation(n).each_with_index
(который дает результаты в том же порядке).
Не стесняйтесь перенаправить меня на существующий ответ (я не нашел ни одного)
PS. (что я придумал)
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| '0123456789'.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
list
? - person Cary Swoveland   schedule 28.06.2017