Solution to problem 1 in Python

This commit is contained in:
David Doblas Jiménez 2022-02-19 19:30:32 +01:00
parent c3e87163ba
commit 425500c1bc

105
src/Year_2017/P1.py Normal file
View File

@ -0,0 +1,105 @@
# --- Day 1: Inverse Captcha ---
# The night before Christmas, one of Santa's Elves calls you in a panic. "The
# printer's broken! We can't print the Naughty or Nice List!" By the time you
# make it to sub-basement 17, there are only a few minutes until midnight. "We
# have a big problem," she says; "there must be almost fifty bugs in this
# system, but nothing else can print The List. Stand in this square, quick!
# There's no time to explain; if you can convince them to pay you in stars,
# you'll be able to--" She pulls a lever and the world goes blurry.
# When your eyes can focus again, everything seems a lot more pixelated than
# before. She must have sent you inside the computer! You check the system
# clock: 25 milliseconds until midnight. With that much time, you should be
# able to collect all fifty stars by December 25th.
# Collect stars by solving puzzles. Two puzzles will be made available on each
# day millisecond in the Advent calendar; the second puzzle is unlocked when
# you complete the first. Each puzzle grants one star. Good luck!
# You're standing in a room with "digitization quarantine" written in LEDs
# along one wall. The only door is locked, but it includes a small interface.
# "Restricted Area - Strictly No Digitized Users Allowed."
# It goes on to explain that you may only leave by solving a captcha to prove
# you're not a human. Apparently, you only get one millisecond to solve the
# captcha: too fast for a normal human, but it feels like hours to you.
# The captcha requires you to review a sequence of digits (your puzzle input)
# and find the sum of all digits that match the next digit in the list. The
# list is circular, so the digit after the last digit is the first digit in the
# list.
# For example:
# 1122 produces a sum of 3 (1 + 2) because the first digit (1) matches the
# second digit and the third digit (2) matches the fourth digit.
# 1111 produces 4 because each digit (all 1) matches the next.
# 1234 produces 0 because no digit matches the next.
# 91212129 produces 9 because the only digit that matches the next one is
# the last digit, 9.
# What is the solution to your captcha?
with open("files/P1.txt") as f:
digits = [digit for digit in f.read().strip().split()]
def part_1() -> None:
my_lst = iter(digits[0])
captcha = 0
current = next(my_lst)
# until exhausting the list
while (my_next := next(my_lst, None)) is not None:
if current == my_next:
captcha += int(current)
current = my_next
# in case first and last match:
if digits[0][0] == digits[0][-1]:
print(f"The solution (part 1) is {captcha + 1}")
else:
print(f"The solution (part 1) is {captcha}")
# --- Part Two ---
# You notice a progress bar that jumps to 50% completion. Apparently, the door
# isn't yet satisfied, but it did emit a star as encouragement.
# The instructions change:
# Now, instead of considering the next digit, it wants you to consider the
# digit halfway around the circular list. That is, if your list contains 10
# items, only include a digit in your sum if the digit 10/2 = 5 steps forward
# matches it. Fortunately, your list has an even number of elements.
# For example:
# 1212 produces 6: the list contains 4 items, and all four digits match the
# digit 2 items ahead.
# 1221 produces 0, because every comparison is between a 1 and a 2.
# 123425 produces 4, because both 2s match each other, but no other digit
# has a match.
# 123123 produces 12.
# 12131415 produces 4.
# What is the solution to your new captcha?
def part_2() -> None:
list_1 = digits[0]
list_2 = (
digits[0][int(len(digits[0]) / 2) :]
+ digits[0][: int(len(digits[0]) / 2)]
)
captcha = 0
for el1, el2 in zip(list_1, list_2):
if el1 == el2:
captcha += int(el1)
print(f"The solution (part 2) is {captcha}")
if __name__ == "__main__":
part_1()
part_2()