红宝石阵列 - 查找对角线的总和 [英] Ruby Arrays - Find the sums of the diagonals
本文介绍了红宝石阵列 - 查找对角线的总和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
以前没见过这一个,但我不知道你如何找到在Ruby中二维数组的两条对角线的总和。假设你有一个简单的数组,以3行3列。
阵列= [1,2,3,4,5,6,7,8,9]
我可以通过分解成三个一组
array.each_slice(3).to_a
现在是
[1,2,3],[4,5,6],[7,8,9][1,2,3]
[4,5,6]
[7,8,9]
在这种情况下,对角线
1 + 5 + 9 = 15
3 + 5 + 7 = 15
所以,总和将 15 + 15 = 30
我想我可以做类似
diagonal_sum = 0
因为我在0..2
在0..2Ĵ
diagonal_sum + =阵列[I] [J]。
结束
结束
解决方案
下面是我的尝试:
阵列= [1,2,3,4,5,6,7,8,9]
切片= array.each_slice(3).to_a
#由于切片大小为3,我花了2,即3 - 1
(0..2).MAP {| I |切片[I] [I]}#=> [1,5,9]
(0..2).MAP {| I |切片[Ⅰ] [ - I-1]}#=> [3,5,7]
(0..2).MAP {| I |切片[I] [I]}。降低+
#=> 15
(0..2).MAP {| I |切片[Ⅰ] [ - I-1]}。降低+
#=> 15
根据以上的观察的似乎在一次迭代中,你可以做解决:
left_diagonal,right_diagoal =(0..2).each_with_object([],[])做| I,A |
一个[0]&下;&下;切片[I] [I]
一个[1];&下;切片[Ⅰ] [ - I-1]
结束left_diagonal.reduce(+)#=> 15
right_diagonal.reduce(+)#=> 15
添加,的 OOP 的code的风格:
类方阵
attr_reader:数组:为了 高清初始化数组,正
@array = array.each_slice(N).to_a
@order = N
结束 高清collect_both_diagonal_elements
(0 ...顺序).collect_concat {| I | [数组[我] [我],数组[我] [ - I-1]}
结束 高清collect_left_diagonal_elements
(0 ...顺序).collect {| I |数组[我] [我]}
结束 高清collect_right_diagonal_elements
(0 ...顺序).collect {| I |阵列[Ⅰ] [ - I-1]}
结束 高清sum_of_diagonal_elements类型
案件类型
时:所有然后collect_both_diagonal_elements.reduce(0,+)
当:那么好吧collect_right_diagonal_elements.reduce(0,+)
时:左,那么collect_left_diagonal_elements.reduce(0,+)
结束
结束
结束阵列= [1,2,3,4,5,6,7,8,9]
平方米= SquareMatrix.new阵,3
sqm.collect_both_diagonal_elements#=> [1,3,5,5,9日,7]
sqm.sum_of_diagonal_elements:所有#=>三十
sqm.collect_left_diagonal_elements#=> [1,5,9]
sqm.sum_of_diagonal_elements:左#=> 15
sqm.collect_right_diagonal_elements#=> [3,5,7]
sqm.sum_of_diagonal_elements:右#=> 15
Haven't seen this one before, but I was wondering how you can find the sums of both diagonals of a 2D array in Ruby. Say you have a simple array, with 3 rows and 3 columns.
array = [1,2,3,4,5,6,7,8,9]
I can break it into groups of three by using
array.each_slice(3).to_a
Would now be
[1,2,3], [4,5,6], [7,8,9]
[1,2,3]
[4,5,6]
[7,8,9]
In this case, the diagonals are
1 + 5 + 9 = 15
3 + 5 + 7 = 15
So the total sum would be 15 + 15 = 30
I was thinking I could do something like
diagonal_sum = 0
for i in 0..2
for j in 0..2
diagonal_sum += array[i][j]
end
end
解决方案
Here is my try :
array = [1,2,3,4,5,6,7,8,9]
sliced = array.each_slice(3).to_a
# As sliced size is 3, I took 2, i.e. 3 - 1
(0..2).map { |i| sliced[i][i] } #=> [1, 5, 9]
(0..2).map { |i| sliced[i][-i-1] } # => [3, 5, 7]
(0..2).map { |i| sliced[i][i] }.reduce :+
# => 15
(0..2).map { |i| sliced[i][-i-1] }.reduce :+
# => 15
As per the above observation it seems in one iteration you can do solve :
left_diagonal, right_diagoal = (0..2).each_with_object([[], []]) do |i, a|
a[0] << sliced[i][i]
a[1] << sliced[i][-i-1]
end
left_diagonal.reduce(:+) # => 15
right_diagonal.reduce(:+) # => 15
Added, OOP style of code :
class SquareMatrix
attr_reader :array, :order
def initialize array, n
@array = array.each_slice(n).to_a
@order = n
end
def collect_both_diagonal_elements
(0...order).collect_concat { |i| [ array[i][i], array[i][-i-1] ] }
end
def collect_left_diagonal_elements
(0...order).collect { |i| array[i][i] }
end
def collect_right_diagonal_elements
(0...order).collect { |i| array[i][-i-1] }
end
def sum_of_diagonal_elements type
case type
when :all then collect_both_diagonal_elements.reduce(0, :+)
when :right then collect_right_diagonal_elements.reduce(0, :+)
when :left then collect_left_diagonal_elements.reduce(0, :+)
end
end
end
array = [1,2,3,4,5,6,7,8,9]
sqm = SquareMatrix.new array, 3
sqm.collect_both_diagonal_elements # => [1, 3, 5, 5, 9, 7]
sqm.sum_of_diagonal_elements :all # => 30
sqm.collect_left_diagonal_elements # => [1, 5, 9]
sqm.sum_of_diagonal_elements :left # => 15
sqm.collect_right_diagonal_elements # => [3, 5, 7]
sqm.sum_of_diagonal_elements :right # => 15
这篇关于红宝石阵列 - 查找对角线的总和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文