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

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

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

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

Q&A

解決済

2回答

1750閲覧

2個ずつ追加

kamatmt

総合スコア25

Ruby

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

0グッド

0クリップ

投稿2016/02/26 08:52

rubyを使って2こずつ追加して比較したいと考えています。
現在のコードだと
[[[1, 2], [3, 4]], [[3, 4], [5, 6]], [[5, 6], [7, 8]],[[7, 8],[9, 10]]]
このような結果になっています。

そこを
[[[1, 2], [3, 4]], [[1, 2, 3, 4], [5, 6]], [[1, 2, 3, 4, 5, 6], [7, 8]],[[1, 2, 3, 4, 5, 6, 7, 8],[9, 10]]]
このようにするにはどのように直せばよいですか?
簡単なことかもしれませんがどうかお助けください。

ruby

1def input(tw,split_num) 2 3 ar=[] 4 ar_tmp=[] 5 ar_result=[] 6 7 for i in 1..tw.count do 8 if i%split_num != 0 then 9 ar_tmp.push(tw[i-1]) 10 else 11 ar_tmp.push(tw[i-1]) 12 ar.push(ar_tmp) 13 ar_tmp=[] 14 end 15 end 16 ar_tmp=[] 17 18 for i in 0..ar.count-2 do 19 ar_result.push([ar[i],ar[i+1]]) 20 end 21 22 return ar_result 23 24end 25 26ar=[1,2,3,4,5,6,7,8,9,10] 27p input(ar,2)

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

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

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

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

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

guest

回答2

0

ベストアンサー

Ruby

1def input(tw, split_num) 2 tw.each_slice(split_num).inject([[[], []]]) do |result, item| 3 result << [result.last.flatten, item] 4 end.drop(2) 5end 6ar = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 7p input(ar, 2)

今のコードを直す方向は少し難しいので、全く作り替えました。以下、解説です。

  1. N個ずつはEnumerable#each_sliceを使おう。

each_sliceはN個ずつまとめるという便利なメソッドです。Enumerableのメソッドなので、Arrayだけではなく、eachが使えるオブジェクトであれば何でも使えます。例えば、[1, 2, 3, 4, 5, 6].each_slice(2).to_aとすれば、[[1, 2], [3, 4], [5, 6]]になります。ブロックを付けなければEnumerableを返すので、そのまま次の計算に持って行くことも出来ます。

  1. 要素を見ていく度に増えていく場合はEnumerable#injectを使おう。

injectはreduceという別名があります。他の言語をしている人にはreduceやfoldlといった場合の方が通じます。実際にどう増えていくかを見ると、何をしているかがわかりやすいでしょう。

Ruby

1[[[], []]] 2[[[], []], [[], [1, 2]]] 3[[[], []], [[], [1, 2]], [[1, 2], [3, 4]]] 4[[[], []], [[], [1, 2]], [[1, 2], [3, 4]], [[1, 2, 3, 4], [5, 6]]] 5[[[], []], [[], [1, 2]], [[1, 2], [3, 4]], [[1, 2, 3, 4], [5, 6]], [[1, 2, 3, 4, 5, 6], [7, 8]]] 6[[[], []], [[], [1, 2]], [[1, 2], [3, 4]], [[1, 2, 3, 4], [5, 6]], [[1, 2, 3, 4, 5, 6], [7, 8]], [[1, 2, 3, 4, 5, 6, 7, 8], [9, 10]]]

上のはresultを毎回出力したものです。それぞれが、前の配列をフラット(flatten)したものと今回の要素のペアとした配列になっています。なので、まいかいそれをresultに追加していけば良いとなります。初期値は最初の要素でエラーとならないように空のデータを入れています。二番目の要素も結果には出さないので、最後にdrop(2)で最初の二つを削除して、目的の配列を得ています。

投稿2016/02/26 09:55

raccy

総合スコア21735

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

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

0

問題を 2 個づつでなく、n 個ずつ(n は 1 以上) と、一般化してみました。
gen.rb

ruby

1def generate(ary, n) 2 ans = [] 3 (1...(ary.length / n)).each do |x| 4 t = n * x 5 ans << [ary[0..(t - 1)], ary[t...(t + n)]] 6 end 7 ans 8end 9 10ar = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 11p generate(ar, 2) 12 13p generate(ar, 1) 14p generate(ar, 3) 15p generate(ar, 4)

実行結果

$ ruby gen.rb [[[1, 2], [3, 4]], [[1, 2, 3, 4], [5, 6]], [[1, 2, 3, 4, 5, 6], [7, 8]], [[1, 2, 3, 4, 5, 6, 7, 8], [9, 10]]] [[[1], [2]], [[1, 2], [3]], [[1, 2, 3], [4]], [[1, 2, 3, 4], [5]], [[1, 2, 3, 4, 5], [6]], [[1, 2, 3, 4, 5, 6], [7]], [[1, 2, 3, 4, 5, 6, 7], [8]], [[1, 2, 3, 4, 5, 6, 7, 8], [9]], [[1, 2, 3, 4, 5, 6, 7, 8, 9], [10]]] [[[1, 2, 3], [4, 5, 6]], [[1, 2, 3, 4, 5, 6], [7, 8, 9]]] [[[1, 2, 3, 4], [5, 6, 7, 8]]]

投稿2016/02/26 12:36

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問