# --- 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()