[WIP] Solution to problem 10 part 2! in Python
This commit is contained in:
parent
a78c6e8bab
commit
12c4debb31
195
src/Year_2018/P10.py
Normal file
195
src/Year_2018/P10.py
Normal 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)
|
Loading…
x
Reference in New Issue
Block a user