2014-12-30 2 views
4

Я просматриваю проблемы с Ruby Primer Ruby Monk's Ruby.Метод комбинаций Ruby's Array

Заявление о проблемах Учитывая число из 3 или 4 цифр с различными цифрами, верните отсортированный массив из всех уникальных чисел, которые могут быть сформированы с этими цифрами. Пример: Дано: 123 Возврат: [123, 132, 213, 231, 312, 321]

Я думал, что массив # комбинация метод будет делать трюк. Мой код выглядит следующим образом:

def number_shuffle(number) 
    # take integer and turn it into an array of digits 
    digits = Array.new 

    number.to_s.split('').each do |element| 
    digits << element.to_i 
    end 

    # shuffle the elements 
    return digits.combination(digits.length).to_a 
end 

puts number_shuffle(123) 

Но приведенный выше код возвращает:

1 
2 
3 

Не уверен, что я делаю неправильно здесь. Я думал, что документация ясно дал понять:

http://www.ruby-doc.org/core-2.2.0/Array.html#method-i-combination

Любая помощь приветствуется.

+0

Для 'number = 123' вы вычисляете' [1,2,3] .combination (3) .to_a => [[1,2,3]] 'и' puts [[1,2,3] ] 'будет печатать' 1', '2' и' 3' на последовательных строках. Напротив, 'p [[1,2,3]]' печатает '[[1, 2, 3]]' в одной строке. Вы получаете этот результат, потому что каждый массив 'a' имеет только одну комбинацию размера' a.size', а именно 'a', поэтому' [a] 'возвращается. С другой стороны, '[1,2,3] .combination (1).(1), [2], [3]] и [1,2,3] ]] '. Я считаю, что вам известно, что вам нужно использовать 'перестановка', а не' сочетание'. –

ответ

1

Вместо Array#combination, вы хотите Array#permutation:

number = 123 
number.to_s.split('').permutation.map(&:join).uniq.sort 
# => ["123", "132", "213", "231", "312", "321"] 

number = 122 
number.to_s.split('').permutation.map(&:join).uniq.sort 
# => ["122", "212", "221"] 
+0

Спасибо, ребята, но теперь я не понимаю, что делают методы комбинации. –

+0

См. Http://www.mathsisfun.com/combinatorics/combinations-permutations.html. Кроме того, при выборе решения, каким должен быть результат, когда 'number = 122'? – Matt

+1

Лучший способ понять разницу между 'комбинациями' и' permuations' состоит в том, чтобы просто оценить массив в обоих направлениях и посмотреть, что вы получаете: '[1,2,3] .combination (2) .to_a => [[1 , 2], [1, 3], [2, 3]] ',' [1,2,3] .permutation (2) .to_a => [[1, 2], [1, 3], [2 , 1], [2, 3], [3, 1], [3, 2]]. Вы видите, что для комбинации '[1, 2]' существуют две перестановки '[1, 2]' и '[2, 1]'. Для комбинации '[1,2,4]' из '[1,2,3,4] .combination (3) .to_a' существует шесть (3x2) перестановок:' [1,2,4] ',' [1,4,2] ',' [2,1,4] ',' [2,4,1] ',' [4,1,2] 'и' [4,2,1] ' –

1

Вы можете получить перестановки массива символов с использованием Array#permutation:

def number_shuffle(number) 
    number.to_s.chars.permutation.map { |x| x.join.to_i }.sort 
end 
0

Для рубиновых монах вопроса, что и нужно это массив. перестановки. Array.permutation (n) - количество возможных аранжировок массива, принимающих n за раз. [1,2,3] с n = 1 будет 1, 2, 3 [1,2,3] с n = 2 будет [1,2] [2,1] [1,3] [3 , 1] [2,3] [3,2]

что вам нужно

Array.permutations(Array.length) 

Array.combination (п) возвращает количество уникальных опций, которые могут быть сделаны из массива, извлечение n объектов из массива.

для массива [1,2,3], если n = 1. Вы можете только вынуть один элемент в то время возможные варианты: 1, 2 и 3.

для массива [1,2,3], если п = 2. Вы можете вынуть два элемента за раз. возможные варианты: [1,2], [1,3] и [2,3]

Вы дали длину массива, как N (N = Array.length)

Так в случае [1,2,3], если n = 3, существует только один способ сделать выбор , используя все элементы. То есть [1,2,3]. Вот почему ваш код возвращает только одну комбинацию.

Смежные вопросы