以下の内容はhttps://inamori.hateblo.jp/entry/2025/01/10/183603より取得しました。


MojoでProject Euler 89

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



以上の内容はhttps://inamori.hateblo.jp/entry/2025/01/10/183603より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14