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