Solution to problem 1 in Python
This commit is contained in:
parent
c3e87163ba
commit
425500c1bc
105
src/Year_2017/P1.py
Normal file
105
src/Year_2017/P1.py
Normal 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()
|
Loading…
x
Reference in New Issue
Block a user