Day 4: Ceres Search
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Part 1:
with open('input') as data: lines = [l.strip() for l in data.readlines()] # Remove empty line class Result(): def __init__(self): self.count = 0 def analyze_lines(lines: list[str]): ans.count += get_rights(lines) ans.count += get_ups(lines) ans.count += get_downs(lines) ans.count += get_down_rights(lines) ans.count += get_down_lefts(lines) ans.count += get_up_lefts(lines) ans.count += get_up_rights(lines) for line in lines: ans.count += get_lefts(line) def get_ups(lines: list[str]) -> int: up_count = 0 for i_l, line in enumerate(lines): result = "" if i_l < 3: continue for i_c, char in enumerate(line): if char == "X": result = char result += "".join([lines[i_l - n][i_c] for n in range(1, 4)]) if result == "XMAS": up_count += 1 else: result = "" return up_count def get_downs(lines: list[str]) -> int: down_count = 0 for i_l, l in enumerate(lines): result = "" for i_c, c in enumerate(l): if c == "X": result += c try: result += "".join([lines[i_l + n][i_c] for n in range(1, 4)]) except IndexError: result = "" continue finally: if result == "XMAS": down_count += 1 result = "" return down_count def get_lefts(line: str) -> int: left_count = 0 for i, char in enumerate(line): if i < 3: continue elif char == "X" and line[i-1] == "M" and line[i-2] == "A" and line[i-3] == "S": left_count += 1 return left_count def get_rights(lines: list[str]) -> int: right_counts = 0 for l in lines: right_counts += l.count("XMAS") return right_counts def get_down_rights(lines: list[str]) -> int: down_right_count = 0 for i_l, l in enumerate(lines): result = "" for i_c, c in enumerate(l): if c == "X": result += c try: result += "".join( [lines[i_l + n][i_c + n] for n in range(1,4)] ) except IndexError: result = "" continue finally: if result == "XMAS": down_right_count += 1 result = "" return down_right_count def get_down_lefts(lines: list[str]) -> int: down_left_count = 0 for i_l, l in enumerate(lines): result = "" for i_c, c in enumerate(l): if i_c < 3: continue if c == "X": result += c try: result += "".join( [lines[i_l + n][i_c - n] for n in range(1,4)] ) except IndexError: result = "" continue finally: if result == "XMAS": down_left_count += 1 result = "" return down_left_count def get_up_rights(lines: list[str]) -> int: up_right_count = 0 for i_l, l in enumerate(lines): result = "" if i_l < 3: continue for i_c, c in enumerate(l): if c == "X": result += c try: result += "".join( [lines[i_l - n][i_c + n] for n in range(1,4)] ) except IndexError: result = "" continue finally: if result == "XMAS": up_right_count += 1 result = "" return up_right_count def get_up_lefts(lines: list[str]) -> int: up_left_count = 0 for i_l, l in enumerate(lines): result = "" if i_l < 3: continue for i_c, c in enumerate(l): if i_c < 3: continue if c == "X": result = c try: result += "".join( [lines[i_l - n][i_c - n] for n in range(1,4)] ) except IndexError as e: result = "" continue finally: if result == "XMAS": up_left_count += 1 result = "" return up_left_count ans = Result() analyze_lines(lines) print(ans.count)
Part 2:
with open('input') as data: lines = list(filter(lambda x: x != '', [l.strip() for l in data.readlines()])) xmases = 0 for i in range(1, len(lines)): for j in range(1, len(lines[i])): if lines[i][j] == "A": try: up_back = lines[i-1][j-1] down_over = lines[i+1][j+1] up_over = lines[i-1][j+1] down_back = lines[i+1][j-1] except IndexError: continue else: if {up_back, down_over} == set("MS") and {up_over, down_back} == set("MS"): xmases += 1 print(xmases)
I actually found part two A LOT easier than part 1.