82 lines
1.8 KiB
Python
Executable File
82 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import sys
|
|
import pathlib
|
|
|
|
def read_input():
|
|
path = pathlib.Path(sys.argv[1]) if len(sys.argv) > 1 else pathlib.Path("input.txt")
|
|
return path.read_text().rstrip("\n")
|
|
|
|
def parse(data):
|
|
return data.splitlines()
|
|
|
|
def part1(data):
|
|
password = 0
|
|
postion = 50
|
|
|
|
for rotation in data:
|
|
direction = rotation[0]
|
|
dist = int(rotation[1:])
|
|
|
|
if direction == "R":
|
|
postion += dist
|
|
else: # left case
|
|
postion -= dist
|
|
postion %= 100
|
|
if postion == 0:
|
|
password += 1
|
|
|
|
return password
|
|
|
|
def part2(data):
|
|
password = 0
|
|
pos = 50
|
|
modulo = 100
|
|
|
|
for rotation in data:
|
|
direction = rotation[0]
|
|
num = int(rotation[1:])
|
|
old_pos = pos
|
|
|
|
if direction == 'L':
|
|
pos -= num
|
|
else:
|
|
pos += num
|
|
|
|
if old_pos != pos:
|
|
old = old_pos
|
|
new = pos
|
|
if old < new:
|
|
first = (old // modulo + 1) * modulo
|
|
last = (new // modulo) * modulo
|
|
if first <= new:
|
|
crosses = (last - first) // modulo + 1
|
|
else:
|
|
crosses = 0
|
|
else:
|
|
if new % modulo == 0:
|
|
first = new
|
|
else:
|
|
first = (new // modulo + 1) * modulo
|
|
last = ((old - 1) // modulo) * modulo
|
|
if first <= last:
|
|
crosses = (last - first) // modulo + 1
|
|
else:
|
|
crosses = 0
|
|
else:
|
|
crosses = 0
|
|
|
|
password += crosses
|
|
|
|
return password
|
|
|
|
def main():
|
|
raw = read_input()
|
|
data = parse(raw)
|
|
r1 = part1(data)
|
|
r2 = part2(data)
|
|
print(r1)
|
|
print(r2)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|