Solution to problem 4 in Python

This commit is contained in:
David Doblas Jiménez 2022-02-11 21:17:40 +01:00
parent 4ca17d8ca2
commit 7085b01fd7

96
src/Year_2019/P4.py Normal file
View File

@ -0,0 +1,96 @@
# --- Day 4: Secure Container ---
# You arrive at the Venus fuel depot only to discover it's protected by a
# password. The Elves had written the password on a sticky note, but someone
# threw it out.
# However, they do remember a few key facts about the password:
# It is a six-digit number.
# The value is within the range given in your puzzle input.
# Two adjacent digits are the same (like 22 in 122345).
# Going from left to right, the digits never decrease; they only ever
# increase or stay the same (like 111123 or 135679).
# Other than the range rule, the following are true:
# 111111 meets these criteria (double 11, never decreases).
# 223450 does not meet these criteria (decreasing pair of digits 50).
# 123789 does not meet these criteria (no double).
# How many different passwords within the range given in your puzzle input meet
# these criteria?
with open("files/P4.txt") as f:
a, b = [
int(number)
for line in f.read().strip().split()
for number in line.split("-")
]
def has_double_digits(number: int) -> bool:
number_str = str(number)
for a, b in zip(number_str, number_str[1:]):
if a == b:
return True
return False
def never_decrease(number: int) -> bool:
number_str = str(number)
return all(int(x) <= int(y) for x, y in zip(number_str, number_str[1:]))
def part_1() -> None:
count = 0
for number in range(a, b):
if has_double_digits(number):
if never_decrease(number):
count += 1
print(f"There are {count} different passwords")
# --- Part Two ---
# An Elf just remembered one more important detail: the two adjacent matching
# digits are not part of a larger group of matching digits.
# Given this additional criterion, but still ignoring the range rule, the
# following are now true:
# 112233 meets these criteria because the digits never decrease and all
# repeated digits are exactly two digits long.
# 123444 no longer meets the criteria (the repeated 44 is part of a larger
# group of 444).
# 111122 meets the criteria (even though 1 is repeated more than twice, it
# still contains a double 22).
# How many different passwords within the range given in your puzzle input meet
# all of the criteria?
def extra_detail(number: int) -> bool:
number_str = str(number)
for digit in number_str:
count = number_str.count(digit)
if count == 2:
return True
return False
def part_2() -> None:
count = 0
for number in range(a, b):
if has_double_digits(number):
if never_decrease(number):
if extra_detail(number):
count += 1
print(f"There are {count} different passwords")
if __name__ == "__main__":
part_1()
part_2()