-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmaximum_path_sum.rb
More file actions
38 lines (30 loc) · 885 Bytes
/
Copy pathmaximum_path_sum.rb
File metadata and controls
38 lines (30 loc) · 885 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# frozen_string_literal: true
class MaximumPathSum
def self.from(triangle:) = new(triangle:).find
def initialize(triangle:)
@initial_row = triangle.shift
@summable_rows = triangle
end
def find
summable_rows
.reduce(initial_row) { |previous_row, summable_row| summed_row(previous_row, summable_row) }
.max
end
private
attr_reader :initial_row, :summable_rows
def summed_row(previous_row, summable_row)
first_sum = summable_row.shift + previous_row.first
last_sum = summable_row.pop + previous_row.last
[first_sum]
.concat(rest_max_sum(previous_row, summable_row))
.append(last_sum)
end
def rest_max_sum(previous_row, summable_row_rest)
summable_row_rest.map!.with_index do |number, index|
[
number + previous_row[index],
number + previous_row[index + 1]
].max
end
end
end