文字列を一文字づつ飛ばし文字にするのこと(Ruby)

まず、「esehara」という文字列がある。この文字列を「eeaa」といったように、一文字ずつ飛ばし文字にするにはどうしたらいいか

http://bugrammer.hateblo.jp/entry/2016/10/24/175704

あるブログでこんなのを見て考えてみた。

コード例。

def one_jump(str)
  str.chars.each_slice(2).map {|a, *b| a}.join
end

puts one_jump("esehara")    #=>eeaa

こんなのでどうですかね。chars してから each_slice しているので、効率はあまりよくないかも知れない。一応ワンライナーではある。


文字列を一回しか走査しないバージョン(メソッド one_jump1)を書いてベンチマークを取ってみる。

require "benchmark"

def one_jump(str)
  str.chars.each_slice(2).map {|a, *b| a}.join
end

def one_jump1(str)
  flag = true
  result = ""
  str.each_char do |c|
    result << c if flag
    flag = !flag
  end
  result
end


str = [*""..""].join

Benchmark.bm do |x|
 x.report {one_jump(str) }
 x.report {one_jump1(str)}
end

結果。

       user     system      total        real
   0.008000   0.004000   0.012000 (  0.008788)
   0.004000   0.000000   0.004000 (  0.005388)

正確に半分の時間になっているな。しかしどちらも計算量は O(n) だろうから、大してちがわない。one_jump の方が短い Ruby コードのせいか、文字数を大きくすると差が縮まってくることが観測された。