我想将展平数组中的索引转换为多维数组中的坐标。
示例: 在下面的二维数组中,其大小为[3,3]:
[
[ -, -, - ],
[ *, -, - ],
[ -, -, - ]
]
*
的坐标为[0,1]。如果我们将此数组展平为:
[ -, -, -, *, -, -, -, -, - ]
*
的坐标(或索引)变为3.我们怎么能做相反的事情呢?也就是说,这样的方法如下:
index_to_coordinates([3, 3], 3) # => [0, 1]
答案 0 :(得分:5)
请注意,您的index_to_coordinates
将[3, 3]
(除了展平的索引3
)作为参数,但这是多余的。您需要的信息是矩阵中的每一行长度为3
,扁平索引为3
。
3.divmod(3).reverse # => [0, 1]
divmod
为您提供一对商和余数。由于您需要订单:x坐标(余数)然后是y坐标(商),您需要reverse
来翻转订单。
根据问题的变化进行编辑
注意:我假设以下是ruby 1.9。我不想打扰红宝石1.8。如有必要,请自行将其翻译为ruby 1.8。应该很容易。
假设你有一个结构:
[
[
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
]
[
[12, 13, 14, 15]
[16, 17, 18, 19]
[20, 21, 22, 23]
]
]
使该结构的大小表示为[2,3,4]。通常,我们可以将大小表示为数组sizes
。您可以将其转换为数组flattened
,该数组表示当整个结构展平到该维度时每个维度的大小:
flattened = sizes.dup.drop(1)
(1...flattened.length).reverse_each{|i| flattened[i-1] *= flattened[i]}
使用特定示例:
flattened # => [12, 4]
这意味着最大周期为12,下一个为4.假设您需要7
的坐标。为了做到这一点,你可以:
index = 7
coordinate = flattened.each_with_object([]) do |size, array|
quotient, index = index.divmod(size)
array.push(quotient)
end
coordinate.push(index)
这会给你:
coordinate # => [0, 1, 3]