def parse(file): while True: a = file.readline() if not a: break b = file.readline() pr = file.readline() blank = file.readline() ax, ay = parse_numbers(a) bx, by = parse_numbers(b) px, py = parse_numbers(pr) yield ax,ay, bx,by, px,py import re def parse_numbers(s): return [int(x) for x in re.findall(r"\d+", s)] from fractions import Fraction as F import numpy def solve(file): total = 0 total2 = 0 records = list(parse(file)) for record in records: #print(record) ax, ay, bx, by, px, py = record # Part 1 # Solve the linear equation: # k_a ax + k_b * bx = px # k_a ay + k_b * by = py M = numpy.array([[ax, bx], [ay, by]]) V = numpy.array([px, py]) sol = numpy.linalg.solve(M,V) k1 = int(round(sol[0])) k2 = int(round(sol[1])) if k1*ax + k2*bx == px and k1*ay + k2*by == py: print("yes", k1, k2) total += 3*k1 + k2 for record in records: ax, ay, bx, by, px, py = record # Part 2 # # Can't use numpy because the values are too large for floats # So here's an ad-hoc solver px += 10000000000000 py += 10000000000000 m00, m01 = ax, bx m10, m11 = ay, by v1 = px v2 = py # subtract c*eq1 from eq2 to cancel first coefficient c = F(m10,m00) m10 -= c*m00 m11 -= c*m01 v2 -= c*v1 # scale eq2 c = F(1,m11) v2 *= c m11 *= c # subtract c*eq2 from eq1 to cancel second coefficient c = F(m01,m11) m01 -= c*m11 v1 -= c*v2 # scale eq1 c = F(1,m00) v1 *= c m00 *= c # we now have # 1*k_a + 0 = v1 # 0 + 1*k_b = v2 print(m00, m01, m10, m11, v1, v2) if v1.denominator == 1 and v2.denominator == 1 and v1 > 0 and v2 > 0: if v1*ax + v2*bx == px and v1*ay + v2*by == py: print("yes2", v1, v2) total2 += 3*v1 + v2 print(total) print(total2) solve(open("sample1.in")) solve(open("input"))