まず、「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 コードのせいか、文字数を大きくすると差が縮まってくることが観測された。