aboutsummaryrefslogtreecommitdiff
path: root/challenge-100/paulo-custodio/lua/ch-2.lua
blob: 2c73edb907b97d99deb5b82a39658402d2710e28 (plain)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env lua

--[[
Challenge 100

TASK #2 > Triangle Sum
Submitted by: Mohammad S Anwar
You are given triangle array.

Write a script to find the minimum path sum from top to bottom.

When you are on index i on the current row then you may move to either
index i or index i + 1 on the next row.

Example 1:
Input: Triangle = [ [1], [2,4], [6,4,9], [5,1,7,2] ]
Output: 8

Explanation: The given triangle

            1
           2 4
          6 4 9
         5 1 7 2

The minimum path sum from top to bottom:  1 + 2 + 4 + 1 = 8

             [1]
           [2]  4
           6 [4] 9
          5 [1] 7 2
Example 2:
Input: Triangle = [ [3], [3,1], [5,2,3], [4,3,1,3] ]
Output: 7

Explanation: The given triangle

            3
           3 1
          5 2 3
         4 3 1 3

The minimum path sum from top to bottom: 3 + 1 + 2 + 1 = 7

             [3]
            3  [1]
           5 [2] 3
          4 3 [1] 3
--]]

triangle = {}

function add_row(row, text)
    rows = row
    table.insert(triangle, {})
    for i=1, row do
        local s, e = string.find(text, "(%d+)")
        local n = tonumber(string.sub(text, s, e))
        text = string.sub(text, e+1, -1)
        table.insert(triangle[row], n)
    end
end

function min_sum(sum, row, col)
    sum = sum or 0
    row = row or 1
    col = col or 1
    sum = sum + triangle[row][col]
    if row == rows then
        return sum
    else
        local sum1 = min_sum(sum, row+1, col)
        local sum2 = min_sum(sum, row+1, col+1)
        return math.min(sum1, sum2)
    end
end

for i=1, #arg do
    add_row(i, arg[i])
end
io.write(min_sum(), "\n")