My 2025 Attempts

Day 1

Part 1

import os
import numpy as np

input = open(os.path.join("2025", "day_01", "input_day01.txt")).read().splitlines()

def part1(input):
    input = [x.replace("L", "-") if "L" in x else x.replace("R", "+") for x in input]

    rotations = 50 + np.cumsum([int(x) for x in input])

    dial_number = [
        x - (int(x / 100) * 100) if (np.abs(x) > 99) else x for x in rotations
    ]

    n_zero = int(sum([x + 1 for x in dial_number if x == 0]))

    return n_zero


print(part1(input))
1195
0.005 seconds elapsed

Part 2

import os
import numpy as np

input = open(os.path.join("2025", "day_01", "input_day01.txt")).read().splitlines()

def part2(input):
    instruction = [
        int(x.replace("L", "-")) if "L" in x else int(x.replace("R", "+"))
        for x in input
    ]

    dial_number = 50
    n_zero = 0
    for x in instruction:
        if x > 0:
            n_zero += (dial_number + np.abs(x)) // 100
            dial_number = (dial_number + np.abs(x)) % 100
        else:
            if dial_number == 0:
                n_zero += np.abs(x) // 100
            elif np.abs(x) >= dial_number:
                n_zero += (np.abs(x) - dial_number) // 100 + 1
            dial_number = (dial_number - np.abs(x)) % 100

    return int(n_zero)


print(part2(input))
6770
0.006 seconds elapsed

Day 2

Part 1

import os

input = open(os.path.join("2025", "day_02", "input_day02.txt")).read().split(",")

def part1(input):
    id_ranges = [[int(x) for x in strings.split("-")] for strings in input]

    valid_ids = []
    for min_val, max_val in id_ranges:
        values_in_range = [str(x) for x in list(range(min_val, max_val + 1))]
        valid_ids = valid_ids + [
            x for x in values_in_range if x[: int(len(x) / 2)] == x[int(len(x) / 2) :]
        ]

    sum_of_valid = sum([int(x) for x in valid_ids])

    return sum_of_valid


print(part1(input))
44854383294
0.310 seconds elapsed

Part 2

import os

input = open(os.path.join("2025", "day_02", "input_day02.txt")).read().split(",")

def part2(input):
    id_ranges = [[int(x) for x in strings.split("-")] for strings in input]

    valid_ids = []
    for min_val, max_val in id_ranges:
        values_in_range = [str(x) for x in list(range(min_val, max_val + 1))]
        valid_ids = valid_ids + [x for x in values_in_range if x in (x * 2)[1:-1]]

    sum_of_valid = sum([int(x) for x in valid_ids])

    return sum_of_valid


print(part2(input))
55647141923
0.238 seconds elapsed

Day 3

Part 1

import os

input = open(os.path.join("2025", "day_03", "input_day03.txt")).read().splitlines()

def part1(input):
    total_joltage = 0
    for bank in input:
        list_of_digits = [int(x) for x in bank]

        max_joltage = 0
        for i in range(len(list_of_digits)):
            for j in range(i + 1, len(list_of_digits)):
                max_joltage = max(
                    max_joltage, 10 * list_of_digits[i] + list_of_digits[j]
                )

        total_joltage += max_joltage

    return total_joltage


print(part1(input))
17179
0.029 seconds elapsed

Part 2

import os

input = open(os.path.join("2025", "day_03", "input_day03.txt")).read().splitlines()

def part2(input):
    total_joltage = 0
    for bank in input:
        list_of_digits = [int(x) for x in bank]

        joltage = [[0 for _ in range(12 + 1)] for _ in range(len(list_of_digits) + 1)]

        for i in range(len(list_of_digits)):
            for j in range(12 + 1):
                joltage[i + 1][j] = max(joltage[i + 1][j], joltage[i][j])
                if j < 12:
                    joltage[i + 1][j + 1] = max(
                        joltage[i + 1][j + 1], 10 * joltage[i][j] + list_of_digits[i]
                    )

            total_joltage += joltage[len(list_of_digits)][12]

    return total_joltage


print(part2(input))
170025781683941
0.038 seconds elapsed

Day 4

Day 5

Part 1

import os

input = open(os.path.join("2025", "day_05", "input_day05.txt")).read()

def part1(input):
    ing_ranges, ingr_ids = input.split("\n\n")

    ing_ranges = [[int(y) for y in x.split("-")] for x in ing_ranges.splitlines()]

    ingr_ids = [int(x) for x in ingr_ids.splitlines()]

    fresh_ings = len(
        set([x for x in ingr_ids for y in ing_ranges if (x >= y[0]) & (x <= y[1])])
    )

    return fresh_ings


print(part1(input))
773
0.007 seconds elapsed

Part 2

import os

input = open(os.path.join("2025", "day_05", "input_day05.txt")).read()

def part2(input):
    ing_ranges = input.split("\n\n")[0]
    ing_ranges = sorted(
        [[int(y) for y in x.split("-")] for x in ing_ranges.splitlines()]
    )

    fresh_ing_ids = []
    for min_val, max_val in ing_ranges:
        if not fresh_ing_ids or (fresh_ing_ids[-1][1] < min_val - 1):
            fresh_ing_ids = fresh_ing_ids + [[min_val, max_val]]
        else:
            fresh_ing_ids[-1][1] = max(fresh_ing_ids[-1][1], max_val)

    num_fresh_ings_ids = sum(
        max_val - min_val + 1 for min_val, max_val in fresh_ing_ids
    )

    return num_fresh_ings_ids


print(part2(input))
332067203034711
0.002 seconds elapsed

Day 6

Day 7

Day 8

Day 9

Day 10

Day 11

Day 12