Ответ 1
%w[a b c].permutation.map &:join
Как я могу сделать это в Ruby?
p "abc".all_possible_permutations
Вернется:
[
"abc",
"acb",
"bca",
"bac",
"cba",
"cab",
]
Благодаря Якубу Хэмплу:
class String
def all_possible_permutations
self.chars.to_a.permutation.map(&:join)
end
end
%w[a b c].permutation.map &:join
Если кто-то не хочет использовать встроенную функцию:
def permute(result,input)
if(input.length == 0)
return
end
if(input.length == 1)
puts result + input[0]
return
end
if(input.length == 2)
puts result + input[0] + input[1]
puts result + input[1] + input[0]
return
end
(0...input.length).step(1).each do |i|
firstpart = result+input[i]
secondpart = (i > 0 ? input[0..(i-1)] : '') + (input[(i+1)..-1] || '')
permute(firstpart,secondpart)
end
end
permute('',gets.chomp)
p "abc".chars.permutation.map &:join
["abc", "acb", "bac", "bca", "cab", "cba"]
&: объединение может быть заменено на {| я | i.join} следующим образом:
p "abc".chars.permutation.map {| я | i.join}
Если кто-то хочет иметь код для этого, используя базовые алгоритмы, вот как вы это делаете -
$count = 0
def permute(permuted_string, original_string, done_array)
if permuted_string.length == original_string.length
$count = $count+1
puts "#{$count} #{permuted_string}"
else
(0..original_string.length-1).each do |i|
if !done_array[i]
done_array[i] = true
permute(permuted_string+original_string[i], original_string, done_array)
done_array[i] = false
end
end
end
end
puts "Please enter the string for permutations"
input = gets.chomp
done_array = Array.new(input.length, false)
permute("", input, done_array)