Question

Je besoin d'une méthode écrite en Ruby, qui calcule variations. Je l'ai déjà écrit en Java, mais comme je suis nouveau à Ruby, il y a quelque chose qui me manque sur l'application Ruby.

La méthode est suposed à faire:
Procédé (1 "01") => [ "0", "1"]
méthode (2, "01") => [ "00", "01", "10", "11"] ... donc vous voyez l'idée.

Note: dans le Ruby impl, je donne paralms comme ceci: méthode (2, [ "0", 1" ]), mais ce n'est pas un problème

.

Mon Java impl:

public static List<String> Variations(int strength, String usableChars) {
    List<String> list = 
        new ArrayList<String>((int) Math.pow(usableChars.length(), strength));

    if (strength == 0) {
        list.add("");
    } else {
        List<String> l = Variations(strength - 1, usableChars);
        for (char c : usableChars.toCharArray()) {
            for (String s : l) {
                list.add(c + s);
            }
        }
    }
    return list;
}

Et il va bien de travail. Mais ceci est ma mise en œuvre Ruby:

def Variation (strength, arrayOfString)
    array = Array.new(arrayOfString.size**strength)

    if strength == 0
        array << ""
    else
        a = Variation(strength-1, arrayOfString)
        for i in arrayOfString do
            for j in a do
                array << (i + j)
            end
        end
    end
    return array 
end

Dans ce que je continue à recevoir test.rb message d'erreur: 10: `Variation '. Ne peut pas convertir en nil String (de TypeError)

Était-ce utile?

La solution

Dans Ruby, les tableaux automatiquement au besoin grandir. Donc, changer votre initialisation de tableau à partir de:

array = Array.new(arrayOfString.size**strength)

à

array = []

Enumérer sur chaque caractère dans une chaîne, au lieu de

for i in arrayOfString do

faire ceci:

arrayOfString.each_char do |i|

Le résultat final:

#!/usr/bin/ruby1.8

def Variation (strength, arrayOfString)
  array = []
  if strength == 0
    array << ""
  else
    a = Variation(strength - 1, arrayOfString)
    arrayOfString.each_char do |i|
      for j in a do
        array << (i + j)
      end
    end
  end
  return array
end

p Variation(2, '01')    # => ["00", "01", "10", "11"]

each_char est en Ruby> = 1.8.7, ou vous pouvez l'obtenir à partir de la pierre précieuse backports .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top