|
|
|
@@ -0,0 +1,72 @@ |
|
|
|
""" Advent of Code |
|
|
|
|
|
|
|
December 3, puzzle A |
|
|
|
""" |
|
|
|
|
|
|
|
import re |
|
|
|
|
|
|
|
def main(lines): |
|
|
|
""" Find the number of overlapped cells in an NxN square. |
|
|
|
|
|
|
|
Given a list of claims in the format |
|
|
|
#123 @ 4,5: 6x7 |
|
|
|
where the first number is the claim number, the second number |
|
|
|
group is the x, y coordinates of the upper left corner, and |
|
|
|
the third number group is the x, y size of the rectanglular claim, |
|
|
|
find the number of cells in the square that have more than one |
|
|
|
claim attached to them. |
|
|
|
|
|
|
|
The first task is to find out how big the total square is! |
|
|
|
This will also verify that the regular expression works. |
|
|
|
Result: This cloth is exactly 1000 inches to a side. |
|
|
|
|
|
|
|
So: Generate a 1000x1000 table, one value for each cell. |
|
|
|
For each claim: |
|
|
|
* If the cell is unoccupied, mark with "c" |
|
|
|
* If the cell is occupied, mark with "X" |
|
|
|
Then iterate through the table and count the number of Xes. |
|
|
|
""" |
|
|
|
|
|
|
|
# grp 1 grp 2 grp 3 grp 4 grp 5 |
|
|
|
pattern = re.compile("#([0-9]+) @ ([0-9]+),([0-9]+): ([0-9]+)x([0-9]+)") |
|
|
|
# maxsize, claim = 0, 0 # only need this for determining cloth size |
|
|
|
# Generate a 1000x1000 list of empty ("") cells using list comprehensions |
|
|
|
fabric = [["" for y in range(1000)] for x in range(1000)] # fabric[y][x] (it's backwards!) |
|
|
|
|
|
|
|
for line in lines: |
|
|
|
m = pattern.match(line) |
|
|
|
# because xleft and ytop are "distance from the edge", they're zero-indexed |
|
|
|
xleft, ytop, xwidth, yheight = int(m.group(2)), int(m.group(3)), int(m.group(4)), int(m.group(5)) |
|
|
|
xright = xleft + xwidth |
|
|
|
ybottom = ytop + yheight |
|
|
|
for j in range(ytop, ybottom): # ranges include the first value but not the second |
|
|
|
for i in range(xleft, xright): |
|
|
|
if fabric[j][i] == "": # if the cell is unclaimed |
|
|
|
fabric[j][i] = "c" # claim it |
|
|
|
else: # otherwise |
|
|
|
fabric[j][i] = "X" # mark it X so we know it's contested |
|
|
|
|
|
|
|
# a helper function, isX, will return 1 if a cell is "X" and 0 if it's not. |
|
|
|
contested = sum([sum([isX(cell) for cell in line]) for line in fabric]) |
|
|
|
print("There are {} contested cells.".format(contested)) |
|
|
|
|
|
|
|
# Commenting out the "find the size of the cloth" code, but leaving it in for historical purposes |
|
|
|
# if xright > maxsize: |
|
|
|
# maxsize = xright |
|
|
|
# claim = int(m.group(1)) |
|
|
|
# if ybottom > maxsize: |
|
|
|
# maxsize = ybottom |
|
|
|
# claim = int(m.group(1)) |
|
|
|
# print("Cloth is {} inches square, thanks to claim {}".format(maxsize, claim)) |
|
|
|
|
|
|
|
def isX(cell): |
|
|
|
""" Returns 1 if the cell passed in contains "X", 0 otherwise. |
|
|
|
""" |
|
|
|
return 1 if cell == "X" else 0 |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
lines = [] |
|
|
|
with open("03in.txt","r") as f: |
|
|
|
for line in f: |
|
|
|
lines.append(line.strip()) |
|
|
|
main(lines) |