Day 01
# puzzle prompt: https://adventofcode.com/2025/day/1
import time
from ..base.advent import *
class Solution(InputAsLinesSolution):
_year = 2025
_day = 1
_is_debugging = False
def Parse(self, instruction):
direction = -1 if instruction[0] == "L" else 1
steps = int(instruction[1:])
return direction, steps
def GetPasswordInSafe(self, input):
dial = 50 # magic number given by the puzzle
zeroes, clicks = 0, 0
instructions = [self.Parse(rotation) for rotation in input]
for direction, steps in instructions:
# Calculate distance to zero
offset_to_zero = (dial or 100) if direction < 0 else (100 - dial)
# Rotate the dial
dial = (dial + direction * steps) % 100
zeroes += steps == offset_to_zero # exactly zero
# passing/reaching zero
# can be several times
clicks += ((steps - offset_to_zero) // 100 + 1) * (steps >= offset_to_zero)
return zeroes, clicks
def pt1(self, input):
self.debug(input)
res = self.GetPasswordInSafe(input)
return res[0]
def pt2(self, input):
self.debug(input)
res = self.GetPasswordInSafe(input)
return res[1]
# region execute parts
def part_1(self):
start_time = time.time()
res = self.pt1(self.input)
end_time = time.time()
self.solve("1", res, (end_time - start_time))
def part_2(self):
start_time = time.time()
res = self.pt2(self.input)
end_time = time.time()
self.solve("2", res, (end_time - start_time))
# endregion
if __name__ == "__main__":
solution = Solution()
solution.part_1()
solution.part_2()