MojoでProject Euler 15

https://projecteuler.net/problem=15

Combinationの計算をすればよいですが、あえてDPで計算しています。Matrix構造体を1次元ベクトルで表現しています。

import sys


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

struct Matrix:
    var H: Int
    var W: Int
    var A: DynamicVector[Int]
    
    fn __init__(inout self, H: Int, W: Int):
        self.H = H
        self.W = W
        self.A = DynamicVector[Int]()
        self.A.resize(H*W, 0)
    
    fn __getitem__(self, i: Int, j: Int) -> Int:
        return self.A[i*self.W+j]
    
    fn __setitem__(inout self, i: Int, j: Int, e: Int):
        self.A[i*self.W+j] = e


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

fn f(H: Int, W: Int) -> Int:
    var dp = Matrix(H+1, W+1)
    dp[0, 0] = 1
    for x in range(H+1):
        for y in range(W+1):
            if x >= 1:
                dp[x, y] += dp[x-1, y]
            if y >= 1:
                dp[x, y] += dp[x, y-1]
    return dp[H, W]

fn main() raises:
    let args = sys.argv()
    let H = atol(args[1])
    let W = atol(args[2])
    print(f(H, W))