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