MojoでProject Euler 81

https://projecteuler.net/problem=81

ループがない有向グラフなので、DPを使えばよいです。

import sys


#################### Matrix ####################

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

trait Printable(CollectionElement, Stringable):
    pass

fn print_matrix[T: Printable](mat: List[List[T]]):
    var s = String('[\n')
    for v in mat:
        s += ' [' + str(v[][0])
        for i in range(1, len(v[])):
            s += ', ' + str(v[][i])
        s += ']\n'
    s += '\n]'
    print(s)

fn initialize_matrix[T: CollectionElement](a: T,
                                    H: Int, W: Int) -> List[List[T]]:
    var matrix = List[List[T]]()
    for _ in range(H):
        var v = List[T]()
        for _ in range(W):
            v.append(a)
        matrix.append(v)
    return matrix


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

fn f(path: String) -> Int:
    var mat = read_matrix(path)
    var H = len(mat)
    var W = len(mat[0])
    var dp = initialize_matrix(10**18, H+1, W+1)
    dp[0][1] = 0
    dp[1][0] = 0
    for i in range(1, H+1):
        for j in range(1, W+1):
            dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + mat[i-1][j-1]
    return dp[H][W]

fn main() raises:
    var path = String("0081_matrix.txt")
    print(f(path))