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

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

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

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

Q&A

解決済

1回答

1216閲覧

一定の法則を持つソースコードの処理に困っています

navernchu

総合スコア10

Ruby

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

0グッド

0クリップ

投稿2016/08/24 16:44

###該当のソースコード

ruby

1i=1 2nsymp.each{|ns| 3 if ns == 1 then 4 subj_symp.each{|symp| 5 test_symps[tdis][i]=[symp] 6 i+=1 7 } 8 elsif ns==2 then 9 subj_symp.each_with_index{|symp1,idx1| 10 subj_symp.each_with_index{|symp2,idx2| 11 if idx1 < idx2 then 12 test_symps[tdis][i]=[symp1,symp2] 13 i+=1 14 end 15 } 16 } 17 elsif ns==3 then 18 subj_symp.each_with_index{|symp1,idx1| 19 subj_symp.each_with_index{|symp2,idx2| 20 subj_symp.each_with_index{|symp3,idx3| 21 if idx1 < idx2 && idx2 < idx3 then 22 test_symps[tdis][i]=[symp1,symp2,symp3] 23 i+=1 24 end 25 } 26 } 27 } 28 end 29}

###前提・実現したいこと
上記のソースコードにはある一定の法則があります。
①ns==iである
②ひとつ前のelsifの塊(ns==i-1)の『subj_symp.each_with_index{|sympi-1,idxi-1|』の次の行に『subj_symp.each_with_index{|sympi,idxi|』を加える
③先ほど加えた『subj_symp.each_with_index{|sympi,idxi|』の次の行のifの条件に『 && idxi-1 <idxi 』を加える
④先ほど加えたifの実行文の『test_symps[tdis][i]=[symp1,symp2,symp3...,sympi-1]』に『,sympi』を加える

コードに表すと、下記のようになると思います。

ruby

1i=1 2nsymp.each{|ns| 3 if ns == 1 then 4 subj_symp.each{|symp| 5 test_symps[tdis][i]=[symp] 6 i+=1 7 } 8 elsif ns==2 then 9 subj_symp.each_with_index{|symp1,idx1| 10 subj_symp.each_with_index{|symp2,idx2| 11 if idx1 < idx2 then 12 test_symps[tdis][i]=[symp1,symp2] 13 i+=1 14 end 15 } 16 } 17 . 18 . 19 . 20 21 elsif ns==i then 22 subj_symp.each_with_index{|symp1,idx1| 23 subj_symp.each_with_index{|symp2,idx2| 24 subj_symp.each_with_index{|symp3,idx3| 25 . 26 . 27 . 28 subj_symp.each_with_index{|sympi,idxi| 29 if idx1 < idx2 && idx2 < idx3 ... && idxi-1 <idxi then 30 test_symps[tdis][i]=[symp1,symp2,symp3...sympi-1,sympi] 31 i+=1 32 end 33 } 34 . 35 . 36 . 37 } 38 }

###発生している問題
ns==5くらいの場合は5回くらいの繰り返し書けばよかったのですが、ns==10になると書くのが大変になり、ソースコード自体も長くなってしまうので改善したいです。

拙い文と説明ですが何卒ご教授お願い致します。
わかりづらい説明があれば、お手数ですが質問してください。よろしくお願いします。

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

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

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

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

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

flied_onion

2016/08/24 17:26

元々何をしたいコードなのか書いた方がいいでしょう。
flied_onion

2016/08/24 17:28

あと動かすために必要な、サンプルの nsymp, subj_symp, test_sympsなどもあった方が良いですね。
navernchu

2016/08/25 11:32

ご指摘ありがとうございます。今後の参考にさせていただきます。
guest

回答1

0

ベストアンサー

解釈間違ってるかもしれませんが,こんな感じ?

ruby

1nsymp = [1, 2, 3, 4] # sample 'nsymp' 2subj_symp = ['a', 'b', 'c', 'd'] # sample 'subj_symp' 3 4nsymp.each do |ns| 5 p ns.times.map{|_| 6 subj_symp.each_with_index.to_a 7 }.reduce(&:product).flatten.each_slice(2).each_slice(ns).select{|a| 8 a.each_cons(2).all? {|b,c| (b[1] <=> c[1]) < 0} 9 }.map{|a| 10 a.map(&:first) 11 } 12end

変数に格納じゃなくて出力にしてるけど,結果的には以下のような感じになります.

[["a"], ["b"], ["c"], ["d"]] [["a", "b"], ["a", "c"], ["a", "d"], ["b", "c"], ["b", "d"], ["c", "d"]] [["a", "b", "c"], ["a", "b", "d"], ["a", "c", "d"], ["b", "c", "d"]] [["a", "b", "c", "d"]]

投稿2016/08/24 19:02

tamy

総合スコア442

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

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

navernchu

2016/08/25 11:33

解釈あっています。 これで解決しそうです。 自分の拙い文を理解していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問