2023 day 6.
This commit is contained in:
		
							
								
								
									
										49
									
								
								2023/day6.py
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								2023/day6.py
									
									
									
									
									
								
							| @@ -1,13 +1,54 @@ | ||||
| import operator | ||||
| import sys | ||||
| from collections import defaultdict | ||||
| from dataclasses import dataclass | ||||
| from functools import reduce | ||||
|  | ||||
| lines = sys.stdin.read().splitlines() | ||||
|  | ||||
|  | ||||
| def extreme_times_to_beat(time: int, distance: int) -> tuple[int, int]: | ||||
|     import math | ||||
|  | ||||
|     # formula | ||||
|     # - distance = (T - t) * t | ||||
|     # - (T - t) * t >= D | ||||
|     # - T * t - t^2 - D >= 0 | ||||
|  | ||||
|     a = -1 | ||||
|     b = time | ||||
|     c = -distance | ||||
|  | ||||
|     d = b * b - 4 * a * c | ||||
|  | ||||
|     t1 = math.ceil(-(b - math.sqrt(d)) / (2 * a)) | ||||
|     t2 = math.floor(-(b + math.sqrt(d)) / (2 * a)) | ||||
|  | ||||
|     if (time - t1) * t1 == distance: | ||||
|         t1 += 1 | ||||
|  | ||||
|     if (time - t2) * t2 == distance: | ||||
|         t2 -= 1 | ||||
|  | ||||
|     return t1, t2 | ||||
|  | ||||
|  | ||||
| # part 1 | ||||
| answer_1 = ... | ||||
| times = list(map(int, lines[0].split()[1:])) | ||||
| distances = list(map(int, lines[1].split()[1:])) | ||||
| answer_1 = reduce( | ||||
|     operator.mul, | ||||
|     ( | ||||
|         t2 - t1 + 1 | ||||
|         for t1, t2 in ( | ||||
|             extreme_times_to_beat(time, distance) | ||||
|             for time, distance in zip(times, distances) | ||||
|         ) | ||||
|     ), | ||||
| ) | ||||
| print(f"answer 1 is {answer_1}") | ||||
|  | ||||
| # part 2 | ||||
| answer_2 = ... | ||||
| time = int(lines[0].split(":")[1].strip().replace(" ", "")) | ||||
| distance = int(lines[1].split(":")[1].strip().replace(" ", "")) | ||||
| t1, t2 = extreme_times_to_beat(time, distance) | ||||
| answer_2 = t2 - t1 + 1 | ||||
| print(f"answer 2 is {answer_2}") | ||||
|   | ||||
| @@ -0,0 +1,2 @@ | ||||
| Time:        59     79     65     75 | ||||
| Distance:   597   1234   1032   1328 | ||||
|   | ||||
| @@ -0,0 +1,2 @@ | ||||
| Time:      7  15   30 | ||||
| Distance:  9  40  200 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user