Class: Array

Inherits:
Object
  • Object
show all
Defined in:
lib/unique_permutation.rb

Overview

Based off of Algorithm L (Donald Knuth)

Instance Method Summary collapse

Instance Method Details

#unique_permutation {|array_copy.dup| ... } ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/MethodLength

Yields:

  • (array_copy.dup)


8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/unique_permutation.rb', line 8

def unique_permutation # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
  return enum_for(:unique_permutation) unless block_given?

  array_copy = sort
  yield array_copy.dup
  return if size <= 1

  loop do
    j = size - 2
    j -= 1 while j > 0 && array_copy[j] >= array_copy[j + 1]
    break unless array_copy[j] < array_copy[j + 1]

    l = size - 1
    l -= 1 while array_copy[j] >= array_copy[l]

    array_copy[j], array_copy[l] = array_copy[l], array_copy[j]
    array_copy[(j + 1)..] = array_copy[(j + 1)..].reverse

    yield array_copy.dup
  end
end