Работа с массивами Ruby (Ruby 1.8 и Rails 2.2) - PullRequest
2 голосов
/ 29 января 2009

Я безнадежно пытаюсь написать метод для манипулирования массивом в ruby. Я пытаюсь сгенерировать все перестановки порядка в массиве, где каждый элемент в свою очередь заменяется внешним элементом Пример ...

С учетом ввода:

arr = ["a", "b", "c"]

Желаемый вывод:

newArr = [ ["a", "b", "c"], ["a", "b", "*"], ["a", "*", "c"], ["a", "*", "*"], ["*", "b", "c"], ["*", "b", "*"], ["*", "*", "c"], ["*", "*", "*"] ]

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 3 ]

8 голосов
/ 29 января 2009

Я тоже не понимаю ваш пример заказа, но игнорируя это, вот решение в одной строке:

(0...(2**a.size)).map {|x| (0...a.size).map {|y| x & 2**y == 0 ? a[y] : val}}
2 голосов
/ 29 января 2009

Я не уверен, что перестановка - правильное слово. Если вы считаете в двоичном коде, то вы заменяете вещи, если они есть. Вот что в Ruby:

def mike(arr, sub)
  format = sprintf("%%0%db", arr.length)
  m = Array.new
  0.upto(2**arr.length-1) { |i|
    bits = sprintf(format, i).split('')
    a = Array.new
    0.upto(arr.length-1) { |j|
      if bits[j] == '0' then
        a << arr[j]
      else
        a << sub
      end
    }
    m[i] = a
  }
  return m
end

arr = ["a", "b", "c"]

p mike(arr, '*')

Является ли это лучше тогда с троичным оператором?

a <<= bits[j] == '0' ? arr[j] : sub

Должен быть более умный (или, по крайней мере, более рубеский) способ сделать это, но, похоже, он дает желаемый результат.

ETA : Упс! Мои вторые и третьи пункты не согласны с вашими. Я думаю, я не знаю, какой порядок вы имеете в виду.

1 голос
/ 29 января 2009

Аналогично методу Ойленшпигуи:

def toggle(arr, sub)
  format = "%0#{arr.length}b"
  (0...2**(arr.length)).to_a.map do |i|
    sprintf(format,i).split('').zip(arr).map { |x| x[0] == "0" ? x[1] : sub }
  end
end

Комбинация split / zip сопоставляет каждую цифру двоичного расширения индекса с выбранным элементом. Карта в конце использует цифру, чтобы решить, должна ли она возвращать элемент массива или подстановку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...