MojoでProject Euler 62

https://projecteuler.net/problem=62

数字をソートして同じ数になるものを集めます。ただし、昇順だと0があると桁数がわからなくなるので、降順にソートして整数に直します。

import sys


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

fn digits(owned n: Int) -> List[Int]:
    var ds = List[Int]()
    while n > 0:
        var d = n % 10
        ds.append(d)
        n //= 10
    return ds


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

# 数字を降順に並べて再び整数化する
fn encode(n: Int) -> Int:
    var ds = digits(n)
    sort(ds)
    var s = 0
    for i in range(len(ds)-1, -1, -1):
        s = s * 10 + ds[i]
    return s

fn f(N: Int) raises -> Int:
    var dic = Dict[Int, List[Int]]()
    var n = 1
    while True:
        var c = n**3
        var s = encode(c)
        if s in dic:
            dic[s].append(c)
        else:
            dic[s] = List[Int](c)
        if len(dic[s]) == N:
            return dic[s][0]
        n += 1

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