day 13 cleanup
parent
4000af8bf3
commit
1c7035d433
36
day13/sol.py
36
day13/sol.py
|
@ -22,10 +22,14 @@ import numpy
|
||||||
def solve(file):
|
def solve(file):
|
||||||
total = 0
|
total = 0
|
||||||
total2 = 0
|
total2 = 0
|
||||||
for record in parse(file):
|
records = list(parse(file))
|
||||||
|
for record in records:
|
||||||
#print(record)
|
#print(record)
|
||||||
ax, ay, bx, by, px, py = record
|
ax, ay, bx, by, px, py = record
|
||||||
|
|
||||||
|
# Part 1
|
||||||
|
|
||||||
|
# Solve the linear equation:
|
||||||
# k_a ax + k_b * bx = px
|
# k_a ax + k_b * bx = px
|
||||||
# k_a ay + k_b * by = py
|
# k_a ay + k_b * by = py
|
||||||
|
|
||||||
|
@ -38,34 +42,50 @@ def solve(file):
|
||||||
print("yes", k1, k2)
|
print("yes", k1, k2)
|
||||||
total += 3*k1 + k2
|
total += 3*k1 + k2
|
||||||
|
|
||||||
|
for record in records:
|
||||||
|
ax, ay, bx, by, px, py = record
|
||||||
|
|
||||||
m00 = ax
|
# Part 2
|
||||||
m01 = bx
|
#
|
||||||
m10 = ay
|
# Can't use numpy because the values are too large for floats
|
||||||
m11 = by
|
# So here's an ad-hoc solver
|
||||||
v1 = px+ 10000000000000
|
|
||||||
v2 = py+ 10000000000000
|
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)
|
c = F(m10,m00)
|
||||||
m10 -= c*m00
|
m10 -= c*m00
|
||||||
m11 -= c*m01
|
m11 -= c*m01
|
||||||
v2 -= c*v1
|
v2 -= c*v1
|
||||||
|
|
||||||
|
# scale eq2
|
||||||
c = F(1,m11)
|
c = F(1,m11)
|
||||||
v2 *= c
|
v2 *= c
|
||||||
m11 *= c
|
m11 *= c
|
||||||
|
|
||||||
|
# subtract c*eq2 from eq1 to cancel second coefficient
|
||||||
c = F(m01,m11)
|
c = F(m01,m11)
|
||||||
m01 -= c*m11
|
m01 -= c*m11
|
||||||
v1 -= c*v2
|
v1 -= c*v2
|
||||||
|
|
||||||
|
# scale eq1
|
||||||
c = F(1,m00)
|
c = F(1,m00)
|
||||||
v1 *= c
|
v1 *= c
|
||||||
m00 *= c
|
m00 *= c
|
||||||
|
|
||||||
|
# we now have
|
||||||
|
# 1*k_a + 0 = v1
|
||||||
|
# 0 + 1*k_b = v2
|
||||||
|
|
||||||
print(m00, m01, m10, m11, v1, v2)
|
print(m00, m01, m10, m11, v1, v2)
|
||||||
if v1.denominator == 1 and v2.denominator == 1 and v1 > 0 and v2 > 0:
|
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:
|
if v1*ax + v2*bx == px and v1*ay + v2*by == py:
|
||||||
print("yes2", v1, v2)
|
print("yes2", v1, v2)
|
||||||
total2 += 3*v1 + v2
|
total2 += 3*v1 + v2
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue