Я не уверен, что перестановка - правильное слово. Если вы считаете в двоичном коде, то вы заменяете вещи, если они есть. Вот что в 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 : Упс! Мои вторые и третьи пункты не согласны с вашими. Я думаю, я не знаю, какой порядок вы имеете в виду.