1

次のように、座標値を示す配列の配列があります。

cells = [ [0,0], [0,1] ]

配列内の各配列は、X 値と Y 値です。したがって、これを右にシフトしたい場合、それはX+1各セルになります。これを次のようにセルとして表現できます。

delta = [1,0]

今、私がやりたいのは、その値を各セルにマージして、各セルの X 値がデルタの値と合計されるようにすることです。この場合、最終的な出力は次のようになります。

new_cells = [ [1,0], [1,1] ]

これは私がこれまでに考えた中で最高のものです、それは本当に重いようです:

cells = [[0,0],[0,1]]
delta = [1,0]
cells.each do |cell|
  cell[0] = cell[0] + delta[0]
  cell[1] = cell[1] + delta[1]
end
# Now cells = [[1,0],[1,1]]

配列のチェーン内の各配列に配列を合計する、よりクリーンなワンライナーの種類のメソッドはありますか、それとも上記の問題に対する最良の解決策ですか?

4

5 に答える 5

3

最善の解決策は、セルとデルタが異なるデータ型であり、配列でない場合に操作できるデータ型が異なることを認識することだと思います。

Cell = Struct.new(:x, :y) do 
  def + other
    Cell.new(self.x + other.x, self.y + other.y)
  end
end

# cells is some array of Cell objects
# delta is some Cell object

cells.map! {|cell| cell + delta}
于 2012-08-13T01:49:39.227 に答える
2

ここ:

cells = cells.map {|c| [c[0] + delta[0], c[1] + delta[1]] }
于 2012-08-12T21:33:11.520 に答える
1

セルキーとデルタの一致について心配する必要がない方法は次のとおりです。

cells = cells.map {|cell| [cell,delta].transpose.map {|value| value.reduce(:+)}}

ステップバイステップ:

cells = cells.map { |cell|         # => [0,0]

  combined = [cell, delta]         # => [[0,0], [1,0]]

  transposed = combined.transpose  # => [[0, 1], [0, 0]]

  new_c = transposed.map { |value| # => [0, 1]

    value.reduce(:+)               # => 1, => 0

  }

  new_c                            # => [1,0] As expected for first cell.
}

cells                              # => [[1,0],[1,1]] Final result

別のサンプルデータを使用:

cells = [[0,0],[1,1],[2,2]]
delta = [1,1]
plug  = Proc.new {
  cells = cells.map { |cell| [cell, delta].transpose.map { |value| value.reduce(:+) } }
}

plug.call # => [[1, 1], [2, 2], [3, 3]]
plug.call # => [[2, 2], [3, 3], [4, 4]]
plug.call # => [[3, 3], [4, 4], [5, 5]]
plug.call # => [[4, 4], [5, 5], [6, 6]]
plug.call # => [[5, 5], [6, 6], [7, 7]]

別のもの:

cells = [[0,0,0],[0,1,2],[1,2,3],[2,3,4]]
delta = [3,2,1]

plug.call # => [[3, 2, 1],   [3, 3, 3],   [4, 4, 4],   [5, 5, 5]]
plug.call # => [[6, 4, 2],   [6, 5, 4],   [7, 6, 5],   [8, 7, 6]]
plug.call # => [[9, 6, 3],   [9, 7, 5],   [10, 8, 6],  [11, 9, 7]]
plug.call # => [[12, 8, 4],  [12, 9, 6],  [13, 10, 7], [14, 11, 8]]
plug.call # => [[15, 10, 5], [15, 11, 7], [16, 12, 8], [17, 13, 9]]

これがあなたの質問にうまく答えることを願っています。

于 2012-08-12T22:10:21.797 に答える
1
cells.map! {|x, y| [x + delta[0], y + delta[1]] }

Linuxios の回答、私の回答、およびあなたのソリューションは、他の誰かがセル配列または配列に含まれるセルの 1 つを参照している場合、すべて異なる効果を持つことに注意してください。あなたの答えだけが元のセルを適切に変更するため、私のソリューションまたは Linuxios のソリューション参照では、古いデータを指している可能性があります。

于 2012-08-12T21:41:33.960 に答える
1
cells.map {|cell| cell.zip(delta).map{|x, y| x + y }}

これは、提案されている他のソリューションよりもクリーンだとは思いません。

于 2012-08-12T21:45:45.770 に答える