MojoでProject Euler 96

https://projecteuler.net/problem=96

しらみつぶしするだけですね。

import sys


#################### Table ####################

alias Table = List[List[Int]]

fn read_tables(path: String) -> List[Table]:
    try:
        var tables = List[Table]()
        with open(path, "r") as f:
            var whole = f.read()
            var lines = whole.split('\n')
            for i in range(50):
                var table = Table()
                for j in range(9):
                    var line = lines[i*10+j+1]
                    var v = List[Int]()
                    for k in range(9):
                        v.append(atol(line[k]))
                    table.append(v)
                tables.append(table)
        return tables
    except:
        return List[Table]()


#################### process ####################

fn is_valid(d: Int, x: Int, y: Int, table: Table) -> Bool:
    for y1 in range(9):
        if table[x][y1] == d:
            return False
    
    for x2 in range(9):
        if table[x2][y] == d:
            return False
    
    var x0 = x // 3 * 3
    var y0 = y // 3 * 3
    for x3 in range(x0, x0 + 3):
        for y3 in range(y0, y0 + 3):
            if table[x3][y3] == d:
                return False
    
    return True

fn fill(z: Int, inout table: Table) -> Bool:
    if z == 81:
        return True
    
    var x = z // 9
    var y = z % 9
    if table[x][y] != 0:
        return fill(z + 1, table)
    else:
        for d in range(1, 10):
            if is_valid(d, x, y, table):
                table[x][y] = d
                if fill(z + 1, table):
                    return True
                table[x][y] = 0
    return False

fn f_each(inout table: Table) -> Int:
    _ = fill(0, table)
    return table[0][0] * 100 + table[0][1] * 10 + table[0][2]

fn f(path: String) -> Int:
    var tables = read_tables(path)
    var s = 0
    for table in tables:
        s += f_each(table[])
    return s

fn main():
    var path = String("p096_sudoku.txt")
    print(f(path))