Solution to problem 13 in Python
This commit is contained in:
parent
02c2ac36b1
commit
867ab20520
184
src/Year_2021/P13.py
Normal file
184
src/Year_2021/P13.py
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
# --- Day 13: Transparent Origami ---
|
||||||
|
|
||||||
|
# You reach another volcanically active part of the cave. It would be nice if
|
||||||
|
# you could do some kind of thermal imaging so you could tell ahead of time
|
||||||
|
# which caves are too hot to safely enter.
|
||||||
|
|
||||||
|
# Fortunately, the submarine seems to be equipped with a thermal camera! When
|
||||||
|
# you activate it, you are greeted with:
|
||||||
|
|
||||||
|
# Congratulations on your purchase! To activate this infrared thermal imaging
|
||||||
|
# camera system, please enter the code found on page 1 of the manual.
|
||||||
|
|
||||||
|
# Apparently, the Elves have never used this feature. To your surprise, you
|
||||||
|
# manage to find the manual; as you go to open it, page 1 falls out. It's a
|
||||||
|
# large sheet of transparent paper! The transparent paper is marked with random
|
||||||
|
# dots and includes instructions on how to fold it up (your puzzle input).
|
||||||
|
# For example:
|
||||||
|
|
||||||
|
# 6,10
|
||||||
|
# 0,14
|
||||||
|
# 9,10
|
||||||
|
# 0,3
|
||||||
|
# 10,4
|
||||||
|
# 4,11
|
||||||
|
# 6,0
|
||||||
|
# 6,12
|
||||||
|
# 4,1
|
||||||
|
# 0,13
|
||||||
|
# 10,12
|
||||||
|
# 3,4
|
||||||
|
# 3,0
|
||||||
|
# 8,4
|
||||||
|
# 1,10
|
||||||
|
# 2,14
|
||||||
|
# 8,10
|
||||||
|
# 9,0
|
||||||
|
|
||||||
|
# fold along y=7
|
||||||
|
# fold along x=5
|
||||||
|
|
||||||
|
# The first section is a list of dots on the transparent paper. 0,0 represents
|
||||||
|
# the top-left coordinate. The first value, x, increases to the right. The
|
||||||
|
# second value, y, increases downward. So, the coordinate 3,0 is to the right
|
||||||
|
# of 0,0, and the coordinate 0,7 is below 0,0. The coordinates in this example
|
||||||
|
# form the following pattern, where # is a dot on the paper and . is an empty,
|
||||||
|
# unmarked position:
|
||||||
|
|
||||||
|
# ...#..#..#.
|
||||||
|
# ....#......
|
||||||
|
# ...........
|
||||||
|
# #..........
|
||||||
|
# ...#....#.#
|
||||||
|
# ...........
|
||||||
|
# ...........
|
||||||
|
# ...........
|
||||||
|
# ...........
|
||||||
|
# ...........
|
||||||
|
# .#....#.##.
|
||||||
|
# ....#......
|
||||||
|
# ......#...#
|
||||||
|
# #..........
|
||||||
|
# #.#........
|
||||||
|
|
||||||
|
# Then, there is a list of fold instructions. Each instruction indicates a line
|
||||||
|
# on the transparent paper and wants you to fold the paper up (for horizontal
|
||||||
|
# y=... lines) or left (for vertical x=... lines). In this example, the first
|
||||||
|
# fold instruction is fold along y=7, which designates the line formed by all
|
||||||
|
# of the positions where y is 7 (marked here with -):
|
||||||
|
|
||||||
|
# ...#..#..#.
|
||||||
|
# ....#......
|
||||||
|
# ...........
|
||||||
|
# #..........
|
||||||
|
# ...#....#.#
|
||||||
|
# ...........
|
||||||
|
# ...........
|
||||||
|
# -----------
|
||||||
|
# ...........
|
||||||
|
# ...........
|
||||||
|
# .#....#.##.
|
||||||
|
# ....#......
|
||||||
|
# ......#...#
|
||||||
|
# #..........
|
||||||
|
# #.#........
|
||||||
|
|
||||||
|
# Because this is a horizontal line, fold the bottom half up. Some of the dots
|
||||||
|
# might end up overlapping after the fold is complete, but dots will never
|
||||||
|
# appear exactly on a fold line. The result of doing this fold looks like this:
|
||||||
|
|
||||||
|
# #.##..#..#.
|
||||||
|
# #...#......
|
||||||
|
# ......#...#
|
||||||
|
# #...#......
|
||||||
|
# .#.#..#.###
|
||||||
|
# ...........
|
||||||
|
# ...........
|
||||||
|
|
||||||
|
# Now, only 17 dots are visible.
|
||||||
|
|
||||||
|
# Notice, for example, the two dots in the bottom left corner before the
|
||||||
|
# transparent paper is folded; after the fold is complete, those dots appear in
|
||||||
|
# the top left corner (at 0,0 and 0,1). Because the paper is transparent, the
|
||||||
|
# dot just below them in the result (at 0,3) remains visible, as it can be seen
|
||||||
|
# through the transparent paper.
|
||||||
|
|
||||||
|
# Also notice that some dots can end up overlapping; in this case, the dots
|
||||||
|
# merge together and become a single dot.
|
||||||
|
|
||||||
|
# The second fold instruction is fold along x=5, which indicates this line:
|
||||||
|
|
||||||
|
# #.##.|#..#.
|
||||||
|
# #...#|.....
|
||||||
|
# .....|#...#
|
||||||
|
# #...#|.....
|
||||||
|
# .#.#.|#.###
|
||||||
|
# .....|.....
|
||||||
|
# .....|.....
|
||||||
|
|
||||||
|
# Because this is a vertical line, fold left:
|
||||||
|
|
||||||
|
# #####
|
||||||
|
# #...#
|
||||||
|
# #...#
|
||||||
|
# #...#
|
||||||
|
# #####
|
||||||
|
# .....
|
||||||
|
# .....
|
||||||
|
|
||||||
|
# The instructions made a square!
|
||||||
|
|
||||||
|
# The transparent paper is pretty big, so for now, focus on just completing the
|
||||||
|
# first fold. After the first fold in the example above, 17 dots are visible -
|
||||||
|
# dots that end up overlapping after the fold is completed count as a single
|
||||||
|
# dot.
|
||||||
|
|
||||||
|
# How many dots are visible after completing just the first fold instruction on
|
||||||
|
# your transparent paper?
|
||||||
|
|
||||||
|
from copy import copy
|
||||||
|
|
||||||
|
with open("files/P13.txt", "r") as f:
|
||||||
|
dots, folds = [line for line in f.read().strip().split("\n\n")]
|
||||||
|
|
||||||
|
_dots = {tuple(map(int, row.split(","))) for row in dots.split("\n")}
|
||||||
|
_folds = [(s[11] == "y", int(s[13:])) for s in folds.split("\n")]
|
||||||
|
|
||||||
|
|
||||||
|
def fold(dim, value, dots):
|
||||||
|
folded = {dot for dot in dots if dot[dim] < value}
|
||||||
|
for x, y in dots - folded:
|
||||||
|
folded.add((x, 2 * value - y) if dim else (2 * value - x, y))
|
||||||
|
return folded
|
||||||
|
|
||||||
|
|
||||||
|
def part_1():
|
||||||
|
ans = len(fold(*_folds[0], _dots))
|
||||||
|
print(f"There are {ans} dots visible after 1 fold")
|
||||||
|
|
||||||
|
|
||||||
|
# --- Part Two ---
|
||||||
|
|
||||||
|
# Finish folding the transparent paper according to the instructions. The
|
||||||
|
# manual says the code is always eight capital letters.
|
||||||
|
|
||||||
|
# What code do you use to activate the infrared thermal imaging camera system?
|
||||||
|
|
||||||
|
|
||||||
|
def part_2():
|
||||||
|
dots = copy(_dots)
|
||||||
|
for dim, value in _folds:
|
||||||
|
dots = fold(dim, value, dots)
|
||||||
|
|
||||||
|
maxX, maxY = map(max, zip(*dots))
|
||||||
|
|
||||||
|
print("The code is: \n")
|
||||||
|
for y in range(maxY + 1):
|
||||||
|
for x in range(maxX + 1):
|
||||||
|
print("X" if (x, y) in dots else " ", end="")
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
part_1()
|
||||||
|
part_2()
|
Loading…
Reference in New Issue
Block a user