Avent of Code - Day 14 - Regolith Reservoir

in adventofcode •  2 years ago 

Advent of Code occurs at Dec 01 to 25 where each day, you will need to solve a puzzle. It is Festival and the problem statement is mostly related to Christmas.

Day 14 - Regolith Reservoir

https://adventofcode.com/2022/day/14

image.png

Q1

import sys
from collections import defaultdict, deque
from math import inf

file1 = open(sys.argv[1], "r")

grid = defaultdict(lambda: ".")
sand = (500, 0)
minx = sand[0]
maxx = sand[0]
miny = sand[1]
maxy = sand[1]

while True:
    line = file1.readline()
    if not line:
        break
    line = line.strip()
    arr = line.split("->")
    prev = None
    for s in arr:
        a, b = map(int, s.split(","))
        minx = min(minx, a)
        maxx = max(maxx, a)
        miny = min(miny, b)
        maxy = max(maxy, b)
        grid[(a, b)] = "#"
        if prev:
            if a == prev[0]:
                for x in range(min(b, prev[1]), max(b, prev[1]) + 1):
                    grid[(a, x)] = "#"
            elif b == prev[1]:
                for x in range(min(a, prev[0]), max(a, prev[0]) + 1):
                    grid[(x, b)] = "#"
        prev = (a, b)

ans = 0

print(minx, maxx, miny, maxy)
while True:
    x, y = sand
    settled = False
    while minx <= x <= maxx and miny <= y <= maxy:
        if grid[(x, y + 1)] == ".":
            y += 1
        elif grid[(x + 1, y + 1)] == "#" and grid[(x - 1, y + 1)] == "#":
            grid[(x, y)]= "#"
            ans += 1
            settled = True
            break
        elif grid[(x - 1, y + 1)] == ".":
            y += 1
            x -= 1
        else:
            y += 1
            x += 1
    if not settled:
        break

print(ans)

Q2

import sys
from collections import defaultdict, deque
from math import inf

file1 = open(sys.argv[1], "r")

grid = defaultdict(lambda: ".")
sand = (500, 0)
minx = sand[0]
maxx = sand[0]
miny = sand[1]
maxy = sand[1]

while True:
    line = file1.readline()
    if not line:
        break
    line = line.strip()
    arr = line.split("->")
    prev = None
    for s in arr:
        a, b = map(int, s.split(","))
        minx = min(minx, a)
        maxx = max(maxx, a)
        miny = min(miny, b)
        maxy = max(maxy, b)
        grid[(a, b)] = "#"
        if prev:
            if a == prev[0]:
                for x in range(min(b, prev[1]), max(b, prev[1]) + 1):
                    grid[(a, x)] = "#"
            elif b == prev[1]:
                for x in range(min(a, prev[0]), max(a, prev[0]) + 1):
                    grid[(x, b)] = "#"
        prev = (a, b)

ans = 0
ground_level = maxy + 2

while grid[sand] != "#":
    x, y = sand
    while True:
        if y + 1 == ground_level:
            grid[(x, y)] = "#"
            ans += 1
            break
        if grid[(x, y + 1)] == ".":
            y += 1
        elif grid[(x + 1, y + 1)] == "#" and grid[(x - 1, y + 1)] == "#":
            grid[(x, y)]= "#"
            ans += 1
            break
        elif grid[(x - 1, y + 1)] == ".":
            y += 1
            x -= 1
        else:
            y += 1
            x += 1

print(ans)

This is just a simulation algorithm - follow the instructions. Since the ground is unlimited - we can use the hash map and the keys are the tuples of coordinates (x and y)


Steem to the Moon!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE BLURT!