1

与えられた文字列のすべての可能な順列をリストする次のコードがあります。しかし、私の厄介なリスト(ruby配列)の操作と関数型プログラミングに関する知識が限られているため、結果の配列を取得するにはflattenを使用する必要があります。それはかなりハックです。コードをリファクタリングして、フラット化の使用(乱用)を回避するにはどうすればよいですか?

class String
  def remove_char_at(i)
    if i==0
      self[1..-1]
    else
      self[0..i-1] + self[i+1..-1]
    end
  end
end

def permute(str,prefix="")

  if str.size==0
    prefix
  else
    str.chars.each_with_index.map do |s,i|
        permute(str.remove_char_at(i),prefix+s)
    end.flatten
  end

end
4

4 に答える 4

2

Rubyはあなたのために多くの大変な仕事をしてくれました。文字列myStringのすべての順列を取得するには、次の手順を実行します。

myString.split('').permutation.map(&:join).uniq

これにより、文字列コンポーネントが配列に分割されます。配列のすべての順列を取得します。それらを文字列に結合します。重複を取り除きます。

于 2012-08-05T19:54:32.947 に答える
2

SICPの最初の章で、関数型プログラミングに関する興味深いことを見つけることができます。

def permute2(str,prefix="")

  if str.size==0
    [prefix] #revise for concatenate with memo
  else
    str.chars.each_with_index.inject([]) do |memo, ary|
        s = ary[0]
        i = ary[1]
        memo += permute2(str.remove_char_at(i),prefix+s) #memoize
    end
  end

end
于 2012-08-06T09:30:38.147 に答える
2
class String
  def remove_char_at(i)
    if i==0
      self[1..-1]
    else
      self[0..i-1] + self[i+1..-1]
    end
  end
end

...の代わりにを使用して、次のようにリファクタリングできます..

class String
  def remove_char_at(i)
    self[0...i] + self[i+1..-1]
  end
end
于 2012-08-06T23:30:41.457 に答える
1

私は具体的にどのようにコードをリファクタリングし、フラット化の使用(乱用)を回避することができますか?部:

map+の代わりに、1.9.2で導入されたflat_mapflattenを使用できます。

于 2012-08-06T21:31:30.040 に答える