0

Ruby 1.9.3 でこのような文字列を含む変数があります

#HELLO
#HELLO
#HELLO
#HELLO
#WORLD
#WORLD
#WORLD
#WORLD
#FOO
#BAR
#WORLD

私はそれを次のようなものに変換したいと思います:

4 times #HELLO end
4 times #WORLD end
#FOO
#BAR
#WORLD

つまり、連続する重複文字列は、量を除いて1つにまとめてほしい。

Ruby の関数型プログラミング機能またはその他の手法を使用してこれを行う賢い方法はありますか?

4

4 に答える 4

1

これを試して:

str = "#HELLO
#HELLO
#HELLO
#HELLO
#WORLD
#WORLD
#WORLD
#WORLD
#FOO
#BAR
#WORLD"

result = ""
identical_lines = 1
str << "\n " # we need a last line to compare

str.lines.each_cons(2) do |line1,line2|
  if line1 == line2
    identical_lines += 1
  elsif identical_lines > 1
    result << "#{identical_lines} times #{line1.chomp} end\n"
    identical_lines = 1
  else
    result << line1
  end
end

puts result

このプログラムは出力します

4 times #HELLO end
4 times #WORLD end
#FOO
#BAR
#WORLD
于 2012-07-03T08:52:38.440 に答える
1

Unix のようなボックスを使用している場合は、出力を .xml に渡すことができますuniq -c。その後、出力を少しクリーンアップする必要があるかもしれませんがsed、それは比較的単純なはずです。

ただし、きれいな純粋なルビーソリューションもあると確信しています。

于 2012-07-03T08:48:52.510 に答える
0

膨大な量が関係している場合は、圧縮を使用する必要があります。ホイールを再発明しないでください。ただし、楽しみのためだけです。

s = %q{#HELLO
#HELLO
#HELLO
#HELLO
#WORLD
#WORLD
#WORLD
#WORLD
#FOO
#BAR
#WORLD}

s.split.inject([[]]) { |m, s| !s.empty? && (m[-1][0] != s) ? (m << [s,1]) :  m[-1][1] += 1;m }.drop 1
#=>[["#HELLO", 4], ["#WORLD", 4], ["#FOO", 1], ["#BAR", 1], ["#WORLD", 1]]

まず、文字列を配列に分割して折り畳み (挿入) し、連続する double を削除して、結果を 2 次元配列に入れます。

于 2012-07-03T09:48:17.497 に答える
0

このようなもの:

text.each_line.each_with_object(Hash.new(0)).do |e,h|
  h[e.chomp] += 1
end.each.map do |k,v|
  v > 1 ? "#{v} times #{k} end" : k
end.tap do |array|
  File.open(...) { |f| array.each { |e| f.puts e } }
end
于 2012-07-03T09:02:15.703 に答える