MojoでProject Euler 22

https://projecteuler.net/problem=22

ファイルを読むのもまだめんどうなようです。1行ずつ読むメソッドも無いようです。今回の問題は最初から1行ですが。
DynamicVector[Int]はソートする関数が用意されているようですが、DynamicVector[String]は無いようです。仕方ないので実装しました。文字列の比較もできないので、それも実装しました。

from math import min
from random import random_ui64

fn less_than(s1: String, s2: String) -> Bool:
    for i in range(min(len(s1), len(s2))):
        if ord(s1[i]) != ord(s2[i]):
            return ord(s1[i]) < ord(s2[i])
    return len(s1) < len(s2)

fn sort(v: DynamicVector[String]) -> DynamicVector[String]:
    if v.size <= 1:
        return v
    else:
        var pivot_index = int(random_ui64(0, v.size-1))
        var pivot = v[pivot_index]
        var v1 = DynamicVector[String]()
        var v2 = DynamicVector[String]()
        for i in range(v.size):
            if i == pivot_index:
                pass
            elif less_than(v[i], pivot):
                v1.push_back(v[i])
            else:
                v2.push_back(v[i])
        
        var w1 = sort(v1)
        var w2 = sort(v2)
        w1.push_back(pivot)
        for s in w2:
            w1.push_back(s[])
        return w1

fn arrange(data: String) -> DynamicVector[String]:
    try:
        var v = data.split("\"")
        var w = DynamicVector[String]()
        for i in range(1, v.size, 2):
            w.push_back(v[i])
        return sort(w)
    except:
        return DynamicVector[String]()

fn score(s: String) -> Int:
    var sc = 0
    for c in s.as_bytes():
        sc += int(c[] - ord("A") + 1)
    return sc

fn sum_scores(data: String) -> Int:
    var v = arrange(data)
    var s = 0
    for i in range(v.size):
        s += (i + 1) * score(v[i])
    return s

fn f(path: String) -> Int:
    try:
        with open(path, "r") as f:
            var data = f.read()
            return sum_scores(data)
    except:
        return 0

fn main():
    print(f("0022_names.txt"))