[WIP] Solution to problem 10 part 2! in Python

This commit is contained in:
David Doblas Jiménez 2022-05-22 20:27:43 +02:00
parent a78c6e8bab
commit 12c4debb31

195
src/Year_2018/P10.py Normal file
View File

@ -0,0 +1,195 @@
# --- Day 10: The Stars Align ---
# It's no use; your navigation system simply isn't capable of providing walking
# directions in the arctic circle, and certainly not in 1018.
# The Elves suggest an alternative. In times like these, North Pole rescue
# operations will arrange points of light in the sky to guide missing Elves
# back to base. Unfortunately, the message is easy to miss: the points move
# slowly enough that it takes hours to align them, but have so much momentum
# that they only stay aligned for a second. If you blink at the wrong time, it
# might be hours before another message appears.
# You can see these points of light floating in the distance, and record their
# position in the sky and their velocity, the relative change in position per
# second (your puzzle input). The coordinates are all given from your
# perspective; given enough time, those positions and velocities will move the
# points into a cohesive message!
# Rather than wait, you decide to fast-forward the process and calculate what
# the points will eventually spell.
# For example, suppose you note the following points:
# position=< 9, 1> velocity=< 0, 2>
# position=< 7, 0> velocity=<-1, 0>
# position=< 3, -2> velocity=<-1, 1>
# position=< 6, 10> velocity=<-2, -1>
# position=< 2, -4> velocity=< 2, 2>
# position=<-6, 10> velocity=< 2, -2>
# position=< 1, 8> velocity=< 1, -1>
# position=< 1, 7> velocity=< 1, 0>
# position=<-3, 11> velocity=< 1, -2>
# position=< 7, 6> velocity=<-1, -1>
# position=<-2, 3> velocity=< 1, 0>
# position=<-4, 3> velocity=< 2, 0>
# position=<10, -3> velocity=<-1, 1>
# position=< 5, 11> velocity=< 1, -2>
# position=< 4, 7> velocity=< 0, -1>
# position=< 8, -2> velocity=< 0, 1>
# position=<15, 0> velocity=<-2, 0>
# position=< 1, 6> velocity=< 1, 0>
# position=< 8, 9> velocity=< 0, -1>
# position=< 3, 3> velocity=<-1, 1>
# position=< 0, 5> velocity=< 0, -1>
# position=<-2, 2> velocity=< 2, 0>
# position=< 5, -2> velocity=< 1, 2>
# position=< 1, 4> velocity=< 2, 1>
# position=<-2, 7> velocity=< 2, -2>
# position=< 3, 6> velocity=<-1, -1>
# position=< 5, 0> velocity=< 1, 0>
# position=<-6, 0> velocity=< 2, 0>
# position=< 5, 9> velocity=< 1, -2>
# position=<14, 7> velocity=<-2, 0>
# position=<-3, 6> velocity=< 2, -1>
# Each line represents one point. Positions are given as <X, Y> pairs: X
# represents how far left (negative) or right (positive) the point appears,
# while Y represents how far up (negative) or down (positive) the point
# appears.
# At 0 seconds, each point has the position given. Each second, each point's
# velocity is added to its position. So, a point with velocity <1, -2> is
# moving to the right, but is moving upward twice as quickly. If this point's
# initial position were <3, 9>, after 3 seconds, its position would become
# <6, 3>.
# Over time, the points listed above would move like this:
# Initially:
# ........#.............
# ................#.....
# .........#.#..#.......
# ......................
# #..........#.#.......#
# ...............#......
# ....#.................
# ..#.#....#............
# .......#..............
# ......#...............
# ...#...#.#...#........
# ....#..#..#.........#.
# .......#..............
# ...........#..#.......
# #...........#.........
# ...#.......#..........
# After 1 second:
# ......................
# ......................
# ..........#....#......
# ........#.....#.......
# ..#.........#......#..
# ......................
# ......#...............
# ....##.........#......
# ......#.#.............
# .....##.##..#.........
# ........#.#...........
# ........#...#.....#...
# ..#...........#.......
# ....#.....#.#.........
# ......................
# ......................
# After 2 seconds:
# ......................
# ......................
# ......................
# ..............#.......
# ....#..#...####..#....
# ......................
# ........#....#........
# ......#.#.............
# .......#...#..........
# .......#..#..#.#......
# ....#....#.#..........
# .....#...#...##.#.....
# ........#.............
# ......................
# ......................
# ......................
# After 3 seconds:
# ......................
# ......................
# ......................
# ......................
# ......#...#..###......
# ......#...#...#.......
# ......#...#...#.......
# ......#####...#.......
# ......#...#...#.......
# ......#...#...#.......
# ......#...#...#.......
# ......#...#..###......
# ......................
# ......................
# ......................
# ......................
# After 4 seconds:
# ......................
# ......................
# ......................
# ............#.........
# ........##...#.#......
# ......#.....#..#......
# .....#..##.##.#.......
# .......##.#....#......
# ...........#....#.....
# ..............#.......
# ....#......#...#......
# .....#.....##.........
# ...............#......
# ...............#......
# ......................
# ......................
# After 3 seconds, the message appeared briefly: HI. Of course, your message
# will be much longer and will take many more seconds to appear.
# What message will eventually appear in the sky?
import re
from operator import itemgetter
import numpy as np
with open("files/P10.txt") as f:
points = [tuple(map(int, re.findall(r"-?\d+", i))) for i in f]
points_arr = np.array(points)
def is_complete_row(line):
"""Assumming that a line will have, at least, 10 points in the same row"""
return len(set(np.array(sorted(line, key=itemgetter(0)))[:10, 0])) == 1
def find_time(arr):
# get position and velocity arrays
pos = arr[:, :2]
vel = arr[:, 2:]
found = False
cnt = 0
while not found:
pos += vel
cnt += 1
if is_complete_row(pos):
found = True
return cnt
message_time = find_time(points_arr)