ruby - repeticion - ¿Todas las posibles permutaciones de una cadena dada?
permutaciones y combinaciones (4)
Una línea:
p "abc".chars.permutation.map &:join
Salida de muestra:
["abc", "acb", "bac", "bca", "cab", "cba"]
- p es opcional
- cadena podría ser una variable en su lugar
- chars es bastante rápido, separa la cadena en una matriz de caracteres individuales
- el mapa tiene toneladas de aplicaciones geniales, toma un objeto y lo devuelve después de que se realiza el bloqueo, en este caso, la operación se une
&: join podría ser reemplazado por {| i | i.join} de esta manera:
p "abc" .chars.permutation.map {| i | Me uno }
¿Cómo haría esto en Ruby?
p "abc".all_possible_permutations
Volvería:
[
"abc",
"acb",
"bca",
"bac",
"cba",
"cab",
]
Editar
Gracias a Jakub Hampl:
class String
def all_possible_permutations
self.chars.to_a.permutation.map(&:join)
end
end
Si alguien no quiere usar la función incorporada:
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)
Si alguien quiere tener el código para esto usando algoritmos básicos, aquí está cómo hacerlo:
$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)
%w[a b c].permutation.map &:join