day 13 actually numpy is fine
This commit is contained in:
		
							parent
							
								
									1c7035d433
								
							
						
					
					
						commit
						7cc13becde
					
				
							
								
								
									
										57
									
								
								day13/sol.py
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								day13/sol.py
									
									
									
									
									
								
							| @ -35,60 +35,27 @@ def solve(file): | |||||||
| 
 | 
 | ||||||
|         M = numpy.array([[ax, bx], [ay, by]]) |         M = numpy.array([[ax, bx], [ay, by]]) | ||||||
|         V = numpy.array([px, py]) |         V = numpy.array([px, py]) | ||||||
|  | 
 | ||||||
|         sol = numpy.linalg.solve(M,V) |         sol = numpy.linalg.solve(M,V) | ||||||
|         k1 = int(round(sol[0])) |         k1 = int(round(sol[0])) | ||||||
|         k2 = int(round(sol[1])) |         k2 = int(round(sol[1])) | ||||||
|  | 
 | ||||||
|         if k1*ax + k2*bx == px and k1*ay + k2*by == py: |         if k1*ax + k2*bx == px and k1*ay + k2*by == py: | ||||||
|             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 |  | ||||||
| 
 |  | ||||||
|         # Part 2 |         # Part 2 | ||||||
|         # |         qx = px + 10000000000000 | ||||||
|         # Can't use numpy because the values are too large for floats |         qy = py + 10000000000000 | ||||||
|         # So here's an ad-hoc solver |  | ||||||
| 
 | 
 | ||||||
|         px += 10000000000000 |         V2 = numpy.array([qx, qy]) | ||||||
|         py += 10000000000000 |         sol = numpy.linalg.solve(M,V2) | ||||||
| 
 |         k1 = int(round(sol[0])) | ||||||
|         m00, m01 = ax, bx |         k2 = int(round(sol[1])) | ||||||
|         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 |  | ||||||
| 
 | 
 | ||||||
|  |         if k1*ax + k2*bx == qx and k1*ay + k2*by == qy: | ||||||
|  |             #print("yes2", k1, k2) | ||||||
|  |             total2 += 3*k1 + k2 | ||||||
| 
 | 
 | ||||||
|     print(total) |     print(total) | ||||||
|     print(total2) |     print(total2) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user