Solution to problem 4 in Python
This commit is contained in:
parent
4ca17d8ca2
commit
7085b01fd7
96
src/Year_2019/P4.py
Normal file
96
src/Year_2019/P4.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user