https://projecteuler.net/problem=89
Stringは__getitem__で1文字を取れるんですね。
from math import sqrt import sys #################### process #################### fn read_romans(path: String) -> List[String]: var romans = List[String]() try: with open(path, "r") as f: var whole = f.read() var lines = whole.split('\n') for line in lines: if line[] == '': break romans.append(line[]) except: pass return romans fn Roman_to_number(roman: String) -> Int: var Roman = String("IVXLCDM") var v = List[Int]() for i in range(len(roman)): var p = Roman.find(roman[i]) if p % 2 == 0: v.append(10**(p//2)) else: v.append(5*10**(p//2)) var w = List[Int]() var prev = 0 for n in v: if n[] == prev: w[len(w)-1] += n[] else: w.append(n[]) prev = n[] var s = 0 for i in range(len(w)): if i < len(w) - 1 and w[i] < w[i+1]: s -= w[i] else: s += w[i] return s fn number_to_Roman(owned n: Int) -> String: var Roman = String("IVXLCDM") var s = String() var i = 0 for i in range(0, 6, 2): var d = n % 10 n //= 10 if d < 4: s = Roman[i] * d + s elif d < 5: s = Roman[i+1] + Roman[i] * (5 - d) + s elif d < 9: s = Roman[i+1] + Roman[i] * (d - 5) + s else: s = Roman[i] * (10 - d) + Roman[i+2] + s if n == 0: break else: s = Roman[6] * n + s return s fn f(path: String) -> Int: var romans = read_romans(path) var s = 0 for roman in romans: var n = Roman_to_number(roman[]) var normalized_roman = number_to_Roman(n) print(roman[], n, normalized_roman) s += len(roman[]) - len(normalized_roman) return s fn main() raises: var path = String("0089_roman.txt") print(f(path))