MojoでProject Euler 24

https://projecteuler.net/problem=24

例題で、
["0", "1", "2"]
という配列を用意します。
5番目の順列を決めるのに、
4/2!=2なので、
"2"が頭になります。これを配列から除去して、["0", "1"]となります。
余りが0だったので、0/1!=0で、"0"を取り出します。["1"]となります。
余りが0だったので、0/0!=0で、"1"を取り出します。
合わせて、"201"となります。
DynamicVectorにはPythonのようなpopも無いんですね。

import sys

fn factorial(n: Int) -> Int:
    return 1 if n == 0 else n * factorial(n-1)

fn pop(inout v: DynamicVector[String], i: Int) -> String:
    var w = DynamicVector[String]()
    for j in range(v.size-1, i, -1):
        var e = v.pop_back()
        w.push_back(e)
    var ret = v.pop_back()
    while w.size > 0:
        var e = w.pop_back()
        v.push_back(e)
    return ret

fn g(n: Int, inout ds: DynamicVector[String]) -> String:
    if ds.size == 0:
        return ""
    
    var m = factorial(ds.size-1)
    var q = n // m
    var r = n % m
    var s = pop(ds, q)
    return s + g(r, ds)

fn f(N: Int) -> String:
    var ds = DynamicVector[String]()
    for d in range(10):
        ds.push_back(str(d))
    return g(N-1, ds)

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