2

(1D、2D、3D、またはそれ以上の次元の)配列がある場合、(この平坦化された配列からの)インデックスをその座標に変換できるようにしたいと思います。

たとえば、*正方形を考えます。

3D配列([2,3,2]形状)

arr = [ [ [ nil, nil ],
          [ nil, nil ],
          [ nil, nil ] ],
        [ [ "*", nil ],
          [ nil, nil ],
          [ nil, nil ] ] ]

arr.flatten[6]           # => "*"
arr.index2coordinates(6) # => [1,0,0] or [1][0][0]

4D配列([2,3,1,2]形状)

arr = [ [ [ [ nil, nil ],
            [ nil, "*" ],
            [ nil, nil ] ] ],
        [ [ [ nil, nil ],
            [ nil, nil ],
            [ nil, nil ] ] ] ]

arr.flatten[3]           # => "*"
arr.index2coordinates(3) # => [0,0,1,1] or [0][0][1][1]

1D配列([5]形状)

arr = [ nil, nil, nil, "*", nil ]

arr.flatten[3]           # => "*"
arr.index2coordinates(3) # => [3]

どうすればそのようなArray#index2coordinates方法を行うことができますか?ある意味で、この質問はベクトルを整数に変換する質問の逆です。どうもありがとう。

4

2 に答える 2

3

例、ステップバイステップ:

# 3D array (of [2,3,2] shape)
arr.flatten[6]           # => "*"
arr.index2coordinates(6) # => [1,0,0] or [1][0][0]

6 % 2              # => 0

(6 / 2) % 3        # (3) % 3 => 0

((6 / 2) / 3) % 2  # ((3) / 3) %2 => 1 % 2 => 1


# 4D array (of [2,1,3,2] shape)    
arr.flatten[3]           # => "*"
arr.index2coordinates(3) # => [0,0,1,1] or [0][0][1][1]

3 % 2                     # => 1

(3 / 2) % 3               # => 1 % 3 => 1

((3 / 2) / 3) % 1         # => 1 % 1 => 0

(((3 / 2) / 3) / 1) % 2   # 0 % 2 => 0

2番目の例の簡単なコード

result = []
index = 3

[2,1,3,2].reverse.each do |dimension|
  result = [index % dimension] + result
  index = (index / dimension)
end

result          # => [0, 0, 1, 1]
于 2012-05-08T20:19:56.303 に答える
0

各ステップに入るときにn次元インデックスを構築する構造を再帰的に検索し、*ターゲットが見つかった場合にインデックスを返します。

def coord(space, target='*', idx=[])
  found = nil
  space.each_with_index do |x,i|
    found = if x.is_a?(Array)
      coord(x, target, idx + [i])
    elsif x == target
      idx + [i]
    end
    break found if found
  end
  found
end

coord(arr3d) # => [1, 0, 0]
coord(arr4d) # => [0, 0, 1, 1]
coord(arr1d) # => [3]
coord([]) # => nil
于 2012-05-08T20:34:17.250 に答える