# Advent of Code 2021 | Day 5 | Solutions in Python3

Here are the solutions for today’s Advent of Code 2021, Day 5 answers in Python3.

## Logic

- Logic for part 1 and part 2 is very similar.
- I take the help of the
`get_points`

function to get a list of points between p1 and p2 (supplied as input). By initializing the x and y values to x1 and y1, and iterating over all the points in the middle to get to x2, y2.- The direction of p1 to p2 can be either towards top-right or bottom-left. To consider both the cases together, I used a simple if condition to check x with x2 and y with y2.

- Since there can be repetitions, I have used a
`set()`

instead of a`list`

. We return the points as a list though.

## Part 1

from collections import defaultdict def get_input(): data = [] with open("input.txt") as f: data = f.readlines() return data def get_points(p1, p2): points = set() x1, x2 = p1[0], p2[0] y1, y2 = p1[1], p2[1] if x1 != x2 and y1 != y2: return [] x, y = x1, y1 while (not x == x2) or (not y == y2): points.add((x, y)) if x < x2: x += 1 elif x > x2: x -= 1 if y < y2: y += 1 elif y > y2: y -= 1 points.add((x2, y2)) return list(points) def clean_point(p): return list(map(int, p.split(","))) def solve(data): d = defaultdict(int) for line in data: p1, p2 = line.split(" -> ") p1, p2 = clean_point(p1), clean_point(p2) for point in get_points(p1, p2): d[tuple(point)] += 1 return len([d[point] for point in d if d[point] >= 2]) print(solve(get_input()))

## Part 2

The only change is the removal of the `if x1 != x2 and y1 != y2: return []`

condition, since we can have diagonal lines along with horizontal and vertical ones.

from collections import defaultdict def get_input(): data = [] with open("input.txt") as f: data = f.readlines() return data def get_points(p1, p2): points = set() x1, x2 = p1[0], p2[0] y1, y2 = p1[1], p2[1] x, y = x1, y1 while (not x == x2) or (not y == y2): points.add((x, y)) if x < x2: x += 1 elif x > x2: x -= 1 if y < y2: y += 1 elif y > y2: y -= 1 points.add((x2, y2)) return list(points) def clean_point(p): return list(map(int, p.split(","))) def solve(data): d = defaultdict(int) for line in data: p1, p2 = line.split(" -> ") p1, p2 = clean_point(p1), clean_point(p2) for point in get_points(p1, p2): d[tuple(point)] += 1 return len([d[point] for point in d if d[point] >= 2]) print(solve(get_input()))

### Recommended Posts

##### Reverse integer | InterviewBit | LeetCode | Solution Explained

January 24, 2022