Avent of Code - Day 14 - Regolith Reservoir
Tags: adventofcode, python, 2022, day14
Published: 2022-12-14 21:28:18

[Advent of Code](https://adventofcode.com/) 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](https://cdn.steemitimages.com/DQmc8dZSDwhvjLMBgHipZX15CFjcgpkg4d7chSBrZH7jgi3/image.png)


### Q1
```python
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
```python
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](https://helloacm.com/teaching-kids-programming-greedy-simulation-algorithm-to-validate-stack-sequences/) - 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)

<hr/>

### [Steem](https://steemyy.com) to the Moon!