2012-04-30 13 views
0

サンプル入力数値であるように、文字列と整数を含む文字列「車トラック8つの4バス6 1」ソート文字列がアルファベット順であり、全ての整数を順番に

出力例:「バスカー1~4トラック6 8"

文字列のn番目の要素が、それは整数、 ままにしなければならないし、それが単語であるならば、それは言葉

ままにしなければならない整数の場合、これを行うための、よりエレガントかつ効率的な方法があります?以下は私のルビーコードです。私はより効率的なコードを探しています(ルビにする必要はありません)。

puts "Enter Input:" 
inp = gets 

inp_ary=inp.split(" ") 

a=inp_ary.group_by{|i| i=~ /\d/} 

sort_words = a[nil].sort 
sort_integer = a[0].sort 

index_words=[] 
index_integer=[] 

inp_ary.each_with_index do |e,i| 
    if e =~ /\d/ 
    index_integer << i 
    else 
    index_words << i 
    end 
end 

final = [] 

sorted = sort_words + sort_integer 

index_integer.each_with_index do |e,i| 
    final[e] = sort_integer[i] 
end 

index_words.each_with_index do |e,i| 
    final[e] = sort_words[i] 
end 

puts "Sorted Output: " 
puts final.join(" ") 
+0

なぜC++タグ? – CyprUS

+2

C++は最も効率的な言語なので、 :-)もっと興味深いのは、トラックが4と6の間にある理由です。 –

+0

整数が単語に対してどのような位置にあるべきですか?すなわち、車の後で、トラックの前に4つの理由は何ですか? –

答えて

4
s = "car truck 8 4 bus 6 1" 

tokens = s.split 
numbers, words = tokens.partition{|t| t =~ /^\d+$/} 
numbers.map!(&:to_i).sort! 
words.sort! 

result = tokens.map{|t| (t =~ /^\d+$/ ? numbers : words).shift}.join(' ') 

p result 
#=> "bus car 1 4 truck 6 8" 
関連する問題