3

次の配列があるとします。

a = (1..10).to_a

順序を維持しながら、配列を正確にN個のほぼ等しい部分に分割できる単一の組み込みルビー(またはレール)関数はありますか?

私はこのようなものを探しています:

a.bucketize(3)
=> [[1,2,3,4],[5,6,7],[8,9,10]]
a.bucketize(5)
=> [[1,2],[3,4],[5,6],[7,8],[9,10]]

ヒント:each_sliceこれはしません。

Arrayまた、この関数を自分で作成して、クラスまたはEnumerableモジュールを開くことができることも知っています。

ありがとう。

4

3 に答える 3

4

私は次のようにします:

ary = (1..10).to_a

ary.each_slice((ary.length.to_f/3).ceil).to_a
=> [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]

ary.each_slice((ary.length.to_f/5).ceil).to_a
=> [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]

完璧ではありませんが、次のようになります。

ary = (1..9).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

ary.each_slice((ary.length.to_f/2).ceil).to_a
=> [[1, 2, 3, 4, 5], [6, 7, 8, 9]]

ary.each_slice((ary.length.to_f/3).ceil).to_a
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

ary.each_slice((ary.length.to_f/4).ceil).to_a
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
于 2012-12-29T04:06:26.737 に答える
2

この種のタスクには、機能的アプローチを使用して取り組むのが最適です。これは末尾再帰関数の実装です (<<配列に効率的に蓄積することが避けられない場合を除く):

class Array
  def bucketize(n, index = 0, acc = [])
    return acc if n <= 0 || size <= index
    n0 = ((size - index).to_f / n).ceil
    bucketize(n - 1, index + n0, acc << self[index, n0])
  end
end

(1..9).to_a.bucketize(3)
#=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
(1..10).to_a.bucketize(3)
#=> [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
(1..11).to_a.bucketize(3)
#=> [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11]]
于 2012-12-29T10:44:57.980 に答える
0

これが私がやったことです:

class Array
  def bucketize(n)
    return [] if (buckets = n.to_i) <= 0
    j = length / buckets.to_f
    result = each_with_index.chunk { |_, i| (i / j).floor }.map { |_, v| v.map(&:first) }
    result << [] until result.length == buckets
    result
  end
end

例:

a = (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a.bucketize(1)
=> [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
a.bucketize(2)
=> [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
a.bucketize(3)
=> [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
a.bucketize(4)
=> [[1, 2, 3], [4, 5], [6, 7, 8], [9, 10]]
...
a.bucketize(9)
=> [[1, 2], [3], [4], [5], [6], [7], [8], [9], [10]]
...
a.bucketize(11)
=> [[1], [2], [3], [4], [5], [6], [7], [8], [9], [10], []]
于 2012-12-29T09:29:55.283 に答える