逆転表を求めるRubyコードを短く書きたいです.
taocp 3巻 ソートと探索
p.10
引用「順列a1a2...anの逆転表
b1b2...bnは,bjをjの左にあるjより大きな要素の数とすることによって得られる.
言い換えると,bjは,jを第2要素とする逆転の数である.
したがって,たとえば,順列
5 9 1 8 2 6 4 7 3
は
逆転表
2 3 6 4 0 2 2 1 0
をもつ.
なぜなら,5と9は1の左にあり,
5,9,8は2の左にあり,などとなっているからである.」
の定義に従って,Rubyで書きました.
3通り思いつきました.
a=[5,9,1,8,2,6,4,7,3] b=[2,3,6,4,0,2,2,1,0] c=0 d=[] for j in 1..a.size for i in 0..a.index(j)-1#indexの後ろは増加 if a[i] > j#indexの後ろと同じ数字 c += 1 end end # p c d << c c=0 end p d
で
[2, 3, 6, 4, 0, 2, 2, 1, 0]
と出力が得られました.
for文を1個減らしたのが,
a=[5,9,1,8,2,6,4,7,3] b=[2,3,6,4,0,2,2,1,0] c=0 d=[] 1.upto(a.size){|x| for i in 0..a.index(x)-1 if a[i] > x c += 1 end end d << c c = 0 } p d
for文を0個にしたのが,
c=0 d=[] 1.upto(a.size){|x| 0.upto(a.index(x)-1){|y| if a[y] > x c += 1 end } d << c c = 0 } p d
一気に書こうとして,詰まりました.
a=[5,9,1,8,2,6,4,7,3] b=[2,3,6,4,0,2,2,1,0] c=0 d=[] 9.times{|x| 1.upto(a.index(1)){|y| p a[x];p y;p a[x] > y} p "@" } # c=[] # 1.upto(9){|x| # c << a.find_index(x) # } # p c # p a.index(1)#2 # p a.index(2)#4 # p a.index(9)#1 # c=0 # d=[] # 1.upto(a.size){|x| # 0.upto(a.index(x)-1){|y| # if a[y] > x # c += 1 # end # } # d << c # c = 0 # } # p d # c=0 # d=[] # 1.upto(a.size){|x| # for i in 0..a.index(x)-1 # if a[i] > x # c += 1 # end # end # d << c # c = 0 # } # p d # 空の配列を作ってそこに代入していく?b=[] # aの配列の中の1より左側に1より大きい数字の個数の合計を出す # p a.index(1) # p x # p i # p a[i] # c=0 # d=[] # for j in 1..a.size # for i in 0..a.index(j)-1#indexの後ろは増加 # if a[i] > j#indexの後ろと同じ数字 # c += 1 # end # end # # p c # d << c # c=0 # end # p d # 線 # 3.times{ # puts "." # } # c=0 # for i in 0..a.index(1)-1#indexの後ろは増加 # if a[i] > 1#indexの後ろと同じ数字 # c += 1 # end # end # p c # d=0 # for j in 0..a.index(2)-1 # if a[j] > 2 # d += 1 # end # end # p d # # 終了条件 # # 線 # 3.times{ # puts "." # } # e=0 # for k in 0..a.index(9)-1 # if a[k] > 9 # e += 1 # end # end # p e # # これを二重ループにする
出力が
5 1 true 5 2 true "@" 9 1 true 9 2 true "@" 1 1 false 1 2 false "@" 8 1 true 8 2 true "@" 2 1 true 2 2 false "@" 6 1 true 6 2 true "@" 4 1 true 4 2 true "@" 7 1 true 7 2 true "@" 3 1 true 3 2 true "@"
また,アルゴリズムでおすすめの本を教えてください.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/01 22:09