【发布时间】:2020-06-09 12:48:42
【问题描述】:
注意:这个问题提出了一个我已经解决的问题,但是我觉得我的解决方案非常初级,其他人,比如我自己,会从更有经验的开发人员的讨论中受益.解决问题的不同方法以及更复杂的方法和算法将不胜感激。我觉得这是一个学习 Ruby 如何解决我认为对于初学者来说相当困难的问题的好地方。
给定一个 6x6 2D 数组arr:
1 1 1 0 0 0
0 1 0 0 0 0
1 1 1 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
我们将arr 中的沙漏定义为值的子集,在arr 的图形表示中,索引落在此模式中:
a b c
d
e f g
arr 中有 16 个沙漏,沙漏和是沙漏值的总和。计算arr 中每个沙漏的沙漏总和,然后打印最大沙漏总和。
例如,给定二维数组:
arr = [
[-9, -9, -9, 1, 1, 1],
[ 0, -9, 0, 4, 3, 2],
[-9, -9, -9, 1, 2, 3],
[ 0, 0, 8, 6, 6, 0],
[ 0, 0, 0, -2, 0, 0],
[ 0, 0, 1, 2, 4, 0]
]
我们计算以下沙漏值:
-63, -34, -9, 12,
-10, 0, 28, 23,
-27, -11, -2, 10,
9, 17, 25, 18
我们最高的沙漏值来自沙漏:
0 4 3
1
8 6 6
我的解决办法是:
def hourglass_sum(arr)
hourglasses = []
arr.each_with_index do |row, i|
# rescue clause to prevent iterating outside the array
unless arr[i].nil?
arr[i].length.times do |iteration|
# generate n 3x3 arrays
r1 = arr[i][iteration...iteration+3]
r2 = arr[i+1][iteration...iteration+3] if arr[i+1] != nil
r3 = arr[i+2][iteration...iteration+3] if arr[i+2] != nil
# rescue clause to stop creating 3x3 arrays that fall outside given input array
if arr[i+1] != nil && arr[i+2] != nil
# take all values except indices 0 and 5 from the 9 element array
result = r1 + [r2[1]] + r3
hourglasses << result.sum unless result.include? nil
end
end
end
end
p hourglasses.max
end
arr = [[-9, -9, -9, 1, 1, 1], [0, -9, 0, 4, 3, 2], [-9, -9, -9, 1, 2, 3], [0, 0, 8, 6, 6, 0], [0, 0 ,0, -2, 0, 0], [0, 0, 1, 2, 4, 0]]
hourglass_sum(arr)
# => 28
【问题讨论】:
-
感谢@CarySwoveland 的建议。我已经适当地编辑了这个问题。
-
您不需要在末尾定义
arr,因为它已经在前面定义了。 (一般情况下,尝试格式化以便读者不必水平滚动。)一种 Ruby 约定是使用 snake case 来命名 Ruby 变量和方法(例如,hourglass_sum而不是hourglassSum)。当然,您不必遵守该约定,但如果您不遵守约定,如果您看到一群愤怒的 Rubyists 拿着火把和干草叉朝您走来,请不要感到惊讶。 -
感谢@CarySwoveland,根据您的建议编辑了代码。
-
“始终编写代码,就好像最终维护您的代码的人将是一个知道您住在哪里的暴力精神病患者。代码可读性。” — 约翰·伍兹
-
我建议检查“Code Review”是否是一个更好的站点,或者在如何优化代码方面可能更具指导性。有关更多信息,请参阅其“On-topic”信息。
标签: arrays ruby algorithm multidimensional-array