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))