質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

1132閲覧

TAOCP3巻ソートと探索のp.10順列の組合わせ論の性質_逆転の逆転表を出力するRubyコードを短く書きたいです。

DrqYuto

総合スコア432

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/04/01 11:48

逆転表を求める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 "@"

参考
The Art of Computer Programming Volume 3 Sorting and Searching Second Edition 日本語版 (Ascii Addison Wesley programming series) | ドナルド・E. クヌース, Knuth, Donald E., 誠, 有澤, 英一, 和田 |本 | 通販 | Amazon

また,アルゴリズムでおすすめの本を教えてください.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

(1..a.size).map{|j| i=a.index(j);a[0,i].select{|ai| ai>j}.size}
(1..a.size).map{|j| a[0,a.index(j)].select{|ai| ai>j}.size}

より大きな要素の数 で 等しいか若しくはより大きな要素の数 ではないので
a[0,i] でも a[0..i] でも同じ結果になりますが、できるだけ短くということで1byte節約しました

投稿2020/04/01 16:25

編集2020/04/01 16:31
winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DrqYuto

2020/04/01 22:09

ありがとうございます! selectを使うんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問