41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
# SPDX-License-Identifier: MIT
|
|
# Copyright (c) 2020 Akumatic
|
|
#
|
|
# https://adventofcode.com/2020/day/3
|
|
|
|
def readFile() -> list:
|
|
with open(f"{__file__.rstrip('code.py')}input.txt", "r") as f:
|
|
return [line[:-1] for line in f.readlines()]
|
|
|
|
def count_trees(vals: list, dx: int, dy: int) -> int:
|
|
x, y, cnt, length, mod = 0, 0, 0, len(vals) - dy, len(vals[0])
|
|
while y < length:
|
|
x = (x + dx) % mod
|
|
y += dy
|
|
if vals[y][x] == "#":
|
|
cnt += 1
|
|
return cnt
|
|
|
|
def part1(vals: list) -> int:
|
|
return count_trees(vals, 3, 1)
|
|
|
|
def part2(vals: list, sol_part1: int) -> int:
|
|
deltas = ((1, 1), (5, 1), (7, 1), (1, 2))
|
|
prod = sol_part1
|
|
for delta in deltas:
|
|
prod *= count_trees(vals, delta[0], delta[1])
|
|
return prod
|
|
|
|
def test():
|
|
test_input = ["..##.......", "#...#...#..", ".#....#..#.",
|
|
"..#.#...#.#", ".#...##..#.", "..#.##.....", ".#.#.#....#",
|
|
".#........#", "#.##...#...", "#...##....#", ".#..#...#.#"]
|
|
assert part1(test_input) == 7
|
|
assert part2(test_input, 7) == 336
|
|
|
|
if __name__ == "__main__":
|
|
test()
|
|
vals = readFile()
|
|
sol_part1 = part1(vals)
|
|
print(f"Part 1: {sol_part1}")
|
|
print(f"Part 2: {part2(vals, sol_part1)}") |