Callista Krebs

Home Projects Contact

Advent of Code - Day 4

< Prev Day Next Day >

Part 1

My Code

with open("day4.txt") as f:
    wordsearch = f.read().split("\n")
    
    count = 0
    for i in range(len(wordsearch)):
        for j in range (len(wordsearch[i])):
            if wordsearch[i][j] == "X":
                left_up = wordsearch[i][j]
                left_down = wordsearch[i][j]
                right_up = wordsearch[i][j]
                right_down = wordsearch[i][j]
                up = wordsearch[i][j]
                down = wordsearch[i][j]
                left = wordsearch[i][j]
                right = wordsearch[i][j]

                for k in range(1,4):
                    if (i - k) >= 0 and (j - k) >= 0:
                        left_up += wordsearch[i - k][j - k] # build string back diagnol
                    
                    if (j - k) >= 0 and (i + k) <= len(wordsearch) - 1:
                        left_down += wordsearch[i + k][j - k]
                    
                    if (i - k) >= 0 and (j + k) <= len(wordsearch[i]) - 1:
                        right_up += wordsearch[i - k][j + k]
                    
                    if (i + k) <= len(wordsearch) - 1 and (j + k) <= len(wordsearch[i]) - 1:
                        right_down += wordsearch[i + k][j + k]
                    
                    if (i - k) >= 0:
                        up += wordsearch[i - k][j]
                    
                    if (i + k) <= len(wordsearch) - 1:
                        down += wordsearch[i + k][j]
                    
                    if (j - k) >= 0:
                        left += wordsearch[i][j - k]
                    
                    if (j + k) <= len(wordsearch[i]) - 1:
                        right += wordsearch[i][j + k]
            
                candidates = [up, down, left, right, left_down, left_up, right_down, right_up]
                count += sum(x == "XMAS" for x in candidates)

print(count)

Chat GPT’s Improved Version

with open("day4.txt") as f:
    wordsearch = f.read().split("\n")
    
rows = len(wordsearch)
cols = len(wordsearch[0]) if rows > 0 else 0

# Define direction vectors: (row_offset, col_offset)
directions = [
    (-1, 0), (1, 0),  # Up, Down
    (0, -1), (0, 1),  # Left, Right
    (-1, -1), (1, 1), # Left-Up, Right-Down
    (-1, 1), (1, -1)  # Right-Up, Left-Down
]

target = "XMAS"
target_length = len(target)
count = 0

for i in range(rows):
    for j in range(cols):
        if wordsearch[i][j] == target[0]:  # Start checking only if the first character matches
            for dr, dc in directions:
                candidate = []
                for k in range(target_length):
                    ni, nj = i + k * dr, j + k * dc
                    if 0 <= ni < rows and 0 <= nj < cols:
                        candidate.append(wordsearch[ni][nj])
                    else:
                        break
                if ''.join(candidate) == target:
                    count += 1

print(count)

Part 2

My Code

with open("day4.txt") as f:
    wordsearch = f.read().split("\n")
    
    count = 0
    for i in range(len(wordsearch)):
        for j in range (len(wordsearch[i])):
            if wordsearch[i][j] == "A":
                if (i - 1) >= 0 and (j - 1) >= 0 and (i + 1) <= len(wordsearch) - 1 and (j + 1) <= len(wordsearch[i]) - 1:
                    left_diag = wordsearch[i - 1][j - 1] + wordsearch[i][j] + wordsearch[i + 1][j + 1]
                    right_diag = wordsearch[i - 1][j + 1] + wordsearch[i][j] + wordsearch[i + 1][j - 1]
                
                    if (left_diag == "SAM" or left_diag == "MAS") and (right_diag == "SAM" or right_diag == "MAS"):
                        count+=1

print(count)

Chat GPT’s Improved Version

with open("day4.txt") as f:
    wordsearch = f.read().split("\n")

rows = len(wordsearch)
cols = len(wordsearch[0]) if rows > 0 else 0

# Define valid patterns for diagonals
valid_patterns = {"SAM", "MAS"}

# Initialize count
count = 0

# Iterate through the grid
for i in range(1, rows - 1):  # Start at 1 and end at rows-2 to avoid out-of-bounds checks
    for j in range(1, cols - 1):  # Similarly, stay within bounds for columns
        if wordsearch[i][j] == "A":  # Only process cells with 'A'
            # Build diagonal strings
            left_diag = wordsearch[i - 1][j - 1] + wordsearch[i][j] + wordsearch[i + 1][j + 1]
            right_diag = wordsearch[i - 1][j + 1] + wordsearch[i][j] + wordsearch[i + 1][j - 1]

            # Check if both diagonals match valid patterns
            if left_diag in valid_patterns and right_diag in valid_patterns:
                count += 1

print(count)

What I Learned

Direction Vectors for Searching a Grid

String Concatenations are Expensive

Better variables naming and simplifications

Better Loop Bounds


Callista Krebs, 2024