#### Advent of Code 2020 - Day 3

Day 3 of AoC 2020 (Toboggan Trajectory) is easy enough to solve in any language, but we’re sticking with Python for this. As always, spoilers ahead.

The problem gives us a map description, with `'#'`

describing the location of
trees on integer coordinates, and `'.'`

describing open space. It also states
that the map repeats indefinitely to the right. That is `$ \forall x \in \mathbb{Z}, x_0 = x \mod length$`

, where `$length$`

is the length of the rows in
the input.

Also, we need to find the number of trees when traversing a given slope. Since
all the slopes given have mutually prime `$\Delta x, \Delta y$`

, both are
integers, and at least one of them is `$1$`

, we can calculate the integer nodes
that we’ll end up on by using the following formula - `$x_{i+1} = (x_i + \Delta x) \mod length; x_0 = 0$`

and `$y_{i+1} = (y_i + \Delta y); y_0 = 0 ; y_i < height $`

This can be simply implemented using the code below:

```
with open("input") as datafile:
data = []
for line in datafile:
data.append([x == '#' for x in line.strip()])
def trees(dx, dy):
# Calculate the number of trees for the given slope
x, y = 0, 0
trees = 0
while y < len(data):
trees += int(data[y][x])
x = (x + dx) % len(data[0])
y += 1
return trees
# Part 1, return the trees for 1 slope
print(trees(3, 1))
# Part 2, return the product of trees for all slopes
from functools import reduce
print(reduce(lambda x,y: x*y, (trees(dx, dy) for dx, dy in
[(1, 1), (3, 1), (5, 1), (7, 1), (1, 2)])))
```