MojoでProject Euler 67

https://projecteuler.net/problem=67

単なるDPですね。

import sys


#################### library ####################

fn read_csv(path: String, delim: String) -> List[List[Int]]:
    try:
        var table = List[List[Int]]()
        with open(path, "r") as f:
            var all_text = f.read()
            var lines = all_text.split('\n')
            for line in lines:
                if len(line[]) == 0:
                    break
                var v = line[].split(delim)
                var ns = List[Int]()
                for s in v:
                    var n = atol(s[])
                    ns.append(n)
                table.append(ns)
        return table
    except:
        return List[List[Int]]()


#################### List ####################

fn initialize_list[T: CollectionElement](N: Int, init: T) -> List[T]:
    var a = List[T](capacity=N)
    for n in range(N):
        a.append(init)
    return a

trait Printable(CollectionElement, Stringable):
    pass

fn print_list[T: Printable](a: List[T]):
    if a.size > 0:
        var s = "[" + str(a[0])
        for i in range(1, a.size):
            s += ", " + str(a[i])
        s += "]"
        print(s)
    else:
        print("[]")

fn max_list[T: ComparableCollectionElement](a: List[T]) -> T:
    var max_elem = a[0]
    for i in range(1, len(a)):
        if a[i] > max_elem:
            max_elem = a[i]
    return max_elem


#################### process ####################

fn update_dp(dp: List[Int], v: List[Int]) -> List[Int]:
    var L = len(v)
    var new_dp = List[Int](dp[0] + v[0])
    for i in range(1, L-1):
        new_dp.append(max(dp[i-1], dp[i]) + v[i])
    new_dp.append(dp[L-2] + v[L-1])
    return new_dp

fn f(path: String) -> Int:
    var triangle = read_csv(path, ' ')
    var H = len(triangle)
    var dp = List[Int](triangle[0][0])
    for i in range(1, H):
        dp = update_dp(dp, triangle[i])
    return max_list(dp)

fn main():
    var args = sys.argv()
    var path = args[1]
    print(f(path))