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