gpt4 book ai didi

Ruby Arrays - 求对角线的总和

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:46 25 4
gpt4 key购买 nike

以前没见过这个,但我想知道如何在 Ruby 中找到二维数组的两条对角线之和。假设您有一个简单的数组,包含 3 行和 3 列。

array = [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
for i in 0..2
for j in 0..2
diagonal_sum += array[i][j]
end
end

最佳答案

这是我的尝试:

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

根据上面的观察,您似乎可以在一次迭代中解决:

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

添加了OOP代码风格:

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

关于Ruby Arrays - 求对角线的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28917105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com