https://projecteuler.net/problem=17
Mojoには、
let v = ["one", "two", ...]
みたいなのがあるにはあるんですが、これはListLiteralといって、要素にアクセスするにはタプルと同じように、
print(v.get[1, StringLiteral]())
コンパイル時にインデックスを指定しなければならないので、使えないです。
分岐するよりはましなので、push_backを使っています。
import sys #################### process #################### var v1 = DynamicVector[StringLiteral]() var v2 = DynamicVector[StringLiteral]() var v3 = DynamicVector[StringLiteral]() fn push_to_v1(): v1.push_back("one") v1.push_back("two") v1.push_back("three") v1.push_back("four") v1.push_back("five") v1.push_back("six") v1.push_back("seven") v1.push_back("eight") v1.push_back("nine") v1.push_back("ten") fn push_to_v2(): v2.push_back("eleven") v2.push_back("twelve") v2.push_back("thirteen") v2.push_back("fourteen") v2.push_back("fifteen") v2.push_back("sixteen") v2.push_back("seventeen") v2.push_back("eighteen") v2.push_back("nineteen") fn push_to_v3(): v3.push_back("twenty") v3.push_back("thirty") v3.push_back("forty") v3.push_back("fifty") v3.push_back("sixty") v3.push_back("seventy") v3.push_back("eighty") v3.push_back("ninety") fn string_length(n: Int) -> Int: if n == 0: return 0 elif n <= 10: return len(v1[n-1]) elif n < 20: return len(v2[n-11]) elif n < 100: let q = n // 10 let r = n % 10 return len(v3[q-2]) + string_length(r) elif n < 1000: let q = n // 100 let r = n % 100 let s100 = string_length(q) + len("hundred") if r == 0: return s100 else: return s100 + len("and") + string_length(r) elif n < 10000: let q = n // 1000 let r = n % 1000 return string_length(q) + len("thousand") + string_length(r) else: return 0 fn f(N: Int) -> Int: var s = 0 for n in range(1, N+1): s += string_length(n) return s fn main() raises: push_to_v1() push_to_v2() push_to_v3() let args = sys.argv() let N = atol(args[1]) print(f(N))