Spaces:
Running
Running
| def parse_input(file_path): | |
| robots = [] | |
| with open(file_path, 'r') as f: | |
| for line in f: | |
| p, v = line.strip().split() | |
| px, py = map(int, p[2:].split(',')) | |
| vx, vy = map(int, v[2:].split(',')) | |
| robots.append((px, py, vx, vy)) | |
| return robots | |
| def update_position(x, y, vx, vy, width, height): | |
| x = (x + vx) % width | |
| y = (y + vy) % height | |
| return x, y | |
| def count_robots_in_quadrants(positions, width, height): | |
| mid_x = width // 2 | |
| mid_y = height // 2 | |
| quadrants = [0] * 4 # TL, TR, BL, BR | |
| for x, y in positions: | |
| if x == mid_x or y == mid_y: | |
| continue | |
| if x < mid_x: | |
| if y < mid_y: | |
| quadrants[0] += 1 # Top-left | |
| else: | |
| quadrants[2] += 1 # Bottom-left | |
| else: | |
| if y < mid_y: | |
| quadrants[1] += 1 # Top-right | |
| else: | |
| quadrants[3] += 1 # Bottom-right | |
| return quadrants | |
| def is_christmas_tree(positions, width, height): | |
| # Create a grid representation | |
| grid = [[0] * width for _ in range(height)] | |
| for x, y in positions: | |
| grid[y][x] += 1 | |
| # Check for basic Christmas tree pattern | |
| # This is a simplified check - adjust pattern as needed | |
| tree_pattern = False | |
| center_x = width // 2 | |
| # Check for triangular shape with a trunk | |
| tree_points = 0 | |
| trunk_points = 0 | |
| for y in range(height): | |
| row_count = sum(1 for x in range(width) if grid[y][x] > 0) | |
| if row_count > 0: | |
| if row_count == 1 and grid[y][center_x] > 0: | |
| trunk_points += 1 | |
| elif row_count > 1: | |
| tree_points += 1 | |
| return tree_points >= 5 and trunk_points >= 2 | |
| def solve_part1(robots, width=101, height=103): | |
| positions = set() | |
| for px, py, vx, vy in robots: | |
| x, y = px, py | |
| for _ in range(100): | |
| x, y = update_position(x, y, vx, vy, width, height) | |
| positions.add((x, y)) | |
| quadrants = count_robots_in_quadrants(positions, width, height) | |
| return str(quadrants[0] * quadrants[1] * quadrants[2] * quadrants[3]) | |
| def solve_part2(robots, width=101, height=103, max_seconds=10000): | |
| for second in range(max_seconds): | |
| positions = set() | |
| for px, py, vx, vy in robots: | |
| x, y = px, py | |
| for _ in range(second): | |
| x, y = update_position(x, y, vx, vy, width, height) | |
| positions.add((x, y)) | |
| if is_christmas_tree(positions, width, height): | |
| return str(second) | |
| return "Pattern not found" | |
| # Read and solve | |
| robots = parse_input("./input.txt") | |
| # Part 1 | |
| print(solve_part1(robots)) | |
| # Part 2 | |
| print(solve_part2(robots)) |