75 lines
2 KiB
Python
75 lines
2 KiB
Python
|
|
"""
|
||
|
|
Work out password
|
||
|
|
"""
|
||
|
|
|
||
|
|
def turn_dial(start_number: int, movement: str) -> tuple[int, int]:
|
||
|
|
"""
|
||
|
|
If L increase numbers, if R decrease numbers
|
||
|
|
"""
|
||
|
|
direction = movement[0]
|
||
|
|
turn = int(movement[1:])
|
||
|
|
remainder = turn % 100
|
||
|
|
times_turned = int(turn / 100)
|
||
|
|
if direction == 'R':
|
||
|
|
new_number = start_number + remainder
|
||
|
|
if new_number > 99:
|
||
|
|
new_number = new_number - 100
|
||
|
|
times_turned += 1
|
||
|
|
else:
|
||
|
|
new_number = start_number - remainder
|
||
|
|
if new_number < 0:
|
||
|
|
new_number = 100 - abs(new_number)
|
||
|
|
if start_number != 0:
|
||
|
|
times_turned += 1
|
||
|
|
elif new_number == 0 and start_number != 0:
|
||
|
|
times_turned += 1
|
||
|
|
|
||
|
|
return new_number, times_turned
|
||
|
|
|
||
|
|
def get_password_1(file_path):
|
||
|
|
password = 0
|
||
|
|
with open(file_path) as in_file:
|
||
|
|
previous_number = 50
|
||
|
|
for line in in_file:
|
||
|
|
previous_number, _ = turn_dial(previous_number, line)
|
||
|
|
if previous_number == 0:
|
||
|
|
password += 1
|
||
|
|
return password
|
||
|
|
|
||
|
|
|
||
|
|
def get_password_2(file_path):
|
||
|
|
password = 0
|
||
|
|
with open(file_path) as in_file:
|
||
|
|
previous_number = 50
|
||
|
|
for line in in_file:
|
||
|
|
previous_number, turns = turn_dial(previous_number, line)
|
||
|
|
password += turns
|
||
|
|
return password
|
||
|
|
|
||
|
|
|
||
|
|
def test_get_password_1():
|
||
|
|
print(get_password_1('input_test.txt'))
|
||
|
|
print(get_password_1('input_day1.txt'))
|
||
|
|
|
||
|
|
|
||
|
|
def test_get_password_2():
|
||
|
|
assert get_password_2('input_test.txt') == 6
|
||
|
|
print(get_password_2('input_day1.txt'))
|
||
|
|
|
||
|
|
|
||
|
|
def test_turn_dial():
|
||
|
|
assert turn_dial(50, 'L68') == (82, 1)
|
||
|
|
assert turn_dial(82, 'L30') == (52, 0)
|
||
|
|
assert turn_dial(52, 'R48') == (0, 1)
|
||
|
|
assert turn_dial(0, 'R100') == (0, 1)
|
||
|
|
assert turn_dial(0, 'R1000') == (0, 10)
|
||
|
|
assert turn_dial(0, 'L100') == (0, 1)
|
||
|
|
assert turn_dial(50, 'R150') == (0, 2)
|
||
|
|
assert turn_dial(0, 'R50') == (50, 0)
|
||
|
|
assert turn_dial(5, 'L10') == (95, 1)
|
||
|
|
assert turn_dial(5, 'L5') == (0, 1)
|
||
|
|
assert turn_dial(0, 'L5') == (95, 0)
|
||
|
|
|
||
|
|
|
||
|
|
|