🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

1496閲覧

rubyで配列を任意のindex番号で分割する方法を教えてください

usestrict

総合スコア13

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/12/09 10:22

編集2019/12/09 13:13

ruby(railsでも可)で下記のような配列を任意のindex番号で分割する方法を教えてください。

ruby

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

の配列を、任意のindex番号が2, 4, 7だった場合に下記のように分けたいです。
(指定したindex番号が先頭になる配列に分割したい)

ruby

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

今考えているのは

ruby

1arr = [1,2,3,4,5,6,7,8,9,10] 2offsets = [2, 4, 7] 3offset = 0 4 5result = offsets.each_with_object([]) do |n, result| 6 result.push arr[offset..(n - 2)] 7 offset = n - 1 8end 9result.push arr[offset..-1]

という感じです。offsetsは数値を直書きしてますが実際は要素数が不定、かつindex番号も不定の変数になります。(index番号は元の配列の長さを超えないこととします)
この場合、どのように記述すれば↑のコードより完結かつ高速に処理できるか教えていただきたいです。

何卒よろしくお願いします!

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

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

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

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

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

winterboum

2019/12/09 10:29

indexの先頭は1ですか? rubyの場合は0が普通なので
usestrict

2019/12/09 13:13

失礼しました、例文が間違っておりました!
guest

回答3

0

ベストアンサー

div.rb

ruby

1arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2offsets = [2, 4, 7] 3 4arr_2 = ([0] + offsets + [0]) 5 .each_cons(2).map{|i, j| arr[i .. j - 1]} 6p(arr_2)

実行例
イメージ説明

投稿2019/12/09 15:15

katoy

総合スコア22324

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

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

winterboum

2019/12/09 22:16 編集

これだ!! 確かそんなmethodがあったはずだと思い出そうとしたのですが、思い出しきれませんでした。
guest

0

ruby

1arr = [1,2,3,4,5,6,7,8,9,10] 2offsets = [2, 4, 7] 3 4offsets << arr.size 5p arr.chunk.with_index{|_,i| offsets.bsearch{|x| x > i} }.map(&:last)

正直、初めてArray#bsearch / [Enumerable#chunk](https://docs.ruby lang.org/ja/latest/method/Enumerable/i/chunk.html)を使ったような気がします。

追記

ruby

1arr = [1,2,3,4,5,6,7,8,9,10] 2offsets = [2, 4, 7] 3 4p arr.each_with_index.slice_when{|_, (_, i)| 5 if offsets.first == i 6 offsets.shift 7 end 8}.map{|a| a.map(&:first)}

オフセット→要素数への変換ができるのならば

ruby

1arr = [1,2,3,4,5,6,7,8,9,10] 2elements = [2, 2, 3] 3result = [] 4result << arr.shift(elements.shift) until elements.empty? 5result << arr 6p result

が速いとは思います。

投稿2019/12/09 13:38

編集2019/12/09 14:09
asm

総合スコア15149

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

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

otn

2019/12/09 15:55

> オフセット→要素数への変換ができるのならば それは、この人の1つ前の質問です。 個数だと、arrが余った場合にどうしたいのかが不明ですね。
winterboum

2019/12/09 22:12

そういうchunkの使い方がありましたか
guest

0

rubyの場合indexは0から扱うほうが何かと楽なので
「任意のindex番号が3,5,8だった場合に」

「任意のindex番号が2,4,7だった場合に」
とします。

arr = [1,2,3,4,5,6,7,8,9,10] indexes = [2,4,7] w_indexes = [0]+indexes d_indexes = indexes.map.with_index{|i,idx| i - work[idx]} darr = arr.dup d_indexes.map{|i| darr.shift(i)}+[darr]

ん〜〜ちと長いな。

arr = [1,2,3,4,5,6,7,8,9,10] indexes = [2,4,7] k=0;ary=[]; darr=arr.dup indexes.each{|idx| ary << darr.shift(idx-k);k=idx};ary<<darr

似たようなものか

投稿2019/12/09 13:05

winterboum

総合スコア23567

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

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

usestrict

2019/12/09 13:14

失礼しました!例文が間違っていたため修正しました!
winterboum

2019/12/09 22:03

それに沿っていると思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問