Maximum triangle path sum

Iterative solution:

var sum = [0]

ARGF.each {  |line|
    var x = line.words.map{.to_n}
    sum = [
            x.first + sum.first,
            {|i| x[i] + [sum[i-1, i]].max }.map(1 ..^ x.end)...
            x.last + sum.last,
          ]
}

say sum.max

Recursive solution:

var triangle = ARGF.slurp.lines.map{.words.map{.to_n}}

func max_value(i=0, j=0) is cached {
    i == triangle.len && return 0
    triangle[i][j] + [max_value(i+1, j), max_value(i+1, j+1)].max
}

say max_value()

Output:

% sidef maxpath.sf triangle.txt
1320