перевести метод python на ruby - PullRequest
0 голосов
/ 16 ноября 2009

Каким будет правильный перевод следующего метода Python на Ruby?

def uniqueCombinations(self, items, n):
    """ 
    items: list of elements
    n: number in a group
    """
    if n == 0:
        yield []
    else:
        for i in range(len(items)-n+1):
            for cc in uniqueCombinations(items[i+1:],n-1):
                yield [items[i]]+cc

Я хочу позвонить

uniqueCombinations(['01', '02', '03'], 2) 

и получите

[['01', '02'], ['01', '03'], ['02', '03']]

Это то, что у меня есть.

def uniq_c(items, n)
  if n == 0
    yield []
  else
    puts items.inspect
    range_max = items.length-n+1
    for i in (0...range_max)
      u = uniq_c(items[(i+1)..-1], n-1) { |x| x }
      u.each do |cc|
        yield [items[i]] + cc
      end
    end
  end
end

но я получаю это:

in `+': can't convert Fixnum into Array (TypeError)

Ответы [ 3 ]

2 голосов
/ 16 ноября 2009

Начиная с Ruby 1.8.7, класс Array предоставляет метод для возврата комбинаций:

irb> ['01', '02', '03']. Комбинация (2) .to_a => [["01", "02"], ["01", "03"], ["02", "03"]]

2 голосов
/ 16 ноября 2009
yield [items[i]] + cc

Вы пытаетесь объединить массив ([items [i]]) и Fixnum (cc). Вместо этого вы можете превратить оба в массив или использовать метод <<, чтобы вставить cc в [items [i]]. </p>

yield [items[i]] << cc
0 голосов
/ 16 ноября 2009

Во-первых, было бы лучше сделать это как метод класса Array.

Во-вторых, вы можете исправить ошибку, изменив [items[i]] + cc на [items[i]] + [cc].

В-третьих, вот другая реализация, которую я использовал, посмотрите, что вы думаете. Он создает массив перестановок, представленных индексами, а затем отображает каждый индекс на его значение.

class Array
  def combinations(n)
    perms = []
    a = (0...n).to_a
    while perms.push a.dup
      break if a.increment!(a.length - 1, self.length-1).nil?
    end
    perms.map {|p| p.map {|i| self[i]} }
  end
  def increment!(i, max)
    self[i] += 1
    while self[i] > max
      return nil if i <= 0
      return nil if self.increment!(i - 1, max).nil?
      self[i] = self[i - 1] + 1
    end
    self.dup
  end
end

[1,2,3].combinations 3 # => [[1, 2, 3]]
[1,2,3].combinations 2 # => [[1, 2], [1, 3], [2, 3]]
[1,2,3].combinations 1 # => [[1], [2], [3]]
[:foo,:bar,:baz,:quux,:wibble].combinations 3
# => [[:foo, :bar, :baz],
#     [:foo, :bar, :quux],
#     [:foo, :bar, :wibble],
#     [:foo, :baz, :quux],
#     [:foo, :baz, :wibble],
#     [:foo, :quux, :wibble],
#     [:bar, :baz, :quux],
#     [:bar, :baz, :wibble],
#     [:bar, :quux, :wibble],
#     [:baz, :quux, :wibble]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...