videos repeticion permutaciones matematicas combinaciones algoritmo ruby

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